19152Seric # include "conf.h" 213587Swnj # include <sys/time.h> 32897Seric # ifndef V6 42897Seric # include <sys/types.h> 52897Seric # include <sys/timeb.h> 62897Seric # endif 74437Seric # include "useful.h" 8293Seric 9*13932Seric SCCSID(@(#)arpadate.c 3.13 07/13/83); 10403Seric 11293Seric /* 12293Seric ** ARPADATE -- Create date in ARPANET format 13293Seric ** 14293Seric ** Parameters: 152897Seric ** ud -- unix style date string. if NULL, one is created. 16293Seric ** 17293Seric ** Returns: 18293Seric ** pointer to an ARPANET date field 19293Seric ** 20293Seric ** Side Effects: 21293Seric ** none 22293Seric ** 23293Seric ** WARNING: 24293Seric ** date is stored in a local buffer -- subsequent 25293Seric ** calls will overwrite. 263185Seric ** 273185Seric ** Bugs: 283185Seric ** Timezone is computed from local time, rather than 293185Seric ** from whereever (and whenever) the message was sent. 303185Seric ** To do better is very hard. 314315Seric ** 324315Seric ** Some sites are now inserting the timezone into the 334315Seric ** local date. This routine should figure out what 344315Seric ** the format is and work appropriately. 35293Seric */ 36293Seric 371586Seric char * 382897Seric arpadate(ud) 392897Seric register char *ud; 40293Seric { 41293Seric register char *p; 422897Seric register char *q; 43293Seric static char b[40]; 441586Seric extern char *ctime(); 452897Seric register int i; 462897Seric extern struct tm *localtime(); 472897Seric # ifdef V6 482897Seric long t; 494315Seric extern char *StdTimezone, *DstTimezone; 504315Seric extern long time(); 512897Seric # else 522897Seric struct timeb t; 532897Seric extern struct timeb *ftime(); 542897Seric extern char *timezone(); 552897Seric # endif 56293Seric 574315Seric /* 584315Seric ** Get current time. 594315Seric ** This will be used if a null argument is passed and 604315Seric ** to resolve the timezone. 614315Seric */ 624315Seric 632897Seric # ifdef V6 644315Seric (void) time(&t); 652897Seric if (ud == NULL) 662897Seric ud = ctime(&t); 672897Seric # else 682897Seric ftime(&t); 692897Seric if (ud == NULL) 702897Seric ud = ctime(&t.time); 712897Seric # endif 72293Seric 734315Seric /* 744315Seric ** Crack the UNIX date line in a singularly unoriginal way. 754315Seric */ 764315Seric 772897Seric q = b; 782897Seric 79*13932Seric p = &ud[0]; /* Mon */ 80*13932Seric *q++ = *p++; 81*13932Seric *q++ = *p++; 82*13932Seric *q++ = *p++; 83*13932Seric *q++ = ','; 84*13932Seric *q++ = ' '; 85*13932Seric 86293Seric p = &ud[8]; /* 16 */ 87293Seric if (*p == ' ') 88293Seric p++; 892897Seric else 902897Seric *q++ = *p++; 912897Seric *q++ = *p++; 9210251Seric *q++ = ' '; 932897Seric 945184Seric p = &ud[4]; /* Sep */ 955184Seric *q++ = *p++; 965184Seric *q++ = *p++; 975184Seric *q++ = *p++; 9810251Seric *q++ = ' '; 992897Seric 100*13932Seric p = &ud[22]; /* 79 */ 1015184Seric *q++ = *p++; 1025184Seric *q++ = *p++; 1032897Seric *q++ = ' '; 1042897Seric 1052897Seric p = &ud[11]; /* 01:03:52 */ 1065184Seric for (i = 8; i > 0; i--) 1072897Seric *q++ = *p++; 1082897Seric 1092897Seric /* -PST or -PDT */ 1102897Seric # ifdef V6 111293Seric if (localtime(&t)->tm_isdst) 1124315Seric p = DstTimezone; 113293Seric else 1144315Seric p = StdTimezone; 1152897Seric # else 1162897Seric p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 1172897Seric # endif V6 1182897Seric if (p[3] != '\0') 1192897Seric { 1202897Seric /* hours from GMT */ 1212897Seric p += 3; 1222897Seric *q++ = *p++; 1232897Seric if (p[1] == ':') 1242897Seric *q++ = '0'; 1252897Seric else 1262897Seric *q++ = *p++; 1272897Seric *q++ = *p++; 1282897Seric p++; /* skip ``:'' */ 1292897Seric *q++ = *p++; 1302897Seric *q++ = *p++; 1312897Seric } 1322897Seric else 1332897Seric { 13410251Seric *q++ = ' '; 1352897Seric *q++ = *p++; 1362897Seric *q++ = *p++; 1372897Seric *q++ = *p++; 1382897Seric } 1392897Seric 1402897Seric *q = '\0'; 141293Seric return (b); 142293Seric } 143