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.3 03/11/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 char * 39 arpadate(ud) 40 register char *ud; 41 { 42 register char *p; 43 register char *q; 44 static char b[40]; 45 extern char *ctime(); 46 register int i; 47 extern struct tm *localtime(); 48 # ifdef V6 49 long t; 50 # else 51 struct timeb t; 52 extern struct timeb *ftime(); 53 extern char *timezone(); 54 # endif 55 56 # ifdef V6 57 time(&t); 58 if (ud == NULL) 59 ud = ctime(&t); 60 # else 61 ftime(&t); 62 if (ud == NULL) 63 ud = ctime(&t.time); 64 # endif 65 66 q = b; 67 68 p = &ud[0]; /* Mon */ 69 *q++ = *p++; 70 *q++ = *p++; 71 *q++ = *p++; 72 *q++ = ','; 73 *q++ = ' '; 74 75 p = &ud[8]; /* 16 */ 76 if (*p == ' ') 77 p++; 78 else 79 *q++ = *p++; 80 *q++ = *p++; 81 *q++ = ' '; 82 83 p = &ud[4]; /* Sep */ 84 *q++ = *p++; 85 *q++ = *p++; 86 *q++ = *p++; 87 *q++ = ' '; 88 89 p = &ud[20]; /* 1979 */ 90 for (i = 4; i > 0; i--) 91 *q++ = *p++; 92 *q++ = ' '; 93 94 p = &ud[11]; /* 01:03:52 */ 95 for (i = 8; i > 0; i--) 96 *q++ = *p++; 97 98 /* -PST or -PDT */ 99 # ifdef V6 100 if (localtime(&t)->tm_isdst) 101 p = DST_NAME; 102 else 103 p = STD_NAME; 104 # else 105 p = timezone(t.timezone, localtime(&t.time)->tm_isdst); 106 # endif V6 107 if (p[3] != '\0') 108 { 109 /* hours from GMT */ 110 p += 3; 111 *q++ = *p++; 112 if (p[1] == ':') 113 *q++ = '0'; 114 else 115 *q++ = *p++; 116 *q++ = *p++; 117 p++; /* skip ``:'' */ 118 *q++ = *p++; 119 *q++ = *p++; 120 } 121 else 122 { 123 *q++ = '-'; 124 *q++ = *p++; 125 *q++ = *p++; 126 *q++ = *p++; 127 } 128 129 *q = '\0'; 130 131 return (b); 132 } 133