#include #include #include #include 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"