From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <1b89f632938db085db4f9b3fa706bc5e@proxima.alt.za> To: 9fans@9fans.net Date: Tue, 2 Sep 2014 10:27:56 +0200 From: lucio@proxima.alt.za In-Reply-To: <02adc2378671d0fb6129e699821979e0@quintile.net> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: Re: [9fans] silly question Topicbox-Message-UUID: 1475c5f6-ead9-11e9-9d60-3106f5b1d025 > gawk has date, strftime and mktime but Brian's does not. I hacked a version of strftime() for my own use, I don't know if it helps. It may not be the very latest version, I keep messing with it: #include #include static char *awday[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static char *wday[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; static char *amon[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; static char *mon[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; static char *ampm[2] = {"AM", "PM"}; static char *tz[2] = {"EST", "EDT"}; static int jan1(int); static char *strval(char *, char *, char **, int, int); static char *dval(char *, char *, int, int); long strftime (char *s, long maxsize, const char *format, const Tm *t) { char *sp, *se, *fp; int i; sp = s; se = s+maxsize; for(fp=(char *)format; *fp && spwday, 7); break; case 'A': sp = strval(sp, se, wday, t->wday, 7); break; case 'b': sp = strval(sp, se, amon, t->mon, 12); break; case 'B': sp = strval(sp, se, mon, t->mon, 12); break; case 'c': sp += strftime(sp, se-sp, "%a %b %d %H:%M:%S %Y", t); break; case 'd': sp = dval(sp, se, t->mday, 2); break; case 'H': sp = dval(sp, se, t->hour, 2); break; case 'I': i = t->hour; if(i == 0) i = 12; else if(i > 12) i -= 12; sp = dval(sp, se, i, 2); break; case 'j': sp = dval(sp, se, t->yday+1, 3); break; case 'm': sp = dval(sp, se, t->mon+1, 2); break; case 'M': sp = dval(sp, se, t->min, 2); break; case 'p': i = (t->hour < 12)? 0 : 1; sp = strval(sp, se, ampm, i, 2); break; case 'S': sp = dval(sp, se, t->sec, 2); break; case 'U': i = 7-jan1(t->year); if(i == 7) i = 0; /* Now i is yday number of first sunday in year */ if(t->yday < i) i = 0; else i = (t->yday-i)/7 + 1; sp = dval(sp, se, i, 2); break; case 'w': sp = dval(sp, se, t->wday, 1); break; case 'W': i = 8-jan1(t->year); if(i >= 7) i -= 7; /* Now i is yday number of first monday in year */ if(t->yday < i) i = 0; else i = (t->yday-i)/7 + 1; sp = dval(sp, se, i, 2); break; case 'x': sp += strftime(sp, se-sp, "%a %b %d, %Y", t); break; case 'X': sp += strftime(sp, se-sp, "%H:%M:%S", t); break; case 'y': sp = dval(sp, se, t->year%100, 2); break; case 'Y': sp = dval(sp, se, t->year+1900, 4); break; case 'Z': /* hack for now: assume eastern time zone */ i = /* t->isdst? 1 : */ 0; sp = strval(sp, se, tz, i, 2); break; case 0: fp--; /* stop loop after next fp incr */ break; default: *sp++ = *fp; } } if(*fp) sp = s; /* format string didn't end: no room for conversion */ if(sp=alen){ *start = '?'; return start+1; } n = strlen(array[index]); if(n > end-start) n = end-start; memcpy(start, array[index], n); return start+n; } static char * dval(char *start, char *end, int val, int width) { char *p; if(val<0 || end-start=start){ *p-- = val%10 + '0'; val /= 10; } if(val>0) *start = '*'; return start+width; } /* * return day of the week * of jan 1 of given year */ static int jan1(int yr) { int y, d; /* * normal gregorian calendar * one extra day per four years */ y = yr+1900; d = 4+y+(y+3)/4; /* * julian calendar * regular gregorian * less three days per 400 */ if(y > 1800) { d -= (y-1701)/100; d += (y-1601)/400; } /* * great calendar changeover instant */ if(y > 1752) d += 3; return(d%7); }