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