Annotation of 3BSD/libc/gen/ctime.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * This routine converts time as follows.
                      3:  * The epoch is 0000 Jan 1 1970 GMT.
                      4:  * The argument time is in seconds since then.
                      5:  * The localtime(t) entry returns a pointer to an array
                      6:  * containing
                      7:  *  seconds (0-59)
                      8:  *  minutes (0-59)
                      9:  *  hours (0-23)
                     10:  *  day of month (1-31)
                     11:  *  month (0-11)
                     12:  *  year-1970
                     13:  *  weekday (0-6, Sun is 0)
                     14:  *  day of the year
                     15:  *  daylight savings flag
                     16:  *
                     17:  * The routine calls the system to determine the local
                     18:  * timezone and whether Daylight Saving Time is permitted locally.
                     19:  * (DST is then determined by the current US standard rules)
                     20:  * There is a table that accounts for the peculiarities
                     21:  * undergone by daylight time in 1974-1975.
                     22:  *
                     23:  * The routine does not work
                     24:  * in Saudi Arabia which runs on Solar time.
                     25:  *
                     26:  * asctime(tvec))
                     27:  * where tvec is produced by localtime
                     28:  * returns a ptr to a character string
                     29:  * that has the ascii time in the form
                     30:  *     Thu Jan 01 00:00:00 1970n0\\
                     31:  *     01234567890123456789012345
                     32:  *     0         1         2
                     33:  *
                     34:  * ctime(t) just calls localtime, then asctime.
                     35:  */
                     36: 
                     37: #include <time.h>
                     38: #include <sys/types.h>
                     39: #include <sys/timeb.h>
                     40: 
                     41: static char    cbuf[26];
                     42: static int     dmsize[12] =
                     43: {
                     44:        31,
                     45:        28,
                     46:        31,
                     47:        30,
                     48:        31,
                     49:        30,
                     50:        31,
                     51:        31,
                     52:        30,
                     53:        31,
                     54:        30,
                     55:        31
                     56: };
                     57: 
                     58: /*
                     59:  * The following table is used for 1974 and 1975 and
                     60:  * gives the day number of the first day after the Sunday of the
                     61:  * change.
                     62:  */
                     63: static struct {
                     64:        int     daylb;
                     65:        int     dayle;
                     66: } daytab[] = {
                     67:        5,      333,    /* 1974: Jan 6 - last Sun. in Nov */
                     68:        58,     303,    /* 1975: Last Sun. in Feb - last Sun in Oct */
                     69: };
                     70: 
                     71: struct tm      *gmtime();
                     72: char           *ct_numb();
                     73: struct tm      *localtime();
                     74: char   *ctime();
                     75: char   *ct_num();
                     76: char   *asctime();
                     77: 
                     78: char *
                     79: ctime(t)
                     80: long *t;
                     81: {
                     82:        return(asctime(localtime(t)));
                     83: }
                     84: 
                     85: struct tm *
                     86: localtime(tim)
                     87: long *tim;
                     88: {
                     89:        register int dayno;
                     90:        register struct tm *ct;
                     91:        register daylbegin, daylend;
                     92:        long copyt;
                     93:        struct timeb systime;
                     94: 
                     95:        ftime(&systime);
                     96:        copyt = *tim - (long)systime.timezone*60;
                     97:        ct = gmtime(&copyt);
                     98:        dayno = ct->tm_yday;
                     99:        daylbegin = 119;        /* last Sun in Apr */
                    100:        daylend = 303;          /* Last Sun in Oct */
                    101:        if (ct->tm_year==74 || ct->tm_year==75) {
                    102:                daylbegin = daytab[ct->tm_year-74].daylb;
                    103:                daylend = daytab[ct->tm_year-74].dayle;
                    104:        }
                    105:        daylbegin = sunday(ct, daylbegin);
                    106:        daylend = sunday(ct, daylend);
                    107:        if (systime.dstflag &&
                    108:            (dayno>daylbegin || (dayno==daylbegin && ct->tm_hour>=2)) &&
                    109:            (dayno<daylend || (dayno==daylend && ct->tm_hour<1))) {
                    110:                copyt += 1*60*60;
                    111:                ct = gmtime(&copyt);
                    112:                ct->tm_isdst++;
                    113:        }
                    114:        return(ct);
                    115: }
                    116: 
                    117: /*
                    118:  * The argument is a 0-origin day number.
                    119:  * The value is the day number of the first
                    120:  * Sunday on or after the day.
                    121:  */
                    122: static
                    123: sunday(t, d)
                    124: register struct tm *t;
                    125: register int d;
                    126: {
                    127:        if (d >= 58)
                    128:                d += dysize(t->tm_year) - 365;
                    129:        return(d - (d - t->tm_yday + t->tm_wday + 700) % 7);
                    130: }
                    131: 
                    132: struct tm *
                    133: gmtime(tim)
                    134: long *tim;
                    135: {
                    136:        register int d0, d1;
                    137:        long hms, day;
                    138:        register int *tp;
                    139:        static struct tm xtime;
                    140: 
                    141:        /*
                    142:         * break initial number into days
                    143:         */
                    144:        hms = *tim % 86400;
                    145:        day = *tim / 86400;
                    146:        if (hms<0) {
                    147:                hms += 86400;
                    148:                day -= 1;
                    149:        }
                    150:        tp = (int *)&xtime;
                    151: 
                    152:        /*
                    153:         * generate hours:minutes:seconds
                    154:         */
                    155:        *tp++ = hms%60;
                    156:        d1 = hms/60;
                    157:        *tp++ = d1%60;
                    158:        d1 /= 60;
                    159:        *tp++ = d1;
                    160: 
                    161:        /*
                    162:         * day is the day number.
                    163:         * generate day of the week.
                    164:         * The addend is 4 mod 7 (1/1/1970 was Thursday)
                    165:         */
                    166: 
                    167:        xtime.tm_wday = (day+7340036)%7;
                    168: 
                    169:        /*
                    170:         * year number
                    171:         */
                    172:        if (day>=0) for(d1=70; day >= dysize(d1); d1++)
                    173:                day -= dysize(d1);
                    174:        else for (d1=70; day<0; d1--)
                    175:                day += dysize(d1-1);
                    176:        xtime.tm_year = d1;
                    177:        xtime.tm_yday = d0 = day;
                    178: 
                    179:        /*
                    180:         * generate month
                    181:         */
                    182: 
                    183:        if (dysize(d1)==366)
                    184:                dmsize[1] = 29;
                    185:        for(d1=0; d0 >= dmsize[d1]; d1++)
                    186:                d0 -= dmsize[d1];
                    187:        dmsize[1] = 28;
                    188:        *tp++ = d0+1;
                    189:        *tp++ = d1;
                    190:        xtime.tm_isdst = 0;
                    191:        return(&xtime);
                    192: }
                    193: 
                    194: char *
                    195: asctime(t)
                    196: struct tm *t;
                    197: {
                    198:        register char *cp, *ncp;
                    199:        register int *tp;
                    200: 
                    201:        cp = cbuf;
                    202:        for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;);
                    203:        ncp = &"SunMonTueWedThuFriSat"[3*t->tm_wday];
                    204:        cp = cbuf;
                    205:        *cp++ = *ncp++;
                    206:        *cp++ = *ncp++;
                    207:        *cp++ = *ncp++;
                    208:        cp++;
                    209:        tp = &t->tm_mon;
                    210:        ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3];
                    211:        *cp++ = *ncp++;
                    212:        *cp++ = *ncp++;
                    213:        *cp++ = *ncp++;
                    214:        cp = ct_numb(cp, *--tp);
                    215:        cp = ct_numb(cp, *--tp+100);
                    216:        cp = ct_numb(cp, *--tp+100);
                    217:        cp = ct_numb(cp, *--tp+100);
                    218:        if (t->tm_year>=100) {
                    219:                cp[1] = '2';
                    220:                cp[2] = '0';
                    221:        }
                    222:        cp += 2;
                    223:        cp = ct_numb(cp, t->tm_year+100);
                    224:        return(cbuf);
                    225: }
                    226: 
                    227: dysize(y)
                    228: {
                    229:        if((y%4) == 0)
                    230:                return(366);
                    231:        return(365);
                    232: }
                    233: 
                    234: static char *
                    235: ct_numb(cp, n)
                    236: register char *cp;
                    237: {
                    238:        cp++;
                    239:        if (n>=10)
                    240:                *cp++ = (n/10)%10 + '0';
                    241:        else
                    242:                *cp++ = ' ';
                    243:        *cp++ = n%10 + '0';
                    244:        return(cp);
                    245: }

unix.superglobalmegacorp.com

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