Annotation of 43BSDReno/contrib/mh/zotnet/tws/dtime.c, revision 1.1.1.1

1.1       root        1: /* dtime.c - routines to do ``ARPA-style'' time structures */
                      2: 
                      3: /* LINTLIBRARY */
                      4: 
                      5: 
                      6: #include "tws.h"
                      7: #ifndef        INETONLY
                      8: #include "../h/strings.h"
                      9: #else  INETONLY
                     10: #include "strings.h"
                     11: #endif INETONLY
                     12: #include <stdio.h>
                     13: #include <sys/types.h>
                     14: #if !defined(SYS5) && !defined(BSD44)
                     15: #include <sys/timeb.h>
                     16: #endif  
                     17: #ifndef        BSD42
                     18: #include <time.h>
                     19: #else  BSD42
                     20: #include <sys/time.h>
                     21: #endif BSD42
                     22: 
                     23: #ifdef SYS5
                     24: extern int  daylight;
                     25: extern long timezone;
                     26: extern char *tzname[];
                     27: #endif SYS5
                     28: 
                     29: /*  */
                     30: 
                     31: #define        abs(a)  (a >= 0 ? a : -a)
                     32: 
                     33: #define        dysize(y)       \
                     34:        (((y) % 4) ? 365 : (((y) % 100) ? 366 : (((y) % 400) ? 365 : 366)))
                     35: 
                     36: /*  */
                     37: 
                     38: char *tw_moty[] = {
                     39:     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                     40:     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL
                     41: };
                     42: 
                     43: char *tw_dotw[] = {
                     44:     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL
                     45: };
                     46: 
                     47: char *tw_ldotw[] = {
                     48:     "Sunday", "Monday", "Tuesday", "Wednesday",
                     49:     "Thursday", "Friday", "Saturday", NULL
                     50: };
                     51: 
                     52: /*  */
                     53: 
                     54: #if !defined(ZONEINFO) && !defined(BSD44)
                     55: static struct zone {
                     56:     char   *std,
                     57:            *dst;
                     58:     int     shift;
                     59: }                   zones[] = {
                     60:                        "GMT", "BST", 0,
                     61:                         "EST", "EDT", -5,
                     62:                         "CST", "CDT", -6,
                     63:                         "MST", NULL, -7,
                     64:                         "PST", "PDT", -8,
                     65:                         "A", NULL, -1,
                     66:                         "B", NULL, -2,
                     67:                         "C", NULL, -3,
                     68:                         "D", NULL, -4,
                     69:                         "E", NULL, -5,
                     70:                         "F", NULL, -6,
                     71:                         "G", NULL, -7,
                     72:                         "H", NULL, -8,
                     73:                         "I", NULL, -9,
                     74:                         "K", NULL, -10,
                     75:                         "L", NULL, -11,
                     76:                         "M", NULL, -12,
                     77:                         "N", NULL, 1,
                     78: #ifdef notdef
                     79:                         "O", NULL, 2,
                     80: #else
                     81:                        "JST", "JDT", 2,
                     82: #endif
                     83:                         "P", NULL, 3,
                     84:                         "Q", NULL, 4,
                     85:                         "R", NULL, 5,
                     86:                         "S", NULL, 6,
                     87:                         "T", NULL, 7,
                     88:                         "U", NULL, 8,
                     89:                         "V", NULL, 9,
                     90:                         "W", NULL, 10,
                     91:                         "X", NULL, 11,
                     92:                         "Y", NULL, 12,
                     93: 
                     94:                         NULL
                     95: };
                     96: 
                     97: #endif
                     98: #define CENTURY 19
                     99: 
                    100: long time();
                    101: struct tm *localtime();
                    102: 
                    103: /*  */
                    104: 
                    105: char *
                    106: dtimenow()
                    107: {
                    108:     long    clock;
                    109: 
                    110:     (void) time (&clock);
                    111:     return dtime (&clock);
                    112: }
                    113: 
                    114: 
                    115: char *
                    116: dctime(tw)
                    117:        register struct tws *tw;
                    118: {
                    119:     static char buffer[25];
                    120: 
                    121:     if (!tw)
                    122:        return NULL;
                    123: 
                    124:     (void) sprintf (buffer, "%.3s %.3s %02d %02d:%02d:%02d %.4d\n",
                    125:            tw_dotw[tw -> tw_wday], tw_moty[tw -> tw_mon], tw -> tw_mday,
                    126:            tw -> tw_hour, tw -> tw_min, tw -> tw_sec,
                    127:            tw -> tw_year >= 100 ? tw -> tw_year : 1900 + tw -> tw_year);
                    128: 
                    129:     return buffer;
                    130: }
                    131: 
                    132: /*  */
                    133: 
                    134: struct tws *
                    135: dtwstime()
                    136: {
                    137:     long    clock;
                    138: 
                    139:     (void) time (&clock);
                    140:     return dlocaltime (&clock);
                    141: }
                    142: 
                    143: 
                    144: struct tws *
                    145: dlocaltime(clock)
                    146:        register long *clock;
                    147: {
                    148:     register struct tm *tm;
                    149: #if !defined(SYS5) && !defined(ZONEINFO) & !defined(BSD44)
                    150:     struct timeb    tb;
                    151: #endif not SYS5 and not ZONEINFO
                    152:     static struct tws   tw;
                    153: 
                    154:     if (!clock)
                    155:        return NULL;
                    156:     tw.tw_flags = TW_NULL;
                    157: 
                    158: #if defined(ZONEINFO) || defined(BSD44)
                    159:     tzset();
                    160: #endif
                    161:     tm = localtime (clock);
                    162:     tw.tw_sec = tm->tm_sec;
                    163:     tw.tw_min = tm->tm_min;
                    164:     tw.tw_hour = tm->tm_hour;
                    165:     tw.tw_mday = tm->tm_mday;
                    166:     tw.tw_mon = tm->tm_mon;
                    167:     tw.tw_year = tm->tm_year;
                    168:     tw.tw_wday = tm->tm_wday;
                    169:     tw.tw_yday = tm->tm_yday;
                    170:     if (tm->tm_isdst)
                    171:        tw.tw_flags |= TW_DST;
                    172: #ifdef SYS5
                    173:     tzset ();
                    174:     tw.tw_zone = -(timezone / 60);
                    175: #else
                    176: #if defined(ZONEINFO) || defined(BSD44)
                    177:     tw.tw_zone = tm->tm_gmtoff / 60;
                    178:     (void) strcpy(tw.tw_zonename, tm->tm_zone);
                    179: #else
                    180:     ftime (&tb);
                    181:     tw.tw_zone = -tb.timezone;
                    182: #endif
                    183: #endif
                    184:     tw.tw_flags &= ~TW_SDAY;
                    185:     tw.tw_flags |= TW_SEXP;
                    186:     tw.tw_flags &= ~TW_SZONE;
                    187:     tw.tw_flags |= TW_SZEXP;
                    188:     tw.tw_clock = *clock;
                    189: 
                    190:     return (&tw);
                    191: }
                    192: 
                    193: 
                    194: struct tws *
                    195: dgmtime(clock)
                    196:        register long *clock;
                    197: {
                    198:     register struct tm *tm;
                    199:     static struct tws   tw;
                    200: 
                    201:     if (!clock)
                    202:        return NULL;
                    203:     tw.tw_flags = TW_NULL;
                    204: 
                    205:     tm = gmtime (clock);
                    206:     tw.tw_sec = tm -> tm_sec;
                    207:     tw.tw_min = tm -> tm_min;
                    208:     tw.tw_hour = tm -> tm_hour;
                    209:     tw.tw_mday = tm -> tm_mday;
                    210:     tw.tw_mon = tm -> tm_mon;
                    211:     tw.tw_year = tm -> tm_year;
                    212:     tw.tw_wday = tm -> tm_wday;
                    213:     tw.tw_yday = tm -> tm_yday;
                    214:     if (tm -> tm_isdst)
                    215:        tw.tw_flags |= TW_DST;
                    216:     tw.tw_zone = 0;
                    217:     tw.tw_flags &= ~TW_SDAY;
                    218:     tw.tw_flags |= TW_SEXP;
                    219:     tw.tw_flags &= ~TW_SZONE;
                    220:     tw.tw_flags |= TW_SZEXP;
                    221:     tw.tw_clock = *clock;
                    222: 
                    223:     return (&tw);
                    224: }
                    225: 
                    226: /*  */
                    227: 
                    228: char *
                    229: dasctime(tw, flags)
                    230:        register struct tws *tw;
                    231:        int flags;
                    232: {
                    233:     char buffer[80];
                    234:     static char result[80];
                    235: 
                    236:     if (!tw)
                    237:        return(NULL);
                    238: 
                    239:     /* Display timezone if known */
                    240:     if ((tw->tw_flags & TW_SZONE) == TW_SZNIL)
                    241:            result[0] = '\0';
                    242:     else
                    243: #if defined(ZONEINFO) || defined(BSD44)
                    244:        if (*tw->tw_zonename) 
                    245:                (void) sprintf(result, " %s", tw->tw_zonename);
                    246:        else
                    247:                result[0] = '\0';
                    248: #else
                    249:            (void) sprintf(result, " %s",
                    250:                dtimezone(tw -> tw_zone, tw->tw_flags | flags));
                    251: #endif
                    252:     (void) sprintf(buffer, "%02d %s %02d %02d:%02d:%02d%s",
                    253:            tw->tw_mday, tw_moty[tw->tw_mon], tw->tw_year,
                    254:            tw->tw_hour, tw->tw_min, tw->tw_sec, result);
                    255: 
                    256:     /* Display day of week if known (put in parens if implicitly derived) */
                    257:     if ((tw->tw_flags & TW_SDAY) == TW_SEXP)
                    258:        (void) sprintf(result, "%s, %s", tw_dotw[tw->tw_wday], buffer);
                    259:     else if ((tw -> tw_flags & TW_SDAY) == TW_SNIL)
                    260:            (void) strcpy(result, buffer);
                    261:     else
                    262:            (void) sprintf(result, "%s (%s)", buffer, tw_dotw[tw->tw_wday]);
                    263: 
                    264:     return(result);
                    265: }
                    266: 
                    267: /*  */
                    268: 
                    269: #if !defined(ZONEINFO) && !defined(BSD44)
                    270: char *
                    271: dtimezone(offset, flags)
                    272:        register int offset, flags;
                    273: {
                    274:     register int    hours,
                    275:                     mins;
                    276:     register struct zone *z;
                    277:     static char buffer[10];
                    278: 
                    279:     if (offset < 0) {
                    280:        mins = -((-offset) % 60);
                    281:        hours = -((-offset) / 60);
                    282:     }
                    283:     else {
                    284:        mins = offset % 60;
                    285:        hours = offset / 60;
                    286:     }
                    287: 
                    288:     if (!(flags & TW_ZONE) && mins == 0)
                    289:        for (z = zones; z -> std; z++)
                    290:            if (z -> shift == hours)
                    291:                return (z -> dst && (flags & TW_DST) ? z -> dst : z -> std);
                    292: 
                    293: #if defined(DSTXXX) 
                    294:     if (flags & TW_DST)
                    295:        hours += 1;
                    296: #endif DSTXXX
                    297:     (void) sprintf (buffer, "%s%02d%02d",
                    298:            offset < 0 ? "-" : "+", abs (hours), abs (mins));
                    299:     return buffer;
                    300: }
                    301: #endif
                    302: 
                    303: /*  */
                    304: 
                    305: void
                    306: twscopy(tb, tw)
                    307:        register struct tws *tb, *tw;
                    308: {
                    309: #ifdef notdef
                    310:     tb -> tw_sec = tw -> tw_sec;
                    311:     tb -> tw_min = tw -> tw_min;
                    312:     tb -> tw_hour = tw -> tw_hour;
                    313:     tb -> tw_mday = tw -> tw_mday;
                    314:     tb -> tw_mon = tw -> tw_mon;
                    315:     tb -> tw_year = tw -> tw_year;
                    316:     tb -> tw_wday = tw -> tw_wday;
                    317:     tb -> tw_yday = tw -> tw_yday;
                    318:     tb -> tw_zone = tw -> tw_zone;
                    319:     tb -> tw_clock = tw -> tw_clock;
                    320:     tb -> tw_flags = tw -> tw_flags;
                    321: #else  not notdef
                    322:     *tb = *tw;
                    323: #endif not notdef
                    324: }
                    325: 
                    326: 
                    327: twsort(tw1, tw2)
                    328:        register struct tws *tw1, *tw2;
                    329: {
                    330:     register long   c1,
                    331:                     c2;
                    332: 
                    333:     if (tw1 -> tw_clock == 0L)
                    334:        (void) twclock (tw1);
                    335:     if (tw2 -> tw_clock == 0L)
                    336:        (void) twclock (tw2);
                    337: 
                    338:     return ((c1 = tw1 -> tw_clock) > (c2 = tw2 -> tw_clock) ? 1
                    339:            : c1 == c2 ? 0 : -1);
                    340: }
                    341: 
                    342: /*  */
                    343: 
                    344: /* This routine is based on the gtime() routine written by Steven Shafer
                    345:    (sas) at CMU.  It was forwarded to MTR by Jay Lepreau at Utah-CS.
                    346:  */
                    347: 
                    348: static int  dmsize[] = {
                    349:     31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
                    350: };
                    351: 
                    352: 
                    353: long
                    354: twclock(tw)
                    355:        register struct tws *tw;
                    356: {
                    357:     register int    i,
                    358:                     sec,
                    359:                     min,
                    360:                     hour,
                    361:                     mday,
                    362:                     mon,
                    363:                     year;
                    364:     register long   result;
                    365: 
                    366:     if (tw -> tw_clock != 0L)
                    367:        return tw -> tw_clock;
                    368: 
                    369:     if ((sec = tw -> tw_sec) < 0 || sec > 59
                    370:            || (min = tw -> tw_min) < 0 || min > 59
                    371:            || (hour = tw -> tw_hour) < 0 || hour > 23
                    372:            || (mday = tw -> tw_mday) < 1 || mday > 31
                    373:            || (mon = tw -> tw_mon + 1) < 1 || mon > 12)
                    374:        return (tw -> tw_clock = -1L);
                    375:     year = tw -> tw_year;
                    376: 
                    377:     result = 0L;
                    378:     year += 1900;
                    379:     for (i = 1970; i < year; i++)
                    380:        result += dysize (i);
                    381:     if (dysize (year) == 366 && mon >= 3)
                    382:        result++;
                    383:     while (--mon)
                    384:        result += dmsize[mon - 1];
                    385:     result += mday - 1;
                    386:     result = 24 * result + hour;
                    387:     result = 60 * result + min;
                    388:     result = 60 * result + sec;
                    389:     result -= 60 * tw -> tw_zone;
                    390:     if (tw -> tw_flags & TW_DST)
                    391:        result -= 60 * 60;
                    392: 
                    393:     return (tw -> tw_clock = result);
                    394: }
                    395: 
                    396: /*  */
                    397: 
                    398: /*
                    399:  *    Simple calculation of day of the week.  Algorithm used is Zeller's
                    400:  *    congruence.  Currently, we assume if tw -> tw_year < 100
                    401:  *    then the century is CENTURY.
                    402:  */
                    403: 
                    404: set_dotw(tw)
                    405:        register struct tws *tw;
                    406: {
                    407:     register int    month,
                    408:                     day,
                    409:                     year,
                    410:                     century;
                    411: 
                    412:     month = tw -> tw_mon - 1;
                    413:     day = tw -> tw_mday;
                    414:     year = tw -> tw_year % 100;
                    415:     century = tw -> tw_year >= 100 ? tw -> tw_year / 100 : CENTURY;
                    416: 
                    417:     if (month <= 0) {
                    418:        month += 12;
                    419:        if (--year < 0) {
                    420:            year += 100;
                    421:            century--;
                    422:        }
                    423:     }
                    424: 
                    425:     tw -> tw_wday =
                    426:        ((26 * month - 2) / 10 + day + year + year / 4
                    427:            - 3 * century / 4 + 1) % 7;
                    428: 
                    429:     tw->tw_flags &= ~TW_SDAY;
                    430:     tw->tw_flags |= TW_SIMP;
                    431: }

unix.superglobalmegacorp.com

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