diff options
Diffstat (limited to 'libc/misc/time')
-rw-r--r-- | libc/misc/time/asc_conv.c | 76 |
1 files changed, 48 insertions, 28 deletions
diff --git a/libc/misc/time/asc_conv.c b/libc/misc/time/asc_conv.c index 9f8c25844..78339dd6c 100644 --- a/libc/misc/time/asc_conv.c +++ b/libc/misc/time/asc_conv.c @@ -5,43 +5,63 @@ * Internal ascii conversion routine, avoid use of printf, it's a bit big! */ - -static void hit(buf, val) -char *buf; -int val; -{ - *buf = '0' + val % 10; -} +/* + * Modified Manuel Novoa III Jan 2001 + * + * Removed static function "hit" and did time-field fills inline and + * put day, hour, min, and sec conversions in a loop using a small + * table to reduce code size. + * + * Made daysp[] and mons[] const to move them from bss to text. + * + * Also fixed day conversion ... ANSI says no leading 0. + * + */ void __asctime(buffer, ptm) register char *buffer; struct tm *ptm; { - static char days[] = "SunMonTueWedThuFriSat"; - static char mons[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; - int year; + static const char days[] = "SunMonTueWedThuFriSat"; + static const char mons[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; + /* 012345678901234567890123456 */ + static const char template[] = "Err Err 00 00:00:00 0000\n"; + int tm_field[4]; + int tmp, i; + char *p; + + /* Since we need memcpy below, use it here instead of strcpy. */ + memcpy(buffer, template, sizeof(template)); - /* 012345678901234567890123456 */ - strcpy(buffer, "Err Err .. ..:..:.. ....\n"); - if ((ptm->tm_wday >= 0) && (ptm->tm_wday <= 6)) + if ((ptm->tm_wday >= 0) && (ptm->tm_wday <= 6)) { memcpy(buffer, days + 3 * (ptm->tm_wday), 3); + } - if ((ptm->tm_mon >= 0) && (ptm->tm_mon <= 11)) + if ((ptm->tm_mon >= 0) && (ptm->tm_mon <= 11)) { memcpy(buffer + 4, mons + 3 * (ptm->tm_mon), 3); + } + + tm_field[0] = ptm->tm_mday; + tm_field[1] = ptm->tm_hour; + tm_field[2] = ptm->tm_min; + tm_field[3] = ptm->tm_sec; + + p = buffer + 9; + for (i=0 ; i<4 ; i++) { + tmp = tm_field[i]; + *p-- += tmp % 10; + *p += (tmp/10) % 10; + p += 4 ; /* skip to end of next field */ + } + tmp = ptm->tm_year + 1900; + p = buffer + 23; + for (i=0 ; i<4 ; i++) { + *p-- += tmp % 10; + tmp /= 10; + } - hit(buffer + 8, ptm->tm_mday / 10); - hit(buffer + 9, ptm->tm_mday); - hit(buffer + 11, ptm->tm_hour / 10); - hit(buffer + 12, ptm->tm_hour); - hit(buffer + 14, ptm->tm_min / 10); - hit(buffer + 15, ptm->tm_min); - hit(buffer + 17, ptm->tm_sec / 10); - hit(buffer + 18, ptm->tm_sec); - - year = ptm->tm_year + 1900; - hit(buffer + 20, year / 1000); - hit(buffer + 21, year / 100); - hit(buffer + 22, year / 10); - hit(buffer + 23, year); + if (buffer[8] == '0') { + buffer[8] = ' '; + } } |