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