1293Seric # include <time.h> 22897Seric # ifndef V6 32897Seric # include <sys/types.h> 42897Seric # include <sys/timeb.h> 52897Seric # endif 6293Seric 7*3381Seric static char SccsId[] = "@(#)arpadate.c 3.4 03/27/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 38*3381Seric struct cvttab 39*3381Seric { 40*3381Seric char *old; 41*3381Seric char *new; 42*3381Seric }; 43*3381Seric 44*3381Seric struct cvttab DowTab[] = 45*3381Seric { 46*3381Seric "Sun", "Sunday", 47*3381Seric "Mon", "Monday", 48*3381Seric "Tue", "Tuesday", 49*3381Seric "Wed", "Wednesday", 50*3381Seric "Thu", "Thursday", 51*3381Seric "Fri", "Friday", 52*3381Seric "Sat", "Saturday", 53*3381Seric NULL, NULL 54*3381Seric }; 55*3381Seric 56*3381Seric struct cvttab MonthTab[] = 57*3381Seric { 58*3381Seric "Jan", "January", 59*3381Seric "Feb", "February", 60*3381Seric "Mar", "March", 61*3381Seric "Apr", "April", 62*3381Seric "May", "May", 63*3381Seric "Jun", "June", 64*3381Seric "Jul", "July", 65*3381Seric "Aug", "August", 66*3381Seric "Sep", "September", 67*3381Seric "Oct", "October", 68*3381Seric "Nov", "November", 69*3381Seric "Dec", "December", 70*3381Seric NULL, NULL 71*3381Seric }; 72*3381Seric 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; 82*3381Seric 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 104*3381Seric p = NULL; /* Mon */ 105*3381Seric for (c = DowTab; c->old != NULL; c++) 106*3381Seric { 107*3381Seric if (strncmp(&ud[0], c->old, 3) == 0) 108*3381Seric { 109*3381Seric p = c->new; 110*3381Seric break; 111*3381Seric } 112*3381Seric } 113*3381Seric if (p != NULL) 114*3381Seric { 115*3381Seric while (*p != '\0') 116*3381Seric *q++ = *p++; 117*3381Seric *q++ = ','; 118*3381Seric *q++ = ' '; 119*3381Seric } 1202897Seric 121293Seric p = &ud[8]; /* 16 */ 122293Seric if (*p == ' ') 123293Seric p++; 1242897Seric else 1252897Seric *q++ = *p++; 1262897Seric *q++ = *p++; 1272966Seric *q++ = ' '; 1282897Seric 129*3381Seric p = NULL; /* Sep */ 130*3381Seric for (c = MonthTab; c->old != NULL; c++) 131*3381Seric { 132*3381Seric if (strncmp(&ud[4], c->old, 3) == 0) 133*3381Seric { 134*3381Seric p = c->new; 135*3381Seric break; 136*3381Seric } 137*3381Seric } 138*3381Seric if (p != NULL) 139*3381Seric { 140*3381Seric while (*p != '\0') 141*3381Seric *q++ = *p++; 142*3381Seric } 143*3381Seric else 144*3381Seric { 145*3381Seric p = &ud[4]; 146*3381Seric *q++ = *p++; 147*3381Seric *q++ = *p++; 148*3381Seric *q++ = *p++; 149*3381Seric } 1502966Seric *q++ = ' '; 1512897Seric 1522897Seric p = &ud[20]; /* 1979 */ 1532897Seric for (i = 4; i > 0; i--) 1542897Seric *q++ = *p++; 1552897Seric *q++ = ' '; 1562897Seric 1572897Seric p = &ud[11]; /* 01:03:52 */ 1582897Seric for (i = 8; i > 0; i--) 1592897Seric *q++ = *p++; 1602897Seric 1612897Seric /* -PST or -PDT */ 1622897Seric # ifdef V6 163293Seric if (localtime(&t)->tm_isdst) 1642897Seric p = DST_NAME; 165293Seric else 1662897Seric p = STD_NAME; 1672897Seric # else 1682897Seric p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 1692897Seric # endif V6 1702897Seric if (p[3] != '\0') 1712897Seric { 1722897Seric /* hours from GMT */ 1732897Seric p += 3; 1742897Seric *q++ = *p++; 1752897Seric if (p[1] == ':') 1762897Seric *q++ = '0'; 1772897Seric else 1782897Seric *q++ = *p++; 1792897Seric *q++ = *p++; 1802897Seric p++; /* skip ``:'' */ 1812897Seric *q++ = *p++; 1822897Seric *q++ = *p++; 1832897Seric } 1842897Seric else 1852897Seric { 1862897Seric *q++ = '-'; 1872897Seric *q++ = *p++; 1882897Seric *q++ = *p++; 1892897Seric *q++ = *p++; 1902897Seric } 1912897Seric 1922897Seric *q = '\0'; 1932897Seric 194293Seric return (b); 195293Seric } 196