Annotation of 43BSD/contrib/nntp/server/time.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char    *sccsid = "@(#)time.c   1.4     (Berkeley) 3/20/86";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Collection of routines for dealing with ASCII time strings.
                      7:  * These may actually be useful in their own right.
                      8:  */
                      9: 
                     10: #include <stdio.h>
                     11: #include <sys/types.h>
                     12: #include <sys/time.h>
                     13: #include <ctype.h>
                     14: #include <strings.h>
                     15: 
                     16: /*
                     17:  * dtol -- convert date to long integer.  This is not implicitly
                     18:  * local time, or any other kind of time, for that matter.  If you
                     19:  * pass it a date you think is GMT, you wind up with that number of
                     20:  * seconds...
                     21:  *
                     22:  *     Parameters:             "date_ascii" is in the form "yymmddhhmmss".
                     23:  *
                     24:  *     Returns:                Long integer containing number
                     25:  *                             of seconds since 000000 Jan 1, 1970,
                     26:  *                             and "date".  -1 on error.
                     27:  *
                     28:  *     Side effects:           None.
                     29:  */
                     30: 
                     31: #define twodigtoi(x)   (((*x++) - '0') + (*x++ - '0')*10)
                     32: #define        dysize(y)       ((y % 4 ? 365 : 366))
                     33: 
                     34: static int     dmsize[12] =
                     35:     { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
                     36: 
                     37: long
                     38: dtol(date_ascii)
                     39: char   *date_ascii;
                     40: {
                     41:        char    date[32], *date_str;
                     42:        char    *lhs, *rhs;
                     43:        char    temp;
                     44:        long    seconds;
                     45:        int     year, month, day, hour, mins, secs;
                     46:        int     len, i;
                     47: 
                     48:        len = strlen(date_ascii);
                     49:        if (len != sizeof("yymmddhhmmss")-1)
                     50:                return (-1);
                     51: 
                     52:        (void) strcpy(date, date_ascii);
                     53:        date_str = date;
                     54: 
                     55: #ifdef debug
                     56:        printf("date_str = %s\n", date_str);
                     57: #endif
                     58:        rhs = date_str + len - 1;
                     59:        lhs = date_str;
                     60: 
                     61:        for (; lhs < rhs; ++lhs, --rhs) {
                     62:                temp = *lhs;
                     63:                *lhs = *rhs;
                     64:                *rhs = temp;
                     65:                if (!isdigit(temp) || !isdigit(*lhs))
                     66:                        return (-1);
                     67:        }
                     68: 
                     69:        lhs = date_str;
                     70: #ifdef debug
                     71:        printf("date_str = %s\n", date_str);
                     72: #endif
                     73: 
                     74:        secs = twodigtoi(lhs);
                     75:        mins = twodigtoi(lhs);
                     76:        hour = twodigtoi(lhs);
                     77:        day = twodigtoi(lhs);
                     78:        month = twodigtoi(lhs);
                     79:        year = twodigtoi(lhs);
                     80: 
                     81:        if (month < 1 || month > 12 ||
                     82:            day < 1 || day > 31 ||
                     83:            mins < 0 || mins > 59 ||
                     84:            secs < 0 || secs > 59)
                     85:                return (-1);
                     86:        if (hour == 24) {
                     87:                hour = 0;
                     88:                day++;
                     89:        }
                     90:        if (hour < 0 || hour > 23)
                     91:                return (-1);
                     92:        seconds = 0;
                     93:        year += 1900;
                     94:        for (i = 1970; i < year; i++)
                     95:                seconds += dysize(i);
                     96:        /* Leap year */
                     97:        if (dysize(year) == 366 && month >= 3)
                     98:                seconds++;
                     99:        while (--month)
                    100:                seconds += dmsize[month-1];
                    101:        seconds += day-1;
                    102:        seconds = 24 * seconds + hour;
                    103:        seconds = 60 * seconds + mins;
                    104:        seconds = 60 * seconds + secs;
                    105: 
                    106:        return (seconds);
                    107: }
                    108: 
                    109: 
                    110: /*
                    111:  * ltod -- convert long integer to date string.
                    112:  *
                    113:  *     Parameters:             "date" is in the number of seconds
                    114:  *                             since the epoch.
                    115:  *
                    116:  *     Returns:                Pointer to static data in the form
                    117:  *                             yymmddhhmmss\0.
                    118:  *
                    119:  *     Side effects:           None.
                    120:  */
                    121: 
                    122: char *
                    123: ltod(date)
                    124: long   date;
                    125: {
                    126:        static char     timebuf[32];
                    127:        struct tm       *tp;
                    128: 
                    129:        tp = gmtime(&date);
                    130: 
                    131:        sprintf(timebuf, "%02d%02d%02d%02d%02d%02d",
                    132:                tp->tm_year,
                    133:                tp->tm_mon + 1,         /* 0 to 11??? How silly. */
                    134:                tp->tm_mday,
                    135:                tp->tm_hour,
                    136:                tp->tm_min,
                    137:                tp->tm_sec);
                    138: 
                    139:        return (timebuf);
                    140: }
                    141: 
                    142: 
                    143: /*
                    144:  * local_to_gmt -- convert a local time (in form of number of
                    145:  * seconds since you-know-when) to GMT.
                    146:  *
                    147:  *     Parameters:     "date" is date we want converted, in
                    148:  *                     seconds since 000000 1 Jan 1970.
                    149:  *
                    150:  *     Returns:        Number of seconds corrected for local
                    151:  *                     and dst.
                    152:  */
                    153: 
                    154: long
                    155: local_to_gmt(date)
                    156: long   date;
                    157: {
                    158:        struct  timeval tv;
                    159:        struct  timezone tz;
                    160: 
                    161:        (void) gettimeofday(&tv, &tz);
                    162:        date += (long) tz.tz_minuteswest * 60;
                    163: 
                    164:        /* now fix up local daylight time */
                    165:        if (localtime((time_t *)&date)->tm_isdst)
                    166:                date -= 60*60;
                    167: 
                    168:        return (date);
                    169: }
                    170: 
                    171: /*
                    172:  * gmt_to_local -- take a GMT time expressed in seconds since
                    173:  * the epoch, and convert it to local time.
                    174:  *
                    175:  *     Parameters:     "date" is the number of seconds...
                    176:  *
                    177:  *     Returns:        Number of seconds corrected to reflect
                    178:  *                     local time and dst.
                    179:  */
                    180: 
                    181: long
                    182: gmt_to_local(date)
                    183: long   date;
                    184: {
                    185:        struct  timeval tv;
                    186:        struct  timezone tz;
                    187: 
                    188:        (void) gettimeofday(&tv, &tz);
                    189:        date -= (long) tz.tz_minuteswest * 60;
                    190: 
                    191:        /* now fix up local daylight time */
                    192:        if (localtime((time_t *)&date)->tm_isdst)
                    193:                date += 60*60;
                    194: 
                    195:        return (date);
                    196: }

unix.superglobalmegacorp.com

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