1293Seric # include <time.h>
22897Seric # ifndef V6
32897Seric # include <sys/types.h>
42897Seric # include <sys/timeb.h>
52897Seric # endif
6293Seric 
7*3568Seric static char SccsId[] = "@(#)arpadate.c	3.5	04/20/81";
8403Seric 
9293Seric /*
10293Seric **  ARPADATE -- Create date in ARPANET format
11293Seric **
12293Seric **	Parameters:
132897Seric **		ud -- unix style date string.  if NULL, one is created.
14293Seric **
15293Seric **	Returns:
16293Seric **		pointer to an ARPANET date field
17293Seric **
18293Seric **	Side Effects:
19293Seric **		none
20293Seric **
21293Seric **	WARNING:
22293Seric **		date is stored in a local buffer -- subsequent
23293Seric **		calls will overwrite.
243185Seric **
253185Seric **	Bugs:
263185Seric **		Timezone is computed from local time, rather than
273185Seric **		from whereever (and whenever) the message was sent.
283185Seric **		To do better is very hard.
29293Seric */
30293Seric 
312897Seric # ifdef V6
322897Seric # define DST_NAME	"PDT"
332897Seric # define STD_NAME	"PST"
342897Seric # endif
352897Seric 
362897Seric # define NULL		0
372897Seric 
383381Seric struct cvttab
393381Seric {
403381Seric 	char	*old;
413381Seric 	char	*new;
423381Seric };
433381Seric 
443381Seric struct cvttab	DowTab[] =
453381Seric {
463381Seric 	"Sun",		"Sunday",
473381Seric 	"Mon",		"Monday",
483381Seric 	"Tue",		"Tuesday",
493381Seric 	"Wed",		"Wednesday",
503381Seric 	"Thu",		"Thursday",
513381Seric 	"Fri",		"Friday",
523381Seric 	"Sat",		"Saturday",
533381Seric 	NULL,		NULL
543381Seric };
553381Seric 
563381Seric struct cvttab	MonthTab[] =
573381Seric {
583381Seric 	"Jan",		"January",
593381Seric 	"Feb",		"February",
603381Seric 	"Mar",		"March",
613381Seric 	"Apr",		"April",
623381Seric 	"May",		"May",
633381Seric 	"Jun",		"June",
643381Seric 	"Jul",		"July",
653381Seric 	"Aug",		"August",
663381Seric 	"Sep",		"September",
673381Seric 	"Oct",		"October",
683381Seric 	"Nov",		"November",
693381Seric 	"Dec",		"December",
703381Seric 	NULL,		NULL
713381Seric };
723381Seric 
731586Seric char *
742897Seric arpadate(ud)
752897Seric 	register char *ud;
76293Seric {
77293Seric 	register char *p;
782897Seric 	register char *q;
79293Seric 	static char b[40];
801586Seric 	extern char *ctime();
812897Seric 	register int i;
823381Seric 	struct cvttab *c;
832897Seric 	extern struct tm *localtime();
842897Seric # ifdef V6
852897Seric 	long t;
862897Seric # else
872897Seric 	struct timeb t;
882897Seric 	extern struct timeb *ftime();
892897Seric 	extern char *timezone();
902897Seric # endif
91293Seric 
922897Seric # ifdef V6
93293Seric 	time(&t);
942897Seric 	if (ud == NULL)
952897Seric 		ud = ctime(&t);
962897Seric # else
972897Seric 	ftime(&t);
982897Seric 	if (ud == NULL)
992897Seric 		ud = ctime(&t.time);
1002897Seric # endif
101293Seric 
1022897Seric 	q = b;
1032897Seric 
104293Seric 	p = &ud[8];		/* 16 */
105293Seric 	if (*p == ' ')
106293Seric 		p++;
1072897Seric 	else
1082897Seric 		*q++ = *p++;
1092897Seric 	*q++ = *p++;
1102966Seric 	*q++ = ' ';
1112897Seric 
1123381Seric 	p = NULL;		/* Sep */
1133381Seric 	for (c = MonthTab; c->old != NULL; c++)
1143381Seric 	{
1153381Seric 		if (strncmp(&ud[4], c->old, 3) == 0)
1163381Seric 		{
1173381Seric 			p = c->new;
1183381Seric 			break;
1193381Seric 		}
1203381Seric 	}
1213381Seric 	if (p != NULL)
1223381Seric 	{
1233381Seric 		while (*p != '\0')
1243381Seric 			*q++ = *p++;
1253381Seric 	}
1263381Seric 	else
1273381Seric 	{
1283381Seric 		p = &ud[4];
1293381Seric 		*q++ = *p++;
1303381Seric 		*q++ = *p++;
1313381Seric 		*q++ = *p++;
1323381Seric 	}
1332966Seric 	*q++ = ' ';
1342897Seric 
1352897Seric 	p = &ud[20];		/* 1979 */
1362897Seric 	for (i = 4; i > 0; i--)
1372897Seric 		*q++ = *p++;
1382897Seric 	*q++ = ' ';
1392897Seric 
1402897Seric 	p = &ud[11];		/* 01:03:52 */
141*3568Seric 	for (i = 5; i > 0; i--)
1422897Seric 		*q++ = *p++;
1432897Seric 
1442897Seric 				/* -PST or -PDT */
1452897Seric # ifdef V6
146293Seric 	if (localtime(&t)->tm_isdst)
1472897Seric 		p = DST_NAME;
148293Seric 	else
1492897Seric 		p = STD_NAME;
1502897Seric # else
1512897Seric 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
1522897Seric # endif V6
1532897Seric 	if (p[3] != '\0')
1542897Seric 	{
1552897Seric 		/* hours from GMT */
1562897Seric 		p += 3;
1572897Seric 		*q++ = *p++;
1582897Seric 		if (p[1] == ':')
1592897Seric 			*q++ = '0';
1602897Seric 		else
1612897Seric 			*q++ = *p++;
1622897Seric 		*q++ = *p++;
1632897Seric 		p++;		/* skip ``:'' */
1642897Seric 		*q++ = *p++;
1652897Seric 		*q++ = *p++;
1662897Seric 	}
1672897Seric 	else
1682897Seric 	{
1692897Seric 		*q++ = '-';
1702897Seric 		*q++ = *p++;
1712897Seric 		*q++ = *p++;
1722897Seric 		*q++ = *p++;
1732897Seric 	}
1742897Seric 
175*3568Seric 	p = NULL;		/* Mon */
176*3568Seric 	for (c = DowTab; c->old != NULL; c++)
177*3568Seric 	{
178*3568Seric 		if (strncmp(&ud[0], c->old, 3) == 0)
179*3568Seric 		{
180*3568Seric 			p = c->new;
181*3568Seric 			break;
182*3568Seric 		}
183*3568Seric 	}
184*3568Seric 	if (p != NULL)
185*3568Seric 	{
186*3568Seric 		*q++ = ' ';
187*3568Seric 		*q++ = '(';
188*3568Seric 		while (*p != '\0')
189*3568Seric 			*q++ = *p++;
190*3568Seric 		*q++ = ')';
191*3568Seric 	}
192*3568Seric 
1932897Seric 	*q = '\0';
1942897Seric 
195293Seric 	return (b);
196293Seric }
197