Annotation of 43BSD/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: #ifndef  SYS5
                     15: #include <sys/timeb.h>
                     16: #endif   not SYS5
                     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: static struct zone {
                     55:     char   *std,
                     56:            *dst;
                     57:     int     shift;
                     58: }                   zones[] = {
                     59:                        "GMT", "BST", 0,
                     60:                         "EST", "EDT", -5,
                     61:                         "CST", "CDT", -6,
                     62:                         "MST", NULL, -7,
                     63:                         "PST", "PDT", -8,
                     64:                         "A", NULL, -1,
                     65:                         "B", NULL, -2,
                     66:                         "C", NULL, -3,
                     67:                         "D", NULL, -4,
                     68:                         "E", NULL, -5,
                     69:                         "F", NULL, -6,
                     70:                         "G", NULL, -7,
                     71:                         "H", NULL, -8,
                     72:                         "I", NULL, -9,
                     73:                         "K", NULL, -10,
                     74:                         "L", NULL, -11,
                     75:                         "M", NULL, -12,
                     76:                         "N", NULL, 1,
                     77: #ifndef        HUJI
                     78:                         "O", NULL, 2,
                     79: #else  HUJI
                     80:                        "JST", "JDT", 2,
                     81: #endif HUJI
                     82:                         "P", NULL, 3,
                     83:                         "Q", NULL, 4,
                     84:                         "R", NULL, 5,
                     85:                         "S", NULL, 6,
                     86:                         "T", NULL, 7,
                     87:                         "U", NULL, 8,
                     88:                         "V", NULL, 9,
                     89:                         "W", NULL, 10,
                     90:                         "X", NULL, 11,
                     91:                         "Y", NULL, 12,
                     92: 
                     93:                         NULL
                     94: };
                     95: 
                     96: #define CENTURY 19
                     97: 
                     98: long    time ();
                     99: struct tm *localtime ();
                    100: 
                    101: /*  */
                    102: 
                    103: char *dtimenow () {
                    104:     long    clock;
                    105: 
                    106:     (void) time (&clock);
                    107:     return dtime (&clock);
                    108: }
                    109: 
                    110: 
                    111: char   *dctime (tw)
                    112: register struct tws *tw;
                    113: {
                    114:     static char buffer[25];
                    115: 
                    116:     if (!tw)
                    117:        return NULL;
                    118: 
                    119:     (void) sprintf (buffer, "%.3s %.3s %02d %02d:%02d:%02d %.4d\n",
                    120:            tw_dotw[tw -> tw_wday], tw_moty[tw -> tw_mon], tw -> tw_mday,
                    121:            tw -> tw_hour, tw -> tw_min, tw -> tw_sec,
                    122:            tw -> tw_year >= 100 ? tw -> tw_year : 1900 + tw -> tw_year);
                    123: 
                    124:     return buffer;
                    125: }
                    126: 
                    127: /*  */
                    128: 
                    129: struct tws *dtwstime () {
                    130:     long    clock;
                    131: 
                    132:     (void) time (&clock);
                    133:     return dlocaltime (&clock);
                    134: }
                    135: 
                    136: 
                    137: struct tws *dlocaltime (clock)
                    138: register long   *clock;
                    139: {
                    140:     register struct tm *tm;
                    141: #ifndef        SYS5
                    142:     struct timeb    tb;
                    143: #endif not SYS5
                    144:     static struct tws   tw;
                    145: 
                    146:     if (!clock)
                    147:        return NULL;
                    148:     tw.tw_flags = TW_NULL;
                    149: 
                    150:     tm = localtime (clock);
                    151:     tw.tw_sec = tm -> tm_sec;
                    152:     tw.tw_min = tm -> tm_min;
                    153:     tw.tw_hour = tm -> tm_hour;
                    154:     tw.tw_mday = tm -> tm_mday;
                    155:     tw.tw_mon = tm -> tm_mon;
                    156:     tw.tw_year = tm -> tm_year;
                    157:     tw.tw_wday = tm -> tm_wday;
                    158:     tw.tw_yday = tm -> tm_yday;
                    159:     if (tm -> tm_isdst)
                    160:        tw.tw_flags |= TW_DST;
                    161: #ifndef  SYS5
                    162:     ftime (&tb);
                    163:     tw.tw_zone = -tb.timezone;
                    164: #else   SYS5
                    165:     tzset ();
                    166:     tw.tw_zone = -(timezone / 60);
                    167: #endif  SYS5
                    168:     tw.tw_flags &= ~TW_SDAY, tw.tw_flags |= TW_SEXP;
                    169:     tw.tw_clock = *clock;
                    170: 
                    171:     return (&tw);
                    172: }
                    173: 
                    174: 
                    175: struct tws *dgmtime (clock)
                    176: register long   *clock;
                    177: {
                    178:     register struct tm *tm;
                    179:     static struct tws   tw;
                    180: 
                    181:     if (!clock)
                    182:        return NULL;
                    183:     tw.tw_flags = TW_NULL;
                    184: 
                    185:     tm = gmtime (clock);
                    186:     tw.tw_sec = tm -> tm_sec;
                    187:     tw.tw_min = tm -> tm_min;
                    188:     tw.tw_hour = tm -> tm_hour;
                    189:     tw.tw_mday = tm -> tm_mday;
                    190:     tw.tw_mon = tm -> tm_mon;
                    191:     tw.tw_year = tm -> tm_year;
                    192:     tw.tw_wday = tm -> tm_wday;
                    193:     tw.tw_yday = tm -> tm_yday;
                    194:     if (tm -> tm_isdst)
                    195:        tw.tw_flags |= TW_DST;
                    196:     tw.tw_zone = 0;
                    197:     tw.tw_flags &= ~TW_SDAY, tw.tw_flags |= TW_SEXP;
                    198:     tw.tw_clock = *clock;
                    199: 
                    200:     return (&tw);
                    201: }
                    202: 
                    203: /*  */
                    204: 
                    205: char   *dasctime (tw, flags)
                    206: register struct tws *tw;
                    207: int    flags;
                    208: {
                    209:     static char buffer[80],
                    210:                 result[80];
                    211: 
                    212:     if (!tw)
                    213:        return NULL;
                    214: 
                    215:     (void) sprintf (buffer, "%02d %s %02d %02d:%02d:%02d %s",
                    216:            tw -> tw_mday, tw_moty[tw -> tw_mon], tw -> tw_year,
                    217:            tw -> tw_hour, tw -> tw_min, tw -> tw_sec,
                    218:            dtimezone (tw -> tw_zone, tw -> tw_flags | flags));
                    219: 
                    220:     if ((tw -> tw_flags & TW_SDAY) == TW_SEXP)
                    221:        (void) sprintf (result, "%s, %s", tw_dotw[tw -> tw_wday], buffer);
                    222:     else
                    223:        if ((tw -> tw_flags & TW_SDAY) == TW_SNIL)
                    224:            (void) strcpy (result, buffer);
                    225:        else
                    226:            (void) sprintf (result, "%s (%s)", buffer, tw_dotw[tw -> tw_wday]);
                    227: 
                    228:     return result;
                    229: }
                    230: 
                    231: /*  */
                    232: 
                    233: char   *dtimezone (offset, flags)
                    234: register int     offset,
                    235:                 flags;
                    236: {
                    237:     register int    hours,
                    238:                     mins;
                    239:     register struct zone *z;
                    240:     static char buffer[10];
                    241: 
                    242:     if (offset < 0) {
                    243:        mins = -((-offset) % 60);
                    244:        hours = -((-offset) / 60);
                    245:     }
                    246:     else {
                    247:        mins = offset % 60;
                    248:        hours = offset / 60;
                    249:     }
                    250: 
                    251:     if (!(flags & TW_ZONE) && mins == 0)
                    252:        for (z = zones; z -> std; z++)
                    253:            if (z -> shift == hours)
                    254:                return (z -> dst && (flags & TW_DST) ? z -> dst : z -> std);
                    255: 
                    256:     (void) sprintf (buffer, "%s%02d%02d",
                    257:            offset < 0 ? "-" : "+", abs (hours), abs (mins));
                    258:     return buffer;
                    259: }
                    260: 
                    261: /*  */
                    262: 
                    263: void twscopy (tb, tw)
                    264: register struct tws *tb,
                    265:                    *tw;
                    266: {
                    267: #ifdef notdef
                    268:     tb -> tw_sec = tw -> tw_sec;
                    269:     tb -> tw_min = tw -> tw_min;
                    270:     tb -> tw_hour = tw -> tw_hour;
                    271:     tb -> tw_mday = tw -> tw_mday;
                    272:     tb -> tw_mon = tw -> tw_mon;
                    273:     tb -> tw_year = tw -> tw_year;
                    274:     tb -> tw_wday = tw -> tw_wday;
                    275:     tb -> tw_yday = tw -> tw_yday;
                    276:     tb -> tw_zone = tw -> tw_zone;
                    277:     tb -> tw_clock = tw -> tw_clock;
                    278:     tb -> tw_flags = tw -> tw_flags;
                    279: #else  not notdef
                    280:     *tb = *tw;
                    281: #endif not notdef
                    282: }
                    283: 
                    284: 
                    285: int     twsort (tw1, tw2)
                    286: register struct tws *tw1,
                    287:                    *tw2;
                    288: {
                    289:     register long   c1,
                    290:                     c2;
                    291: 
                    292:     if (tw1 -> tw_clock == 0L)
                    293:        (void) twclock (tw1);
                    294:     if (tw2 -> tw_clock == 0L)
                    295:        (void) twclock (tw2);
                    296: 
                    297:     return ((c1 = tw1 -> tw_clock) > (c2 = tw2 -> tw_clock) ? 1
                    298:            : c1 == c2 ? 0 : -1);
                    299: }
                    300: 
                    301: /*  */
                    302: 
                    303: /* This routine is based on the gtime() routine written by Steven Shafer
                    304:    (sas) at CMU.  It was forwarded to MTR by Jay Lepreau at Utah-CS.
                    305:  */
                    306: 
                    307: static int  dmsize[] = {
                    308:     31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
                    309: };
                    310: 
                    311: 
                    312: long   twclock (tw)
                    313: register struct        tws *tw;
                    314: {
                    315:     register int    i,
                    316:                     sec,
                    317:                     min,
                    318:                     hour,
                    319:                     mday,
                    320:                     mon,
                    321:                     year;
                    322:     register long   result;
                    323: 
                    324:     if (tw -> tw_clock != 0L)
                    325:        return tw -> tw_clock;
                    326: 
                    327:     if ((sec = tw -> tw_sec) < 0 || sec > 59
                    328:            || (min = tw -> tw_min) < 0 || min > 59
                    329:            || (hour = tw -> tw_hour) < 0 || hour > 23
                    330:            || (mday = tw -> tw_mday) < 1 || mday > 31
                    331:            || (mon = tw -> tw_mon + 1) < 1 || mon > 12)
                    332:        return (tw -> tw_clock = -1L);
                    333:     year = tw -> tw_year;
                    334: 
                    335:     result = 0L;
                    336:     year += 1900;
                    337:     for (i = 1970; i < year; i++)
                    338:        result += dysize (i);
                    339:     if (dysize (year) == 366 && mon >= 3)
                    340:        result++;
                    341:     while (--mon)
                    342:        result += dmsize[mon - 1];
                    343:     result += mday - 1;
                    344:     result = 24 * result + hour;
                    345:     result = 60 * result + min;
                    346:     result = 60 * result + sec;
                    347:     result -= 60 * tw -> tw_zone;
                    348:     if (tw -> tw_flags & TW_DST)
                    349:        result -= 60 * 60;
                    350: 
                    351:     return (tw -> tw_clock = result);
                    352: }
                    353: 
                    354: /*  */
                    355: 
                    356: /*
                    357:  *    Simple calculation of day of the week.  Algorithm used is Zeller's
                    358:  *    congruence.  Currently, we assume if tw -> tw_year < 100
                    359:  *    then the century is CENTURY.
                    360:  */
                    361: 
                    362: set_dotw (tw)
                    363: register struct tws *tw;
                    364: {
                    365:     register int    month,
                    366:                     day,
                    367:                     year,
                    368:                     century;
                    369: 
                    370:     month = tw -> tw_mon - 1;
                    371:     day = tw -> tw_mday;
                    372:     year = tw -> tw_year % 100;
                    373:     century = tw -> tw_year >= 100 ? tw -> tw_year / 100 : CENTURY;
                    374: 
                    375:     if (month <= 0) {
                    376:        month += 12;
                    377:        if (--year < 0) {
                    378:            year += 100;
                    379:            century--;
                    380:        }
                    381:     }
                    382: 
                    383:     tw -> tw_wday =
                    384:        ((26 * month - 2) / 10 + day + year + year / 4
                    385:            - 3 * century / 4 + 1) % 7;
                    386: 
                    387:     tw -> tw_flags &= ~TW_SDAY, tw -> tw_flags |= TW_SIMP;
                    388: }

unix.superglobalmegacorp.com

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