1 # include <time.h> 2 # ifndef V6 3 # include <sys/types.h> 4 # include <sys/timeb.h> 5 # endif 6 7 static char SccsId[] = "@(#)arpadate.c 3.4 03/27/81"; 8 9 /* 10 ** ARPADATE -- Create date in ARPANET format 11 ** 12 ** Parameters: 13 ** ud -- unix style date string. if NULL, one is created. 14 ** 15 ** Returns: 16 ** pointer to an ARPANET date field 17 ** 18 ** Side Effects: 19 ** none 20 ** 21 ** WARNING: 22 ** date is stored in a local buffer -- subsequent 23 ** calls will overwrite. 24 ** 25 ** Bugs: 26 ** Timezone is computed from local time, rather than 27 ** from whereever (and whenever) the message was sent. 28 ** To do better is very hard. 29 */ 30 31 # ifdef V6 32 # define DST_NAME "PDT" 33 # define STD_NAME "PST" 34 # endif 35 36 # define NULL 0 37 38 struct cvttab 39 { 40 char *old; 41 char *new; 42 }; 43 44 struct cvttab DowTab[] = 45 { 46 "Sun", "Sunday", 47 "Mon", "Monday", 48 "Tue", "Tuesday", 49 "Wed", "Wednesday", 50 "Thu", "Thursday", 51 "Fri", "Friday", 52 "Sat", "Saturday", 53 NULL, NULL 54 }; 55 56 struct cvttab MonthTab[] = 57 { 58 "Jan", "January", 59 "Feb", "February", 60 "Mar", "March", 61 "Apr", "April", 62 "May", "May", 63 "Jun", "June", 64 "Jul", "July", 65 "Aug", "August", 66 "Sep", "September", 67 "Oct", "October", 68 "Nov", "November", 69 "Dec", "December", 70 NULL, NULL 71 }; 72 73 char * 74 arpadate(ud) 75 register char *ud; 76 { 77 register char *p; 78 register char *q; 79 static char b[40]; 80 extern char *ctime(); 81 register int i; 82 struct cvttab *c; 83 extern struct tm *localtime(); 84 # ifdef V6 85 long t; 86 # else 87 struct timeb t; 88 extern struct timeb *ftime(); 89 extern char *timezone(); 90 # endif 91 92 # ifdef V6 93 time(&t); 94 if (ud == NULL) 95 ud = ctime(&t); 96 # else 97 ftime(&t); 98 if (ud == NULL) 99 ud = ctime(&t.time); 100 # endif 101 102 q = b; 103 104 p = NULL; /* Mon */ 105 for (c = DowTab; c->old != NULL; c++) 106 { 107 if (strncmp(&ud[0], c->old, 3) == 0) 108 { 109 p = c->new; 110 break; 111 } 112 } 113 if (p != NULL) 114 { 115 while (*p != '\0') 116 *q++ = *p++; 117 *q++ = ','; 118 *q++ = ' '; 119 } 120 121 p = &ud[8]; /* 16 */ 122 if (*p == ' ') 123 p++; 124 else 125 *q++ = *p++; 126 *q++ = *p++; 127 *q++ = ' '; 128 129 p = NULL; /* Sep */ 130 for (c = MonthTab; c->old != NULL; c++) 131 { 132 if (strncmp(&ud[4], c->old, 3) == 0) 133 { 134 p = c->new; 135 break; 136 } 137 } 138 if (p != NULL) 139 { 140 while (*p != '\0') 141 *q++ = *p++; 142 } 143 else 144 { 145 p = &ud[4]; 146 *q++ = *p++; 147 *q++ = *p++; 148 *q++ = *p++; 149 } 150 *q++ = ' '; 151 152 p = &ud[20]; /* 1979 */ 153 for (i = 4; i > 0; i--) 154 *q++ = *p++; 155 *q++ = ' '; 156 157 p = &ud[11]; /* 01:03:52 */ 158 for (i = 8; i > 0; i--) 159 *q++ = *p++; 160 161 /* -PST or -PDT */ 162 # ifdef V6 163 if (localtime(&t)->tm_isdst) 164 p = DST_NAME; 165 else 166 p = STD_NAME; 167 # else 168 p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 169 # endif V6 170 if (p[3] != '\0') 171 { 172 /* hours from GMT */ 173 p += 3; 174 *q++ = *p++; 175 if (p[1] == ':') 176 *q++ = '0'; 177 else 178 *q++ = *p++; 179 *q++ = *p++; 180 p++; /* skip ``:'' */ 181 *q++ = *p++; 182 *q++ = *p++; 183 } 184 else 185 { 186 *q++ = '-'; 187 *q++ = *p++; 188 *q++ = *p++; 189 *q++ = *p++; 190 } 191 192 *q = '\0'; 193 194 return (b); 195 } 196