|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.