1293Seric # include <time.h>
22897Seric # ifndef V6
32897Seric # include <sys/types.h>
42897Seric # include <sys/timeb.h>
52897Seric # endif
64437Seric # include "useful.h"
7293Seric 
8*5184Seric static char SccsId[] = "@(#)arpadate.c	3.8	12/05/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 
361586Seric char *
372897Seric arpadate(ud)
382897Seric 	register char *ud;
39293Seric {
40293Seric 	register char *p;
412897Seric 	register char *q;
42293Seric 	static char b[40];
431586Seric 	extern char *ctime();
442897Seric 	register int i;
452897Seric 	extern struct tm *localtime();
462897Seric # ifdef V6
472897Seric 	long t;
484315Seric 	extern char *StdTimezone, *DstTimezone;
494315Seric 	extern long time();
502897Seric # else
512897Seric 	struct timeb t;
522897Seric 	extern struct timeb *ftime();
532897Seric 	extern char *timezone();
542897Seric # endif
55293Seric 
564315Seric 	/*
574315Seric 	**  Get current time.
584315Seric 	**	This will be used if a null argument is passed and
594315Seric 	**	to resolve the timezone.
604315Seric 	*/
614315Seric 
622897Seric # ifdef V6
634315Seric 	(void) time(&t);
642897Seric 	if (ud == NULL)
652897Seric 		ud = ctime(&t);
662897Seric # else
672897Seric 	ftime(&t);
682897Seric 	if (ud == NULL)
692897Seric 		ud = ctime(&t.time);
702897Seric # endif
71293Seric 
724315Seric 	/*
734315Seric 	**  Crack the UNIX date line in a singularly unoriginal way.
744315Seric 	*/
754315Seric 
762897Seric 	q = b;
772897Seric 
78293Seric 	p = &ud[8];		/* 16 */
79293Seric 	if (*p == ' ')
80293Seric 		p++;
812897Seric 	else
822897Seric 		*q++ = *p++;
832897Seric 	*q++ = *p++;
84*5184Seric 	*q++ = '-';
852897Seric 
86*5184Seric 	p = &ud[4];		/* Sep */
87*5184Seric 	*q++ = *p++;
88*5184Seric 	*q++ = *p++;
89*5184Seric 	*q++ = *p++;
90*5184Seric 	*q++ = '-';
912897Seric 
92*5184Seric 	p = &ud[22];		/* 1979 */
93*5184Seric 	*q++ = *p++;
94*5184Seric 	*q++ = *p++;
952897Seric 	*q++ = ' ';
962897Seric 
972897Seric 	p = &ud[11];		/* 01:03:52 */
98*5184Seric 	for (i = 8; i > 0; i--)
992897Seric 		*q++ = *p++;
1002897Seric 
1012897Seric 				/* -PST or -PDT */
1022897Seric # ifdef V6
103293Seric 	if (localtime(&t)->tm_isdst)
1044315Seric 		p = DstTimezone;
105293Seric 	else
1064315Seric 		p = StdTimezone;
1072897Seric # else
1082897Seric 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
1092897Seric # endif V6
1102897Seric 	if (p[3] != '\0')
1112897Seric 	{
1122897Seric 		/* hours from GMT */
1132897Seric 		p += 3;
1142897Seric 		*q++ = *p++;
1152897Seric 		if (p[1] == ':')
1162897Seric 			*q++ = '0';
1172897Seric 		else
1182897Seric 			*q++ = *p++;
1192897Seric 		*q++ = *p++;
1202897Seric 		p++;		/* skip ``:'' */
1212897Seric 		*q++ = *p++;
1222897Seric 		*q++ = *p++;
1232897Seric 	}
1242897Seric 	else
1252897Seric 	{
1262897Seric 		*q++ = '-';
1272897Seric 		*q++ = *p++;
1282897Seric 		*q++ = *p++;
1292897Seric 		*q++ = *p++;
1302897Seric 	}
1312897Seric 
132*5184Seric 	p = &ud[0];		/* Mon */
133*5184Seric 	*q++ = ' ';
134*5184Seric 	*q++ = '(';
135*5184Seric 	*q++ = *p++;
136*5184Seric 	*q++ = *p++;
137*5184Seric 	*q++ = *p++;
138*5184Seric 	*q++ = ')';
1393568Seric 
1402897Seric 	*q = '\0';
141293Seric 	return (b);
142293Seric }
143