19152Seric # include "conf.h"
2293Seric # include <time.h>
32897Seric # ifndef V6
42897Seric # include <sys/types.h>
52897Seric # include <sys/timeb.h>
62897Seric # endif
74437Seric # include "useful.h"
8293Seric 
9*10251Seric SCCSID(@(#)arpadate.c	3.11		01/12/83);
10403Seric 
11293Seric /*
12293Seric **  ARPADATE -- Create date in ARPANET format
13293Seric **
14293Seric **	Parameters:
152897Seric **		ud -- unix style date string.  if NULL, one is created.
16293Seric **
17293Seric **	Returns:
18293Seric **		pointer to an ARPANET date field
19293Seric **
20293Seric **	Side Effects:
21293Seric **		none
22293Seric **
23293Seric **	WARNING:
24293Seric **		date is stored in a local buffer -- subsequent
25293Seric **		calls will overwrite.
263185Seric **
273185Seric **	Bugs:
283185Seric **		Timezone is computed from local time, rather than
293185Seric **		from whereever (and whenever) the message was sent.
303185Seric **		To do better is very hard.
314315Seric **
324315Seric **		Some sites are now inserting the timezone into the
334315Seric **		local date.  This routine should figure out what
344315Seric **		the format is and work appropriately.
35293Seric */
36293Seric 
371586Seric char *
382897Seric arpadate(ud)
392897Seric 	register char *ud;
40293Seric {
41293Seric 	register char *p;
422897Seric 	register char *q;
43293Seric 	static char b[40];
441586Seric 	extern char *ctime();
452897Seric 	register int i;
462897Seric 	extern struct tm *localtime();
472897Seric # ifdef V6
482897Seric 	long t;
494315Seric 	extern char *StdTimezone, *DstTimezone;
504315Seric 	extern long time();
512897Seric # else
522897Seric 	struct timeb t;
532897Seric 	extern struct timeb *ftime();
542897Seric 	extern char *timezone();
552897Seric # endif
56293Seric 
574315Seric 	/*
584315Seric 	**  Get current time.
594315Seric 	**	This will be used if a null argument is passed and
604315Seric 	**	to resolve the timezone.
614315Seric 	*/
624315Seric 
632897Seric # ifdef V6
644315Seric 	(void) time(&t);
652897Seric 	if (ud == NULL)
662897Seric 		ud = ctime(&t);
672897Seric # else
682897Seric 	ftime(&t);
692897Seric 	if (ud == NULL)
702897Seric 		ud = ctime(&t.time);
712897Seric # endif
72293Seric 
734315Seric 	/*
744315Seric 	**  Crack the UNIX date line in a singularly unoriginal way.
754315Seric 	*/
764315Seric 
772897Seric 	q = b;
782897Seric 
79293Seric 	p = &ud[8];		/* 16 */
80293Seric 	if (*p == ' ')
81293Seric 		p++;
822897Seric 	else
832897Seric 		*q++ = *p++;
842897Seric 	*q++ = *p++;
85*10251Seric 	*q++ = ' ';
862897Seric 
875184Seric 	p = &ud[4];		/* Sep */
885184Seric 	*q++ = *p++;
895184Seric 	*q++ = *p++;
905184Seric 	*q++ = *p++;
91*10251Seric 	*q++ = ' ';
922897Seric 
935184Seric 	p = &ud[22];		/* 1979 */
945184Seric 	*q++ = *p++;
955184Seric 	*q++ = *p++;
962897Seric 	*q++ = ' ';
972897Seric 
982897Seric 	p = &ud[11];		/* 01:03:52 */
995184Seric 	for (i = 8; i > 0; i--)
1002897Seric 		*q++ = *p++;
1012897Seric 
1022897Seric 				/* -PST or -PDT */
1032897Seric # ifdef V6
104293Seric 	if (localtime(&t)->tm_isdst)
1054315Seric 		p = DstTimezone;
106293Seric 	else
1074315Seric 		p = StdTimezone;
1082897Seric # else
1092897Seric 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
1102897Seric # endif V6
1112897Seric 	if (p[3] != '\0')
1122897Seric 	{
1132897Seric 		/* hours from GMT */
1142897Seric 		p += 3;
1152897Seric 		*q++ = *p++;
1162897Seric 		if (p[1] == ':')
1172897Seric 			*q++ = '0';
1182897Seric 		else
1192897Seric 			*q++ = *p++;
1202897Seric 		*q++ = *p++;
1212897Seric 		p++;		/* skip ``:'' */
1222897Seric 		*q++ = *p++;
1232897Seric 		*q++ = *p++;
1242897Seric 	}
1252897Seric 	else
1262897Seric 	{
127*10251Seric 		*q++ = ' ';
1282897Seric 		*q++ = *p++;
1292897Seric 		*q++ = *p++;
1302897Seric 		*q++ = *p++;
1312897Seric 	}
1322897Seric 
1335184Seric 	p = &ud[0];		/* Mon */
1345184Seric 	*q++ = ' ';
1355184Seric 	*q++ = '(';
1365184Seric 	*q++ = *p++;
1375184Seric 	*q++ = *p++;
1385184Seric 	*q++ = *p++;
1395184Seric 	*q++ = ')';
1403568Seric 
1412897Seric 	*q = '\0';
142293Seric 	return (b);
143293Seric }
144