scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

0075-strftime.c (3068B)


      1 /*
      2 output:
      3 testing
      4 done
      5 end:
      6 */
      7 
      8 #include <stdio.h>
      9 #include <stdlib.h>
     10 #include <time.h>
     11 
     12 static struct tm *tm;
     13 static time_t t;
     14 static char buf[256];
     15 
     16 void
     17 testval(const char *fmt, size_t siz, size_t expect)
     18 {
     19 	size_t r;
     20 
     21 	r = strftime(buf, siz, fmt, tm);
     22 	if (r != expect) {
     23 		printf("test failed, fmt=%s, siz=%zu, result=%zu, expected=%zu\n",
     24 		        fmt, siz, r, expect);
     25 		exit(1);
     26 	}
     27 }
     28 
     29 int
     30 main(void)
     31 {
     32 	puts("testing");
     33 	t = time(NULL);
     34 	if (t == (time_t)-1)
     35 		return 1;
     36 
     37 	tm = gmtime(&t);
     38 	if (tm == NULL)
     39 		return 1;
     40 
     41 	/* "GMT" */
     42 	testval("%Z", sizeof(buf), 3);
     43 	testval("%Z", 4, 3); /* fit exactly */
     44 	testval("%Z", 3, 0); /* too small */
     45 	testval("%Z", 2, 0); /* too small */
     46 
     47 	testval("%Y", sizeof(buf), 4);
     48 	testval("%Y", 5, 4); /* fit exactly */
     49 	testval("%Y", 4, 0); /* too small */
     50 	testval("%Y", 2, 0); /* too small */
     51 
     52 	testval("%G", sizeof(buf), 4);
     53 	testval("%G", 5, 4); /* fit exactly */
     54 	testval("%G", 4, 0); /* too small */
     55 	testval("%G", 2, 0); /* too small */
     56 
     57 	testval("%%", sizeof(buf), 1);
     58 	testval("%%", 2, 1); /* fit exactly */
     59 	testval("%%", 1, 0); /* too small */
     60 	testval("%%", 0, 0); /* too small */
     61 
     62 	testval("%d", sizeof(buf), tm->tm_mday > 10 ? 2 : 1);
     63 	testval("%d", tm->tm_mday > 10 ? 3 : 2, tm->tm_mday > 10 ? 2 : 1); /* fit exactly */
     64 	testval("%d", tm->tm_mday > 10 ? 2 : 1, 0); /* too small */
     65 	testval("%d", 0, 0); /* too small */
     66 
     67 	testval("abc", sizeof(buf), 3);
     68 	testval("abc", 4, 3); /* fit exactly */
     69 	testval("abc", 3, 0); /* too small */
     70 	testval("abc", 0, 0); /* too small */
     71 
     72 	testval("%t", sizeof(buf), 1);
     73 	testval("%t", 2, 1); /* fit exactly */
     74 	testval("%t", 1, 0); /* too small */
     75 	testval("%t", 0, 0); /* too small */
     76 
     77 	/* "AM" or "PM" */
     78 	testval("%p", sizeof(buf), 2);
     79 	testval("%p", 3, 2); /* fit exactly */
     80 	testval("%p", 2, 0); /* too small */
     81 	testval("%p", 0, 0); /* too small */
     82 
     83 	testval("", sizeof(buf), 0);
     84 	testval("", 1, 0); /* fit exactly */
     85 	testval("", 0, 0); /* too small */
     86 
     87 	/* weekday */
     88 	testval("%w", sizeof(buf), 1);
     89 	testval("%w", 2, 1); /* fit exactly */
     90 	testval("%w", 1, 0); /* too small */
     91 	testval("%w", 0, 0); /* too small */
     92 
     93 	/* same as "%Y-%m-%d", recursive */
     94 	testval("%F", sizeof(buf), 10);
     95 	testval("%F", 11, 10); /* fit exactly */
     96 	testval("%F", 10, 0); /* too small */
     97 	testval("%F", 0, 0); /* too small */
     98 
     99 	/* week number of the year, monday of first year, padded with '0', 0-53 */
    100 	tm->tm_yday = 1;
    101 	testval("%W", sizeof(buf), 2);
    102 	testval("%W", 3, 2); /* fit exactly */
    103 	testval("%W", 2, 0); /* too small */
    104 	testval("%W", 0, 0); /* too small */
    105 
    106 	/* week number of the year, padded with '0' */
    107 	tm->tm_yday = 1; /* 1 */
    108 	tm->tm_mon = 0; /* january */
    109 	tm->tm_year = 122; /* 2022 */
    110 	tm->tm_wday = 6; /* saturday */
    111 	testval("%V", sizeof(buf), 2);
    112 	testval("%V", 3, 2); /* fit exactly */
    113 	testval("%V", 2, 0); /* too small */
    114 	testval("%V", 0, 0); /* too small */
    115 
    116 	tm->tm_wday = 10;
    117 	testval("%w", sizeof(buf), 1);
    118 	testval("%w", 2, 1); /* fit exactly */
    119 	testval("%w", 1, 0); /* too small */
    120 	testval("%w", 0, 0); /* too small */
    121 	puts("done");
    122 
    123 	return 0;
    124 }