1293Seric # include <time.h> 22897Seric # ifndef V6 32897Seric # include <sys/types.h> 42897Seric # include <sys/timeb.h> 52897Seric # endif 6*4437Seric # include "useful.h" 7293Seric 8*4437Seric static char SccsId[] = "@(#)arpadate.c 3.7 09/24/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 363381Seric struct cvttab 373381Seric { 383381Seric char *old; 393381Seric char *new; 403381Seric }; 413381Seric 423381Seric struct cvttab DowTab[] = 433381Seric { 443381Seric "Sun", "Sunday", 453381Seric "Mon", "Monday", 463381Seric "Tue", "Tuesday", 473381Seric "Wed", "Wednesday", 483381Seric "Thu", "Thursday", 493381Seric "Fri", "Friday", 503381Seric "Sat", "Saturday", 513381Seric NULL, NULL 523381Seric }; 533381Seric 543381Seric struct cvttab MonthTab[] = 553381Seric { 563381Seric "Jan", "January", 573381Seric "Feb", "February", 583381Seric "Mar", "March", 593381Seric "Apr", "April", 603381Seric "May", "May", 613381Seric "Jun", "June", 623381Seric "Jul", "July", 633381Seric "Aug", "August", 643381Seric "Sep", "September", 653381Seric "Oct", "October", 663381Seric "Nov", "November", 673381Seric "Dec", "December", 683381Seric NULL, NULL 693381Seric }; 703381Seric 711586Seric char * 722897Seric arpadate(ud) 732897Seric register char *ud; 74293Seric { 75293Seric register char *p; 762897Seric register char *q; 77293Seric static char b[40]; 781586Seric extern char *ctime(); 792897Seric register int i; 803381Seric struct cvttab *c; 812897Seric extern struct tm *localtime(); 822897Seric # ifdef V6 832897Seric long t; 844315Seric extern char *StdTimezone, *DstTimezone; 854315Seric extern long time(); 862897Seric # else 872897Seric struct timeb t; 882897Seric extern struct timeb *ftime(); 892897Seric extern char *timezone(); 902897Seric # endif 91293Seric 924315Seric /* 934315Seric ** Get current time. 944315Seric ** This will be used if a null argument is passed and 954315Seric ** to resolve the timezone. 964315Seric */ 974315Seric 982897Seric # ifdef V6 994315Seric (void) time(&t); 1002897Seric if (ud == NULL) 1012897Seric ud = ctime(&t); 1022897Seric # else 1032897Seric ftime(&t); 1042897Seric if (ud == NULL) 1052897Seric ud = ctime(&t.time); 1062897Seric # endif 107293Seric 1084315Seric /* 1094315Seric ** Crack the UNIX date line in a singularly unoriginal way. 1104315Seric */ 1114315Seric 1122897Seric q = b; 1132897Seric 114293Seric p = &ud[8]; /* 16 */ 115293Seric if (*p == ' ') 116293Seric p++; 1172897Seric else 1182897Seric *q++ = *p++; 1192897Seric *q++ = *p++; 1202966Seric *q++ = ' '; 1212897Seric 1223381Seric p = NULL; /* Sep */ 1233381Seric for (c = MonthTab; c->old != NULL; c++) 1243381Seric { 1253381Seric if (strncmp(&ud[4], c->old, 3) == 0) 1263381Seric { 1273381Seric p = c->new; 1283381Seric break; 1293381Seric } 1303381Seric } 1313381Seric if (p != NULL) 1323381Seric { 1333381Seric while (*p != '\0') 1343381Seric *q++ = *p++; 1353381Seric } 1363381Seric else 1373381Seric { 1383381Seric p = &ud[4]; 1393381Seric *q++ = *p++; 1403381Seric *q++ = *p++; 1413381Seric *q++ = *p++; 1423381Seric } 1432966Seric *q++ = ' '; 1442897Seric 1452897Seric p = &ud[20]; /* 1979 */ 1462897Seric for (i = 4; i > 0; i--) 1472897Seric *q++ = *p++; 1482897Seric *q++ = ' '; 1492897Seric 1502897Seric p = &ud[11]; /* 01:03:52 */ 1513568Seric for (i = 5; i > 0; i--) 1522897Seric *q++ = *p++; 1532897Seric 1542897Seric /* -PST or -PDT */ 1552897Seric # ifdef V6 156293Seric if (localtime(&t)->tm_isdst) 1574315Seric p = DstTimezone; 158293Seric else 1594315Seric p = StdTimezone; 1602897Seric # else 1612897Seric p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 1622897Seric # endif V6 1632897Seric if (p[3] != '\0') 1642897Seric { 1652897Seric /* hours from GMT */ 1662897Seric p += 3; 1672897Seric *q++ = *p++; 1682897Seric if (p[1] == ':') 1692897Seric *q++ = '0'; 1702897Seric else 1712897Seric *q++ = *p++; 1722897Seric *q++ = *p++; 1732897Seric p++; /* skip ``:'' */ 1742897Seric *q++ = *p++; 1752897Seric *q++ = *p++; 1762897Seric } 1772897Seric else 1782897Seric { 1792897Seric *q++ = '-'; 1802897Seric *q++ = *p++; 1812897Seric *q++ = *p++; 1822897Seric *q++ = *p++; 1832897Seric } 1842897Seric 1853568Seric p = NULL; /* Mon */ 1863568Seric for (c = DowTab; c->old != NULL; c++) 1873568Seric { 1883568Seric if (strncmp(&ud[0], c->old, 3) == 0) 1893568Seric { 1903568Seric p = c->new; 1913568Seric break; 1923568Seric } 1933568Seric } 1943568Seric if (p != NULL) 1953568Seric { 1963568Seric *q++ = ' '; 1973568Seric *q++ = '('; 1983568Seric while (*p != '\0') 1993568Seric *q++ = *p++; 2003568Seric *q++ = ')'; 2013568Seric } 2023568Seric 2032897Seric *q = '\0'; 2042897Seric 205293Seric return (b); 206293Seric } 207