| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | #include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>static struct{  const char *fmt;  size_t min;  size_t max;} tests[] =  {    { "%2000Y", 2000, 4000 },    { "%02000Y", 2000, 4000 },    { "%_2000Y", 2000, 4000 },    { "%-2000Y", 2000, 4000 },  };#define ntests (sizeof (tests) / sizeof (tests[0]))static intdo_test (void){  size_t cnt;  int result = 0;  time_t tnow = time (NULL);  struct tm *now = localtime (&tnow);  for (cnt = 0; cnt < ntests; ++cnt)    {      size_t size = 0;      int res;      char *buf = NULL;      do	{	  size += 500;	  buf = (char *) realloc (buf, size);	  if (buf == NULL)	    {	      puts ("out of memory");	      exit (1);	    }	  res = strftime (buf, size, tests[cnt].fmt, now);	  if (res != 0)	    break;	}      while (size < tests[cnt].max);      if (res == 0)	{	  printf ("%Zu: %s: res == 0 despite size == %Zu\n",		  cnt, tests[cnt].fmt, size);	  result = 1;	}      else if (size < tests[cnt].min)	{	  printf ("%Zu: %s: size == %Zu was enough\n",		  cnt, tests[cnt].fmt, size);	  result = 1;	}      else	printf ("%Zu: %s: size == %Zu: OK\n", cnt, tests[cnt].fmt, size);      free (buf);    }  struct tm ttm =    {      /* Initialize the fields which are needed in the tests.  */      .tm_mday = 1,      .tm_hour = 2    };  const struct  {    const char *fmt;    const char *exp;    size_t n;  } ftests[] =    {      { "%-e", "1", 1 },      { "%-k", "2", 1 },      { "%-l", "2", 1 },    };#define nftests (sizeof (ftests) / sizeof (ftests[0]))  for (cnt = 0; cnt < nftests; ++cnt)    {      char buf[100];      size_t r = strftime (buf, sizeof (buf), ftests[cnt].fmt, &ttm);      if (r != ftests[cnt].n)	{	  printf ("strftime(\"%s\") returned %zu not %zu\n",		  ftests[cnt].fmt, r, ftests[cnt].n);	  result = 1;	}      if (strcmp (buf, ftests[cnt].exp) != 0)	{	  printf ("strftime(\"%s\") produced \"%s\" not \"%s\"\n",		  ftests[cnt].fmt, buf, ftests[cnt].exp);	  result = 1;	}    }  return result;}#define TEST_FUNCTION do_test ()#include "../test-skeleton.c"
 |