1293Seric # include <time.h> 22897Seric # ifndef V6 32897Seric # include <sys/types.h> 42897Seric # include <sys/timeb.h> 52897Seric # endif 6293Seric 7*4315Seric static char SccsId[] = "@(#)arpadate.c 3.6 09/06/81"; 8403Seric 9293Seric /* 10293Seric ** ARPADATE -- Create date in ARPANET format 11293Seric ** 12293Seric ** Parameters: 132897Seric ** ud -- unix style date string. if NULL, one is created. 14293Seric ** 15293Seric ** Returns: 16293Seric ** pointer to an ARPANET date field 17293Seric ** 18293Seric ** Side Effects: 19293Seric ** none 20293Seric ** 21293Seric ** WARNING: 22293Seric ** date is stored in a local buffer -- subsequent 23293Seric ** calls will overwrite. 243185Seric ** 253185Seric ** Bugs: 263185Seric ** Timezone is computed from local time, rather than 273185Seric ** from whereever (and whenever) the message was sent. 283185Seric ** To do better is very hard. 29*4315Seric ** 30*4315Seric ** Some sites are now inserting the timezone into the 31*4315Seric ** local date. This routine should figure out what 32*4315Seric ** the format is and work appropriately. 33293Seric */ 34293Seric 352897Seric # define NULL 0 362897Seric 373381Seric struct cvttab 383381Seric { 393381Seric char *old; 403381Seric char *new; 413381Seric }; 423381Seric 433381Seric struct cvttab DowTab[] = 443381Seric { 453381Seric "Sun", "Sunday", 463381Seric "Mon", "Monday", 473381Seric "Tue", "Tuesday", 483381Seric "Wed", "Wednesday", 493381Seric "Thu", "Thursday", 503381Seric "Fri", "Friday", 513381Seric "Sat", "Saturday", 523381Seric NULL, NULL 533381Seric }; 543381Seric 553381Seric struct cvttab MonthTab[] = 563381Seric { 573381Seric "Jan", "January", 583381Seric "Feb", "February", 593381Seric "Mar", "March", 603381Seric "Apr", "April", 613381Seric "May", "May", 623381Seric "Jun", "June", 633381Seric "Jul", "July", 643381Seric "Aug", "August", 653381Seric "Sep", "September", 663381Seric "Oct", "October", 673381Seric "Nov", "November", 683381Seric "Dec", "December", 693381Seric NULL, NULL 703381Seric }; 713381Seric 721586Seric char * 732897Seric arpadate(ud) 742897Seric register char *ud; 75293Seric { 76293Seric register char *p; 772897Seric register char *q; 78293Seric static char b[40]; 791586Seric extern char *ctime(); 802897Seric register int i; 813381Seric struct cvttab *c; 822897Seric extern struct tm *localtime(); 832897Seric # ifdef V6 842897Seric long t; 85*4315Seric extern char *StdTimezone, *DstTimezone; 86*4315Seric extern long time(); 872897Seric # else 882897Seric struct timeb t; 892897Seric extern struct timeb *ftime(); 902897Seric extern char *timezone(); 912897Seric # endif 92293Seric 93*4315Seric /* 94*4315Seric ** Get current time. 95*4315Seric ** This will be used if a null argument is passed and 96*4315Seric ** to resolve the timezone. 97*4315Seric */ 98*4315Seric 992897Seric # ifdef V6 100*4315Seric (void) time(&t); 1012897Seric if (ud == NULL) 1022897Seric ud = ctime(&t); 1032897Seric # else 1042897Seric ftime(&t); 1052897Seric if (ud == NULL) 1062897Seric ud = ctime(&t.time); 1072897Seric # endif 108293Seric 109*4315Seric /* 110*4315Seric ** Crack the UNIX date line in a singularly unoriginal way. 111*4315Seric */ 112*4315Seric 1132897Seric q = b; 1142897Seric 115293Seric p = &ud[8]; /* 16 */ 116293Seric if (*p == ' ') 117293Seric p++; 1182897Seric else 1192897Seric *q++ = *p++; 1202897Seric *q++ = *p++; 1212966Seric *q++ = ' '; 1222897Seric 1233381Seric p = NULL; /* Sep */ 1243381Seric for (c = MonthTab; c->old != NULL; c++) 1253381Seric { 1263381Seric if (strncmp(&ud[4], c->old, 3) == 0) 1273381Seric { 1283381Seric p = c->new; 1293381Seric break; 1303381Seric } 1313381Seric } 1323381Seric if (p != NULL) 1333381Seric { 1343381Seric while (*p != '\0') 1353381Seric *q++ = *p++; 1363381Seric } 1373381Seric else 1383381Seric { 1393381Seric p = &ud[4]; 1403381Seric *q++ = *p++; 1413381Seric *q++ = *p++; 1423381Seric *q++ = *p++; 1433381Seric } 1442966Seric *q++ = ' '; 1452897Seric 1462897Seric p = &ud[20]; /* 1979 */ 1472897Seric for (i = 4; i > 0; i--) 1482897Seric *q++ = *p++; 1492897Seric *q++ = ' '; 1502897Seric 1512897Seric p = &ud[11]; /* 01:03:52 */ 1523568Seric for (i = 5; i > 0; i--) 1532897Seric *q++ = *p++; 1542897Seric 1552897Seric /* -PST or -PDT */ 1562897Seric # ifdef V6 157293Seric if (localtime(&t)->tm_isdst) 158*4315Seric p = DstTimezone; 159293Seric else 160*4315Seric p = StdTimezone; 1612897Seric # else 1622897Seric p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 1632897Seric # endif V6 1642897Seric if (p[3] != '\0') 1652897Seric { 1662897Seric /* hours from GMT */ 1672897Seric p += 3; 1682897Seric *q++ = *p++; 1692897Seric if (p[1] == ':') 1702897Seric *q++ = '0'; 1712897Seric else 1722897Seric *q++ = *p++; 1732897Seric *q++ = *p++; 1742897Seric p++; /* skip ``:'' */ 1752897Seric *q++ = *p++; 1762897Seric *q++ = *p++; 1772897Seric } 1782897Seric else 1792897Seric { 1802897Seric *q++ = '-'; 1812897Seric *q++ = *p++; 1822897Seric *q++ = *p++; 1832897Seric *q++ = *p++; 1842897Seric } 1852897Seric 1863568Seric p = NULL; /* Mon */ 1873568Seric for (c = DowTab; c->old != NULL; c++) 1883568Seric { 1893568Seric if (strncmp(&ud[0], c->old, 3) == 0) 1903568Seric { 1913568Seric p = c->new; 1923568Seric break; 1933568Seric } 1943568Seric } 1953568Seric if (p != NULL) 1963568Seric { 1973568Seric *q++ = ' '; 1983568Seric *q++ = '('; 1993568Seric while (*p != '\0') 2003568Seric *q++ = *p++; 2013568Seric *q++ = ')'; 2023568Seric } 2033568Seric 2042897Seric *q = '\0'; 2052897Seric 206293Seric return (b); 207293Seric } 208