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.5 04/20/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 = &ud[8]; /* 16 */ 105 if (*p == ' ') 106 p++; 107 else 108 *q++ = *p++; 109 *q++ = *p++; 110 *q++ = ' '; 111 112 p = NULL; /* Sep */ 113 for (c = MonthTab; c->old != NULL; c++) 114 { 115 if (strncmp(&ud[4], c->old, 3) == 0) 116 { 117 p = c->new; 118 break; 119 } 120 } 121 if (p != NULL) 122 { 123 while (*p != '\0') 124 *q++ = *p++; 125 } 126 else 127 { 128 p = &ud[4]; 129 *q++ = *p++; 130 *q++ = *p++; 131 *q++ = *p++; 132 } 133 *q++ = ' '; 134 135 p = &ud[20]; /* 1979 */ 136 for (i = 4; i > 0; i--) 137 *q++ = *p++; 138 *q++ = ' '; 139 140 p = &ud[11]; /* 01:03:52 */ 141 for (i = 5; i > 0; i--) 142 *q++ = *p++; 143 144 /* -PST or -PDT */ 145 # ifdef V6 146 if (localtime(&t)->tm_isdst) 147 p = DST_NAME; 148 else 149 p = STD_NAME; 150 # else 151 p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 152 # endif V6 153 if (p[3] != '\0') 154 { 155 /* hours from GMT */ 156 p += 3; 157 *q++ = *p++; 158 if (p[1] == ':') 159 *q++ = '0'; 160 else 161 *q++ = *p++; 162 *q++ = *p++; 163 p++; /* skip ``:'' */ 164 *q++ = *p++; 165 *q++ = *p++; 166 } 167 else 168 { 169 *q++ = '-'; 170 *q++ = *p++; 171 *q++ = *p++; 172 *q++ = *p++; 173 } 174 175 p = NULL; /* Mon */ 176 for (c = DowTab; c->old != NULL; c++) 177 { 178 if (strncmp(&ud[0], c->old, 3) == 0) 179 { 180 p = c->new; 181 break; 182 } 183 } 184 if (p != NULL) 185 { 186 *q++ = ' '; 187 *q++ = '('; 188 while (*p != '\0') 189 *q++ = *p++; 190 *q++ = ')'; 191 } 192 193 *q = '\0'; 194 195 return (b); 196 } 197