1293Seric # include <time.h>
22897Seric # ifndef V6
32897Seric # include <sys/types.h>
42897Seric # include <sys/timeb.h>
52897Seric # endif
6293Seric 
7*4315Seric static char SccsId[] = "@(#)arpadate.c	3.6	09/06/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.
29*4315Seric **
30*4315Seric **		Some sites are now inserting the timezone into the
31*4315Seric **		local date.  This routine should figure out what
32*4315Seric **		the format is and work appropriately.
33293Seric */
34293Seric 
352897Seric # define NULL		0
362897Seric 
373381Seric struct cvttab
383381Seric {
393381Seric 	char	*old;
403381Seric 	char	*new;
413381Seric };
423381Seric 
433381Seric struct cvttab	DowTab[] =
443381Seric {
453381Seric 	"Sun",		"Sunday",
463381Seric 	"Mon",		"Monday",
473381Seric 	"Tue",		"Tuesday",
483381Seric 	"Wed",		"Wednesday",
493381Seric 	"Thu",		"Thursday",
503381Seric 	"Fri",		"Friday",
513381Seric 	"Sat",		"Saturday",
523381Seric 	NULL,		NULL
533381Seric };
543381Seric 
553381Seric struct cvttab	MonthTab[] =
563381Seric {
573381Seric 	"Jan",		"January",
583381Seric 	"Feb",		"February",
593381Seric 	"Mar",		"March",
603381Seric 	"Apr",		"April",
613381Seric 	"May",		"May",
623381Seric 	"Jun",		"June",
633381Seric 	"Jul",		"July",
643381Seric 	"Aug",		"August",
653381Seric 	"Sep",		"September",
663381Seric 	"Oct",		"October",
673381Seric 	"Nov",		"November",
683381Seric 	"Dec",		"December",
693381Seric 	NULL,		NULL
703381Seric };
713381Seric 
721586Seric char *
732897Seric arpadate(ud)
742897Seric 	register char *ud;
75293Seric {
76293Seric 	register char *p;
772897Seric 	register char *q;
78293Seric 	static char b[40];
791586Seric 	extern char *ctime();
802897Seric 	register int i;
813381Seric 	struct cvttab *c;
822897Seric 	extern struct tm *localtime();
832897Seric # ifdef V6
842897Seric 	long t;
85*4315Seric 	extern char *StdTimezone, *DstTimezone;
86*4315Seric 	extern long time();
872897Seric # else
882897Seric 	struct timeb t;
892897Seric 	extern struct timeb *ftime();
902897Seric 	extern char *timezone();
912897Seric # endif
92293Seric 
93*4315Seric 	/*
94*4315Seric 	**  Get current time.
95*4315Seric 	**	This will be used if a null argument is passed and
96*4315Seric 	**	to resolve the timezone.
97*4315Seric 	*/
98*4315Seric 
992897Seric # ifdef V6
100*4315Seric 	(void) time(&t);
1012897Seric 	if (ud == NULL)
1022897Seric 		ud = ctime(&t);
1032897Seric # else
1042897Seric 	ftime(&t);
1052897Seric 	if (ud == NULL)
1062897Seric 		ud = ctime(&t.time);
1072897Seric # endif
108293Seric 
109*4315Seric 	/*
110*4315Seric 	**  Crack the UNIX date line in a singularly unoriginal way.
111*4315Seric 	*/
112*4315Seric 
1132897Seric 	q = b;
1142897Seric 
115293Seric 	p = &ud[8];		/* 16 */
116293Seric 	if (*p == ' ')
117293Seric 		p++;
1182897Seric 	else
1192897Seric 		*q++ = *p++;
1202897Seric 	*q++ = *p++;
1212966Seric 	*q++ = ' ';
1222897Seric 
1233381Seric 	p = NULL;		/* Sep */
1243381Seric 	for (c = MonthTab; c->old != NULL; c++)
1253381Seric 	{
1263381Seric 		if (strncmp(&ud[4], c->old, 3) == 0)
1273381Seric 		{
1283381Seric 			p = c->new;
1293381Seric 			break;
1303381Seric 		}
1313381Seric 	}
1323381Seric 	if (p != NULL)
1333381Seric 	{
1343381Seric 		while (*p != '\0')
1353381Seric 			*q++ = *p++;
1363381Seric 	}
1373381Seric 	else
1383381Seric 	{
1393381Seric 		p = &ud[4];
1403381Seric 		*q++ = *p++;
1413381Seric 		*q++ = *p++;
1423381Seric 		*q++ = *p++;
1433381Seric 	}
1442966Seric 	*q++ = ' ';
1452897Seric 
1462897Seric 	p = &ud[20];		/* 1979 */
1472897Seric 	for (i = 4; i > 0; i--)
1482897Seric 		*q++ = *p++;
1492897Seric 	*q++ = ' ';
1502897Seric 
1512897Seric 	p = &ud[11];		/* 01:03:52 */
1523568Seric 	for (i = 5; i > 0; i--)
1532897Seric 		*q++ = *p++;
1542897Seric 
1552897Seric 				/* -PST or -PDT */
1562897Seric # ifdef V6
157293Seric 	if (localtime(&t)->tm_isdst)
158*4315Seric 		p = DstTimezone;
159293Seric 	else
160*4315Seric 		p = StdTimezone;
1612897Seric # else
1622897Seric 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
1632897Seric # endif V6
1642897Seric 	if (p[3] != '\0')
1652897Seric 	{
1662897Seric 		/* hours from GMT */
1672897Seric 		p += 3;
1682897Seric 		*q++ = *p++;
1692897Seric 		if (p[1] == ':')
1702897Seric 			*q++ = '0';
1712897Seric 		else
1722897Seric 			*q++ = *p++;
1732897Seric 		*q++ = *p++;
1742897Seric 		p++;		/* skip ``:'' */
1752897Seric 		*q++ = *p++;
1762897Seric 		*q++ = *p++;
1772897Seric 	}
1782897Seric 	else
1792897Seric 	{
1802897Seric 		*q++ = '-';
1812897Seric 		*q++ = *p++;
1822897Seric 		*q++ = *p++;
1832897Seric 		*q++ = *p++;
1842897Seric 	}
1852897Seric 
1863568Seric 	p = NULL;		/* Mon */
1873568Seric 	for (c = DowTab; c->old != NULL; c++)
1883568Seric 	{
1893568Seric 		if (strncmp(&ud[0], c->old, 3) == 0)
1903568Seric 		{
1913568Seric 			p = c->new;
1923568Seric 			break;
1933568Seric 		}
1943568Seric 	}
1953568Seric 	if (p != NULL)
1963568Seric 	{
1973568Seric 		*q++ = ' ';
1983568Seric 		*q++ = '(';
1993568Seric 		while (*p != '\0')
2003568Seric 			*q++ = *p++;
2013568Seric 		*q++ = ')';
2023568Seric 	}
2033568Seric 
2042897Seric 	*q = '\0';
2052897Seric 
206293Seric 	return (b);
207293Seric }
208