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