Annotation of coherent/b/lib/libc/to_add/strftime.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * libc/gen/strftime.c
                      3:  * C standard date and time library.
                      4:  * strftime()
                      5:  * ANSI 4.12.3.5.
                      6:  * "C" locale-specific time and date formatting,
                      7:  * with the locale-dependent stuff wired in here.
                      8:  * Special thanks to the ANSI committee for this marvelous idea.
                      9:  */
                     10: 
                     11: #include <stddef.h>
                     12: #include <string.h>
                     13: #include <time.h>
                     14: 
                     15: /* Forward. */
                     16: static char *toasc();
                     17: static char *convert();
                     18: 
                     19: /* Static data. */
                     20: static const char *weekdays[] = {
                     21:  "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
                     22: };
                     23: static const char *months[] = {
                     24:  "January", "February", "March", "April", "May", "June",
                     25:  "July", "August", "September", "October", "November", "December"
                     26: };
                     27: 
                     28: size_t
                     29: strftime(s, maxsize, format, timeptr)
                     30: char *s;
                     31: size_t maxsize;
                     32: const char *format;
                     33: const struct tm *timeptr;
                     34: {
                     35:        register size_t nchars, i;
                     36:        register int j;
                     37:        register char *x;
                     38:        char c;
                     39: 
                     40:        for (nchars = 0; ; ) {
                     41:                if ((c = *format++) != '%') {
                     42:                        if (++nchars > maxsize)
                     43:                                return 0;
                     44:                        *s++ = c;
                     45:                        if (c == '\0')
                     46:                                return --nchars;
                     47:                } else {
                     48: 
                     49:                        /* Perform a conversion. */
                     50:                        x = NULL;
                     51:                        switch (c = *format++) {
                     52: 
                     53:                        case 'a':
                     54:                        case 'A':
                     55:                                x = weekdays[timeptr->tm_wday];
                     56:                                i = (c == 'a') ? 3 : strlen(x);
                     57:                                break;
                     58: 
                     59:                        case 'b':
                     60:                        case 'B':
                     61:                                x = months[timeptr->tm_mon];
                     62:                                i = (c == 'b') ? 3 : strlen(x);
                     63:                                break;
                     64: 
                     65:                        case 'c':
                     66:                                x = asctime(timeptr);
                     67:                                i = 24;                 /* suppress the '\n' */
                     68:                                break;
                     69: 
                     70:                        case 'd':
                     71:                                j = timeptr->tm_mday;
                     72:                                i = 2;
                     73:                                break;
                     74: 
                     75:                        case 'H':
                     76:                                j = timeptr->tm_hour;
                     77:                                i = 2;
                     78:                                break;
                     79: 
                     80:                        case 'I':
                     81:                                if ((j = timeptr->tm_hour % 12) == 0)
                     82:                                        j = 12;
                     83:                                i = 2;
                     84:                                break;
                     85: 
                     86:                        case 'j':
                     87:                                j = timeptr->tm_yday + 1;
                     88:                                i = 3;
                     89:                                break;
                     90: 
                     91:                        case 'm':
                     92:                                j = timeptr->tm_mon + 1;
                     93:                                i = 2;
                     94:                                break;
                     95: 
                     96:                        case 'M':
                     97:                                j = timeptr->tm_min;
                     98:                                i = 2;
                     99:                                break;
                    100: 
                    101:                        case 'p':
                    102:                                x = (timeptr->tm_hour) < 12 ? "AM" : "PM";
                    103:                                i = 2;
                    104:                                break;
                    105: 
                    106:                        case 'S':
                    107:                                j = timeptr->tm_sec;
                    108:                                i = 2;
                    109:                                break;
                    110: 
                    111:                        case 'U':
                    112:                                j = (timeptr->tm_yday + 7 - timeptr->tm_wday) / 7;
                    113:                                i = 2;
                    114:                                break;
                    115: 
                    116:                        case 'w':
                    117:                                j = (timeptr->tm_yday + 8 - timeptr->tm_wday) / 7;
                    118:                                if (timeptr->tm_wday == 0)
                    119:                                        --j;
                    120:                                i = 2;
                    121:                                break;
                    122: 
                    123:                        case 'W':
                    124:                                j = timeptr->tm_wday;
                    125:                                i = 1;
                    126:                                break;
                    127: 
                    128:                        case 'x':
                    129:                                x = convert(timeptr->tm_mon+1,
                    130:                                            timeptr->tm_mday,
                    131:                                            timeptr->tm_year,
                    132:                                            '/');
                    133:                                i = 8;
                    134:                                break;
                    135: 
                    136:                        case 'X':
                    137:                                x = convert(timeptr->tm_hour,
                    138:                                            timeptr->tm_min,
                    139:                                            timeptr->tm_sec,
                    140:                                            ':');
                    141:                                i = 8;
                    142:                                break;
                    143: 
                    144:                        case 'y':
                    145:                                j = timeptr->tm_year;
                    146:                                i = 2;
                    147:                                break;
                    148: 
                    149:                        case 'Y':
                    150:                                j = timeptr->tm_year + 1900;
                    151:                                i = 4;
                    152:                                break;
                    153: 
                    154:                        case 'z':
                    155:                                x = &tzname[(timeptr->tm_isdst==1) ? 1 :0][0];
                    156:                                i = strlen(x);
                    157:                                break;
                    158: 
                    159:                        /* Default case has undefined behavior. */
                    160:                        /* This copies the given character, e.g. "%e" copies "e". */
                    161:                        case '%':
                    162:                        default:
                    163:                                x = &c;
                    164:                                i = 1;
                    165:                                break;
                    166:                        }
                    167: 
                    168:                        /* Convert j to i ASCII digits if necessary. */
                    169:                        if (x == NULL)
                    170:                                x = toasc(j, i);
                    171: 
                    172:                        /* Copy i characters from x to the result string. */
                    173:                        /* If nchars+i == maxsize, there will be no room for NUL. */
                    174:                        if ((nchars += i) >= maxsize)
                    175:                                return 0;
                    176:                        strncpy(s, x, i);
                    177:                        s += i;
                    178:                }
                    179:        }
                    180: }
                    181: 
                    182: /*
                    183:  * Convert i to n ASCII decimal digits.
                    184:  */
                    185: static
                    186: char *
                    187: toasc(i, n) register unsigned int i, n;
                    188: {
                    189:        static char *buf[6];
                    190:        char *cp;
                    191: 
                    192:        cp = &buf[5];
                    193:        *cp = '\0';
                    194:        while (n--) {
                    195:                *--cp = '0' + (i % 10);
                    196:                i /= 10;
                    197:        }
                    198:        return cp;
                    199: }
                    200: 
                    201: /*
                    202:  * Convert a time or date to "hh:mm:ss" or "mm/dd/yy".
                    203:  * The result is not NUL-terminated.
                    204:  */
                    205: static
                    206: char *
                    207: convert(i1, i2, i3, sep) int i1, i2, i3, sep;
                    208: {
                    209:        static char buf[8];
                    210:        register char *s;
                    211: 
                    212:        s = &buf[0];
                    213:        *s++ = '0' + i1 / 10;
                    214:        *s++ = '0' + i1 % 10;
                    215:        *s++ = sep;
                    216:        *s++ = '0' + i2 / 10;
                    217:        *s++ = '0' + i2 % 10;
                    218:        *s++ = sep;
                    219:        *s++ = '0' + i3 / 10;
                    220:        *s++ = '0' + i3 % 10;
                    221:        return buf;
                    222: }
                    223: 
                    224: /* end of libc/gen/strftime.c */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.