/* newlib/libc/time/strftime.c %z format STC */ #include #include #include #define TZ "TZ=NZST-12NZDT,M9.5.0,M4.1.0/3" #define DFMT "%04d-%02d-%02d %03d %-3d %02d:%02d%+03ld00%s(%s)\t%s\n" //:%02d #define TFMT "%F %j %a %R%z (%Z)" #define EPOCH 1970 #define YADD 1900 #define MADD 1 #define DADD 1 #define YR_MTH 12 #define MTH_DAY 30 #define DAY_HR 24 #define HR_MIN 60 #define MIN_S 60 #define HR_S (HR_MIN*MIN_S) /* extra is total days over 30 in preceding months - net total 5/year */ #define S(extra,yr,mth,day,hr) \ ((((((yr) - EPOCH)*YR_MTH + ((mth) - 1))*MTH_DAY + (extra) + (day) - 1)\ *DAY_HR + (hr))*HR_S) int dump( struct tm* tp, char *label) { return printf( DFMT, tp->tm_year + YADD, tp->tm_mon + MADD, tp->tm_mday, tp->tm_yday + DADD, tp->tm_wday, tp->tm_hour, tp->tm_min, // tp->tm_sec, # ifdef __TM_GMTOFF tp->__TM_GMTOFF/HR_S, # elif __USE_BSD tp->tm_gmtoff/HR_S, # else tp->__tm_gmtoff/HR_S, # endif tp->tm_isdst < 0 ? "?" : tp->tm_isdst ? "d" : "s", # ifdef __TM_ZONE tp->__TM_ZONE, # elif __USE_BSD tp->tm_zone, # else tp->__tm_zone, # endif label ); } int test( time_t tt ) { char ss[BUFSIZ] = ""; struct tm * tp; size_t st; int rc; if (EOF == (rc = puts( "" ))) return 5; if (!(tp = gmtime( &tt ))) return 1; if ((rc = dump( tp, "gm" )) <= 0) return -rc; if (!(tp = localtime( &tt ))) return 2; if ((rc = dump( tp, "local" )) <= 0) return -rc; if (-1 == (tt = mktime( tp ))) return 3; if ((rc = dump( tp, "mk" )) <= 0) return -rc; if ((st = strftime( ss, sizeof ss, TFMT, tp)) <= 0) return 4; if (EOF == (rc = puts( ss ))) return 5; return 0; } int main( void ) { int rc; if ((rc = putenv( TZ ))) return rc; if (EOF == (rc = puts( getenv( "TZ" )))) return 6; /* extra year m day hour */ if ((rc = test( S( 0, 1970, 1, 1, 0)))) return rc; if ((rc = test( S( 0, 1970, 4, 4, 13)))) return rc; if ((rc = test( S( 0, 1970, 4, 4, 14)))) return rc; if ((rc = test( S( 3, 1970, 9, 26, 13)))) return rc; if ((rc = test( S( 3, 1970, 9, 26, 14)))) return rc; if ((rc = test( S( 5, 1971, 1, 1, 0)))) return rc; if ((rc = test( S( 5, 1971, 4, 3, 13)))) return rc; if ((rc = test( S( 5, 1971, 4, 3, 14)))) return rc; return rc; }