1293Seric # include <time.h>
22897Seric # ifndef V6
32897Seric # include <sys/types.h>
42897Seric # include <sys/timeb.h>
52897Seric # endif
6*4437Seric # include "useful.h"
7293Seric 
8*4437Seric static char SccsId[] = "@(#)arpadate.c	3.7	09/24/81";
9403Seric 
10293Seric /*
11293Seric **  ARPADATE -- Create date in ARPANET format
12293Seric **
13293Seric **	Parameters:
142897Seric **		ud -- unix style date string.  if NULL, one is created.
15293Seric **
16293Seric **	Returns:
17293Seric **		pointer to an ARPANET date field
18293Seric **
19293Seric **	Side Effects:
20293Seric **		none
21293Seric **
22293Seric **	WARNING:
23293Seric **		date is stored in a local buffer -- subsequent
24293Seric **		calls will overwrite.
253185Seric **
263185Seric **	Bugs:
273185Seric **		Timezone is computed from local time, rather than
283185Seric **		from whereever (and whenever) the message was sent.
293185Seric **		To do better is very hard.
304315Seric **
314315Seric **		Some sites are now inserting the timezone into the
324315Seric **		local date.  This routine should figure out what
334315Seric **		the format is and work appropriately.
34293Seric */
35293Seric 
363381Seric struct cvttab
373381Seric {
383381Seric 	char	*old;
393381Seric 	char	*new;
403381Seric };
413381Seric 
423381Seric struct cvttab	DowTab[] =
433381Seric {
443381Seric 	"Sun",		"Sunday",
453381Seric 	"Mon",		"Monday",
463381Seric 	"Tue",		"Tuesday",
473381Seric 	"Wed",		"Wednesday",
483381Seric 	"Thu",		"Thursday",
493381Seric 	"Fri",		"Friday",
503381Seric 	"Sat",		"Saturday",
513381Seric 	NULL,		NULL
523381Seric };
533381Seric 
543381Seric struct cvttab	MonthTab[] =
553381Seric {
563381Seric 	"Jan",		"January",
573381Seric 	"Feb",		"February",
583381Seric 	"Mar",		"March",
593381Seric 	"Apr",		"April",
603381Seric 	"May",		"May",
613381Seric 	"Jun",		"June",
623381Seric 	"Jul",		"July",
633381Seric 	"Aug",		"August",
643381Seric 	"Sep",		"September",
653381Seric 	"Oct",		"October",
663381Seric 	"Nov",		"November",
673381Seric 	"Dec",		"December",
683381Seric 	NULL,		NULL
693381Seric };
703381Seric 
711586Seric char *
722897Seric arpadate(ud)
732897Seric 	register char *ud;
74293Seric {
75293Seric 	register char *p;
762897Seric 	register char *q;
77293Seric 	static char b[40];
781586Seric 	extern char *ctime();
792897Seric 	register int i;
803381Seric 	struct cvttab *c;
812897Seric 	extern struct tm *localtime();
822897Seric # ifdef V6
832897Seric 	long t;
844315Seric 	extern char *StdTimezone, *DstTimezone;
854315Seric 	extern long time();
862897Seric # else
872897Seric 	struct timeb t;
882897Seric 	extern struct timeb *ftime();
892897Seric 	extern char *timezone();
902897Seric # endif
91293Seric 
924315Seric 	/*
934315Seric 	**  Get current time.
944315Seric 	**	This will be used if a null argument is passed and
954315Seric 	**	to resolve the timezone.
964315Seric 	*/
974315Seric 
982897Seric # ifdef V6
994315Seric 	(void) time(&t);
1002897Seric 	if (ud == NULL)
1012897Seric 		ud = ctime(&t);
1022897Seric # else
1032897Seric 	ftime(&t);
1042897Seric 	if (ud == NULL)
1052897Seric 		ud = ctime(&t.time);
1062897Seric # endif
107293Seric 
1084315Seric 	/*
1094315Seric 	**  Crack the UNIX date line in a singularly unoriginal way.
1104315Seric 	*/
1114315Seric 
1122897Seric 	q = b;
1132897Seric 
114293Seric 	p = &ud[8];		/* 16 */
115293Seric 	if (*p == ' ')
116293Seric 		p++;
1172897Seric 	else
1182897Seric 		*q++ = *p++;
1192897Seric 	*q++ = *p++;
1202966Seric 	*q++ = ' ';
1212897Seric 
1223381Seric 	p = NULL;		/* Sep */
1233381Seric 	for (c = MonthTab; c->old != NULL; c++)
1243381Seric 	{
1253381Seric 		if (strncmp(&ud[4], c->old, 3) == 0)
1263381Seric 		{
1273381Seric 			p = c->new;
1283381Seric 			break;
1293381Seric 		}
1303381Seric 	}
1313381Seric 	if (p != NULL)
1323381Seric 	{
1333381Seric 		while (*p != '\0')
1343381Seric 			*q++ = *p++;
1353381Seric 	}
1363381Seric 	else
1373381Seric 	{
1383381Seric 		p = &ud[4];
1393381Seric 		*q++ = *p++;
1403381Seric 		*q++ = *p++;
1413381Seric 		*q++ = *p++;
1423381Seric 	}
1432966Seric 	*q++ = ' ';
1442897Seric 
1452897Seric 	p = &ud[20];		/* 1979 */
1462897Seric 	for (i = 4; i > 0; i--)
1472897Seric 		*q++ = *p++;
1482897Seric 	*q++ = ' ';
1492897Seric 
1502897Seric 	p = &ud[11];		/* 01:03:52 */
1513568Seric 	for (i = 5; i > 0; i--)
1522897Seric 		*q++ = *p++;
1532897Seric 
1542897Seric 				/* -PST or -PDT */
1552897Seric # ifdef V6
156293Seric 	if (localtime(&t)->tm_isdst)
1574315Seric 		p = DstTimezone;
158293Seric 	else
1594315Seric 		p = StdTimezone;
1602897Seric # else
1612897Seric 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
1622897Seric # endif V6
1632897Seric 	if (p[3] != '\0')
1642897Seric 	{
1652897Seric 		/* hours from GMT */
1662897Seric 		p += 3;
1672897Seric 		*q++ = *p++;
1682897Seric 		if (p[1] == ':')
1692897Seric 			*q++ = '0';
1702897Seric 		else
1712897Seric 			*q++ = *p++;
1722897Seric 		*q++ = *p++;
1732897Seric 		p++;		/* skip ``:'' */
1742897Seric 		*q++ = *p++;
1752897Seric 		*q++ = *p++;
1762897Seric 	}
1772897Seric 	else
1782897Seric 	{
1792897Seric 		*q++ = '-';
1802897Seric 		*q++ = *p++;
1812897Seric 		*q++ = *p++;
1822897Seric 		*q++ = *p++;
1832897Seric 	}
1842897Seric 
1853568Seric 	p = NULL;		/* Mon */
1863568Seric 	for (c = DowTab; c->old != NULL; c++)
1873568Seric 	{
1883568Seric 		if (strncmp(&ud[0], c->old, 3) == 0)
1893568Seric 		{
1903568Seric 			p = c->new;
1913568Seric 			break;
1923568Seric 		}
1933568Seric 	}
1943568Seric 	if (p != NULL)
1953568Seric 	{
1963568Seric 		*q++ = ' ';
1973568Seric 		*q++ = '(';
1983568Seric 		while (*p != '\0')
1993568Seric 			*q++ = *p++;
2003568Seric 		*q++ = ')';
2013568Seric 	}
2023568Seric 
2032897Seric 	*q = '\0';
2042897Seric 
205293Seric 	return (b);
206293Seric }
207