| #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 | #include <time.h> | 
 |  | 
 |  | 
 | static int | 
 | do_bz18985 (void) | 
 | { | 
 |   char buf[1000]; | 
 |   struct tm ttm; | 
 |   int rc, ret = 0; | 
 |  | 
 |   memset (&ttm, 1, sizeof (ttm)); | 
 |   ttm.tm_zone = NULL;  /* Dereferenced directly if non-NULL.  */ | 
 |   rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); | 
 |  | 
 |   if (rc == 66) | 
 |     { | 
 |       const char expected[] | 
 | 	= "? ? ? ? ? ? 16843009 16843009:16843009:16843009 16844909 +467836 ?"; | 
 |       if (0 != strcmp (buf, expected)) | 
 | 	{ | 
 | 	  printf ("expected:\n  %s\ngot:\n  %s\n", expected, buf); | 
 | 	  ret += 1; | 
 | 	} | 
 |     } | 
 |   else | 
 |     { | 
 |       printf ("expected 66, got %d\n", rc); | 
 |       ret += 1; | 
 |     } | 
 |  | 
 |   /* Check negative values as well.  */ | 
 |   memset (&ttm, 0xFF, sizeof (ttm)); | 
 |   ttm.tm_zone = NULL;  /* Dereferenced directly if non-NULL.  */ | 
 |   rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); | 
 |  | 
 |   if (rc == 30) | 
 |     { | 
 |       const char expected[] = "? ? ? ? ? ? -1 -1:-1:-1 1899  "; | 
 |       if (0 != strcmp (buf, expected)) | 
 | 	{ | 
 | 	  printf ("expected:\n  %s\ngot:\n  %s\n", expected, buf); | 
 | 	  ret += 1; | 
 | 	} | 
 |     } | 
 |   else | 
 |     { | 
 |       printf ("expected 30, got %d\n", rc); | 
 |       ret += 1; | 
 |     } | 
 |  | 
 |   return ret; | 
 | } | 
 |  | 
 | 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 int | 
 | do_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 + do_bz18985 (); | 
 | } | 
 |  | 
 | #define TEST_FUNCTION do_test () | 
 | #include "../test-skeleton.c" |