1293Seric # include <time.h> 22897Seric # ifndef V6 32897Seric # include <sys/types.h> 42897Seric # include <sys/timeb.h> 52897Seric # endif 6293Seric 7*3568Seric static char SccsId[] = "@(#)arpadate.c 3.5 04/20/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. 29293Seric */ 30293Seric 312897Seric # ifdef V6 322897Seric # define DST_NAME "PDT" 332897Seric # define STD_NAME "PST" 342897Seric # endif 352897Seric 362897Seric # define NULL 0 372897Seric 383381Seric struct cvttab 393381Seric { 403381Seric char *old; 413381Seric char *new; 423381Seric }; 433381Seric 443381Seric struct cvttab DowTab[] = 453381Seric { 463381Seric "Sun", "Sunday", 473381Seric "Mon", "Monday", 483381Seric "Tue", "Tuesday", 493381Seric "Wed", "Wednesday", 503381Seric "Thu", "Thursday", 513381Seric "Fri", "Friday", 523381Seric "Sat", "Saturday", 533381Seric NULL, NULL 543381Seric }; 553381Seric 563381Seric struct cvttab MonthTab[] = 573381Seric { 583381Seric "Jan", "January", 593381Seric "Feb", "February", 603381Seric "Mar", "March", 613381Seric "Apr", "April", 623381Seric "May", "May", 633381Seric "Jun", "June", 643381Seric "Jul", "July", 653381Seric "Aug", "August", 663381Seric "Sep", "September", 673381Seric "Oct", "October", 683381Seric "Nov", "November", 693381Seric "Dec", "December", 703381Seric NULL, NULL 713381Seric }; 723381Seric 731586Seric char * 742897Seric arpadate(ud) 752897Seric register char *ud; 76293Seric { 77293Seric register char *p; 782897Seric register char *q; 79293Seric static char b[40]; 801586Seric extern char *ctime(); 812897Seric register int i; 823381Seric struct cvttab *c; 832897Seric extern struct tm *localtime(); 842897Seric # ifdef V6 852897Seric long t; 862897Seric # else 872897Seric struct timeb t; 882897Seric extern struct timeb *ftime(); 892897Seric extern char *timezone(); 902897Seric # endif 91293Seric 922897Seric # ifdef V6 93293Seric time(&t); 942897Seric if (ud == NULL) 952897Seric ud = ctime(&t); 962897Seric # else 972897Seric ftime(&t); 982897Seric if (ud == NULL) 992897Seric ud = ctime(&t.time); 1002897Seric # endif 101293Seric 1022897Seric q = b; 1032897Seric 104293Seric p = &ud[8]; /* 16 */ 105293Seric if (*p == ' ') 106293Seric p++; 1072897Seric else 1082897Seric *q++ = *p++; 1092897Seric *q++ = *p++; 1102966Seric *q++ = ' '; 1112897Seric 1123381Seric p = NULL; /* Sep */ 1133381Seric for (c = MonthTab; c->old != NULL; c++) 1143381Seric { 1153381Seric if (strncmp(&ud[4], c->old, 3) == 0) 1163381Seric { 1173381Seric p = c->new; 1183381Seric break; 1193381Seric } 1203381Seric } 1213381Seric if (p != NULL) 1223381Seric { 1233381Seric while (*p != '\0') 1243381Seric *q++ = *p++; 1253381Seric } 1263381Seric else 1273381Seric { 1283381Seric p = &ud[4]; 1293381Seric *q++ = *p++; 1303381Seric *q++ = *p++; 1313381Seric *q++ = *p++; 1323381Seric } 1332966Seric *q++ = ' '; 1342897Seric 1352897Seric p = &ud[20]; /* 1979 */ 1362897Seric for (i = 4; i > 0; i--) 1372897Seric *q++ = *p++; 1382897Seric *q++ = ' '; 1392897Seric 1402897Seric p = &ud[11]; /* 01:03:52 */ 141*3568Seric for (i = 5; i > 0; i--) 1422897Seric *q++ = *p++; 1432897Seric 1442897Seric /* -PST or -PDT */ 1452897Seric # ifdef V6 146293Seric if (localtime(&t)->tm_isdst) 1472897Seric p = DST_NAME; 148293Seric else 1492897Seric p = STD_NAME; 1502897Seric # else 1512897Seric p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 1522897Seric # endif V6 1532897Seric if (p[3] != '\0') 1542897Seric { 1552897Seric /* hours from GMT */ 1562897Seric p += 3; 1572897Seric *q++ = *p++; 1582897Seric if (p[1] == ':') 1592897Seric *q++ = '0'; 1602897Seric else 1612897Seric *q++ = *p++; 1622897Seric *q++ = *p++; 1632897Seric p++; /* skip ``:'' */ 1642897Seric *q++ = *p++; 1652897Seric *q++ = *p++; 1662897Seric } 1672897Seric else 1682897Seric { 1692897Seric *q++ = '-'; 1702897Seric *q++ = *p++; 1712897Seric *q++ = *p++; 1722897Seric *q++ = *p++; 1732897Seric } 1742897Seric 175*3568Seric p = NULL; /* Mon */ 176*3568Seric for (c = DowTab; c->old != NULL; c++) 177*3568Seric { 178*3568Seric if (strncmp(&ud[0], c->old, 3) == 0) 179*3568Seric { 180*3568Seric p = c->new; 181*3568Seric break; 182*3568Seric } 183*3568Seric } 184*3568Seric if (p != NULL) 185*3568Seric { 186*3568Seric *q++ = ' '; 187*3568Seric *q++ = '('; 188*3568Seric while (*p != '\0') 189*3568Seric *q++ = *p++; 190*3568Seric *q++ = ')'; 191*3568Seric } 192*3568Seric 1932897Seric *q = '\0'; 1942897Seric 195293Seric return (b); 196293Seric } 197