mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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 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;
 | |
| }
 | |
| 
 | |
| #define TEST_FUNCTION do_test ()
 | |
| #include "../test-skeleton.c"
 |