19152Seric # include "conf.h" 2293Seric # include <time.h> 32897Seric # ifndef V6 42897Seric # include <sys/types.h> 52897Seric # include <sys/timeb.h> 62897Seric # endif 74437Seric # include "useful.h" 8293Seric 9*10251Seric SCCSID(@(#)arpadate.c 3.11 01/12/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 79293Seric p = &ud[8]; /* 16 */ 80293Seric if (*p == ' ') 81293Seric p++; 822897Seric else 832897Seric *q++ = *p++; 842897Seric *q++ = *p++; 85*10251Seric *q++ = ' '; 862897Seric 875184Seric p = &ud[4]; /* Sep */ 885184Seric *q++ = *p++; 895184Seric *q++ = *p++; 905184Seric *q++ = *p++; 91*10251Seric *q++ = ' '; 922897Seric 935184Seric p = &ud[22]; /* 1979 */ 945184Seric *q++ = *p++; 955184Seric *q++ = *p++; 962897Seric *q++ = ' '; 972897Seric 982897Seric p = &ud[11]; /* 01:03:52 */ 995184Seric for (i = 8; i > 0; i--) 1002897Seric *q++ = *p++; 1012897Seric 1022897Seric /* -PST or -PDT */ 1032897Seric # ifdef V6 104293Seric if (localtime(&t)->tm_isdst) 1054315Seric p = DstTimezone; 106293Seric else 1074315Seric p = StdTimezone; 1082897Seric # else 1092897Seric p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 1102897Seric # endif V6 1112897Seric if (p[3] != '\0') 1122897Seric { 1132897Seric /* hours from GMT */ 1142897Seric p += 3; 1152897Seric *q++ = *p++; 1162897Seric if (p[1] == ':') 1172897Seric *q++ = '0'; 1182897Seric else 1192897Seric *q++ = *p++; 1202897Seric *q++ = *p++; 1212897Seric p++; /* skip ``:'' */ 1222897Seric *q++ = *p++; 1232897Seric *q++ = *p++; 1242897Seric } 1252897Seric else 1262897Seric { 127*10251Seric *q++ = ' '; 1282897Seric *q++ = *p++; 1292897Seric *q++ = *p++; 1302897Seric *q++ = *p++; 1312897Seric } 1322897Seric 1335184Seric p = &ud[0]; /* Mon */ 1345184Seric *q++ = ' '; 1355184Seric *q++ = '('; 1365184Seric *q++ = *p++; 1375184Seric *q++ = *p++; 1385184Seric *q++ = *p++; 1395184Seric *q++ = ')'; 1403568Seric 1412897Seric *q = '\0'; 142293Seric return (b); 143293Seric } 144