|
|
1.1 ! root 1: # include "conf.h" ! 2: # include <sys/time.h> ! 3: # ifndef V6 ! 4: # include <sys/types.h> ! 5: # include <sys/timeb.h> ! 6: # endif ! 7: # include "useful.h" ! 8: ! 9: SCCSID(@(#)arpadate.c 4.2 9/27/83); ! 10: ! 11: /* ! 12: ** ARPADATE -- Create date in ARPANET format ! 13: ** ! 14: ** Parameters: ! 15: ** ud -- unix style date string. if NULL, one is created. ! 16: ** ! 17: ** Returns: ! 18: ** pointer to an ARPANET date field ! 19: ** ! 20: ** Side Effects: ! 21: ** none ! 22: ** ! 23: ** WARNING: ! 24: ** date is stored in a local buffer -- subsequent ! 25: ** calls will overwrite. ! 26: ** ! 27: ** Bugs: ! 28: ** Timezone is computed from local time, rather than ! 29: ** from whereever (and whenever) the message was sent. ! 30: ** To do better is very hard. ! 31: ** ! 32: ** Some sites are now inserting the timezone into the ! 33: ** local date. This routine should figure out what ! 34: ** the format is and work appropriately. ! 35: */ ! 36: ! 37: char * ! 38: arpadate(ud) ! 39: register char *ud; ! 40: { ! 41: register char *p; ! 42: register char *q; ! 43: static char b[40]; ! 44: extern char *ctime(); ! 45: register int i; ! 46: extern struct tm *localtime(); ! 47: # ifdef V6 ! 48: long t; ! 49: extern char *StdTimezone, *DstTimezone; ! 50: extern long time(); ! 51: # else ! 52: struct timeb t; ! 53: extern struct timeb *ftime(); ! 54: extern char *timezone(); ! 55: # endif ! 56: ! 57: /* ! 58: ** Get current time. ! 59: ** This will be used if a null argument is passed and ! 60: ** to resolve the timezone. ! 61: */ ! 62: ! 63: # ifdef V6 ! 64: (void) time(&t); ! 65: if (ud == NULL) ! 66: ud = ctime(&t); ! 67: # else ! 68: ftime(&t); ! 69: if (ud == NULL) ! 70: ud = ctime(&t.time); ! 71: # endif ! 72: ! 73: /* ! 74: ** Crack the UNIX date line in a singularly unoriginal way. ! 75: */ ! 76: ! 77: q = b; ! 78: ! 79: p = &ud[0]; /* Mon */ ! 80: *q++ = *p++; ! 81: *q++ = *p++; ! 82: *q++ = *p++; ! 83: *q++ = ','; ! 84: *q++ = ' '; ! 85: ! 86: p = &ud[8]; /* 16 */ ! 87: if (*p == ' ') ! 88: p++; ! 89: else ! 90: *q++ = *p++; ! 91: *q++ = *p++; ! 92: *q++ = ' '; ! 93: ! 94: p = &ud[4]; /* Sep */ ! 95: *q++ = *p++; ! 96: *q++ = *p++; ! 97: *q++ = *p++; ! 98: *q++ = ' '; ! 99: ! 100: p = &ud[22]; /* 79 */ ! 101: *q++ = *p++; ! 102: *q++ = *p++; ! 103: *q++ = ' '; ! 104: ! 105: p = &ud[11]; /* 01:03:52 */ ! 106: for (i = 8; i > 0; i--) ! 107: *q++ = *p++; ! 108: ! 109: /* -PST or -PDT */ ! 110: # ifdef V6 ! 111: if (localtime(&t)->tm_isdst) ! 112: p = DstTimezone; ! 113: else ! 114: p = StdTimezone; ! 115: # else ! 116: p = timezone(t.timezone, localtime(&t.time)->tm_isdst); ! 117: # endif V6 ! 118: if ( (strncmp(p,"GMT",3)==0 || strncmp(p,"gmt",3)==0) && p[3] != '\0') ! 119: { ! 120: /* hours from GMT */ ! 121: p += 3; ! 122: *q++ = *p++; ! 123: if (p[1] == ':') ! 124: *q++ = '0'; ! 125: else ! 126: *q++ = *p++; ! 127: *q++ = *p++; ! 128: p++; /* skip ``:'' */ ! 129: *q++ = *p++; ! 130: *q++ = *p++; ! 131: *q = '\0'; ! 132: } ! 133: else ! 134: if( !fconvert(p,q) ) ! 135: { ! 136: *q++ = ' '; ! 137: *q++ = *p++; ! 138: *q++ = *p++; ! 139: *q++ = *p++; ! 140: *q = '\0'; ! 141: } ! 142: ! 143: return (b); ! 144: } ! 145: ! 146: /* convert foreign identifications to some ARPA interpretable form */ ! 147: /* with dst we put the time zone one hour ahead */ ! 148: struct foreign { ! 149: char *f_from; ! 150: char *f_to; ! 151: } foreign[] = { ! 152: {"eet", " -0200"}, /* eastern europe */ ! 153: {"met", " -0100"}, /* middle europe */ ! 154: {"wet", " GMT"}, /* western europe, and what for australia? */ ! 155: {"eet dst", " -0300"}, /* daylight saving times */ ! 156: {"met dst", " -0200"}, ! 157: {"wet dst", " -0100"}, ! 158: {NULL, NULL} ! 159: }; ! 160: ! 161: fconvert( a, b ) register char *a; char *b; ! 162: { register struct foreign *euptr; ! 163: register char *ptr; ! 164: extern makelower(); ! 165: ! 166: /* for news: for ( ptr = a; *ptr; ptr++ ) ! 167: if ( isupper(*ptr) ) ! 168: *ptr = tolower( *ptr ); ! 169: */ ! 170: makelower( a ); ! 171: for ( euptr = &foreign[0]; euptr->f_from != NULL; euptr++ ) ! 172: if ( strcmp(euptr->f_from, a) == 0 ) ! 173: { ptr = euptr->f_to; ! 174: while ( *ptr ) ! 175: *b++ = *ptr++; ! 176: *b = '\0'; ! 177: return 1; ! 178: } ! 179: return 0; ! 180: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.