1293Seric # include <time.h> 22897Seric # ifndef V6 32897Seric # include <sys/types.h> 42897Seric # include <sys/timeb.h> 52897Seric # endif 64437Seric # include "useful.h" 7293Seric 8*5184Seric static char SccsId[] = "@(#)arpadate.c 3.8 12/05/81"; 9403Seric 10293Seric /* 11293Seric ** ARPADATE -- Create date in ARPANET format 12293Seric ** 13293Seric ** Parameters: 142897Seric ** ud -- unix style date string. if NULL, one is created. 15293Seric ** 16293Seric ** Returns: 17293Seric ** pointer to an ARPANET date field 18293Seric ** 19293Seric ** Side Effects: 20293Seric ** none 21293Seric ** 22293Seric ** WARNING: 23293Seric ** date is stored in a local buffer -- subsequent 24293Seric ** calls will overwrite. 253185Seric ** 263185Seric ** Bugs: 273185Seric ** Timezone is computed from local time, rather than 283185Seric ** from whereever (and whenever) the message was sent. 293185Seric ** To do better is very hard. 304315Seric ** 314315Seric ** Some sites are now inserting the timezone into the 324315Seric ** local date. This routine should figure out what 334315Seric ** the format is and work appropriately. 34293Seric */ 35293Seric 361586Seric char * 372897Seric arpadate(ud) 382897Seric register char *ud; 39293Seric { 40293Seric register char *p; 412897Seric register char *q; 42293Seric static char b[40]; 431586Seric extern char *ctime(); 442897Seric register int i; 452897Seric extern struct tm *localtime(); 462897Seric # ifdef V6 472897Seric long t; 484315Seric extern char *StdTimezone, *DstTimezone; 494315Seric extern long time(); 502897Seric # else 512897Seric struct timeb t; 522897Seric extern struct timeb *ftime(); 532897Seric extern char *timezone(); 542897Seric # endif 55293Seric 564315Seric /* 574315Seric ** Get current time. 584315Seric ** This will be used if a null argument is passed and 594315Seric ** to resolve the timezone. 604315Seric */ 614315Seric 622897Seric # ifdef V6 634315Seric (void) time(&t); 642897Seric if (ud == NULL) 652897Seric ud = ctime(&t); 662897Seric # else 672897Seric ftime(&t); 682897Seric if (ud == NULL) 692897Seric ud = ctime(&t.time); 702897Seric # endif 71293Seric 724315Seric /* 734315Seric ** Crack the UNIX date line in a singularly unoriginal way. 744315Seric */ 754315Seric 762897Seric q = b; 772897Seric 78293Seric p = &ud[8]; /* 16 */ 79293Seric if (*p == ' ') 80293Seric p++; 812897Seric else 822897Seric *q++ = *p++; 832897Seric *q++ = *p++; 84*5184Seric *q++ = '-'; 852897Seric 86*5184Seric p = &ud[4]; /* Sep */ 87*5184Seric *q++ = *p++; 88*5184Seric *q++ = *p++; 89*5184Seric *q++ = *p++; 90*5184Seric *q++ = '-'; 912897Seric 92*5184Seric p = &ud[22]; /* 1979 */ 93*5184Seric *q++ = *p++; 94*5184Seric *q++ = *p++; 952897Seric *q++ = ' '; 962897Seric 972897Seric p = &ud[11]; /* 01:03:52 */ 98*5184Seric for (i = 8; i > 0; i--) 992897Seric *q++ = *p++; 1002897Seric 1012897Seric /* -PST or -PDT */ 1022897Seric # ifdef V6 103293Seric if (localtime(&t)->tm_isdst) 1044315Seric p = DstTimezone; 105293Seric else 1064315Seric p = StdTimezone; 1072897Seric # else 1082897Seric p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 1092897Seric # endif V6 1102897Seric if (p[3] != '\0') 1112897Seric { 1122897Seric /* hours from GMT */ 1132897Seric p += 3; 1142897Seric *q++ = *p++; 1152897Seric if (p[1] == ':') 1162897Seric *q++ = '0'; 1172897Seric else 1182897Seric *q++ = *p++; 1192897Seric *q++ = *p++; 1202897Seric p++; /* skip ``:'' */ 1212897Seric *q++ = *p++; 1222897Seric *q++ = *p++; 1232897Seric } 1242897Seric else 1252897Seric { 1262897Seric *q++ = '-'; 1272897Seric *q++ = *p++; 1282897Seric *q++ = *p++; 1292897Seric *q++ = *p++; 1302897Seric } 1312897Seric 132*5184Seric p = &ud[0]; /* Mon */ 133*5184Seric *q++ = ' '; 134*5184Seric *q++ = '('; 135*5184Seric *q++ = *p++; 136*5184Seric *q++ = *p++; 137*5184Seric *q++ = *p++; 138*5184Seric *q++ = ')'; 1393568Seric 1402897Seric *q = '\0'; 141293Seric return (b); 142293Seric } 143