19152Seric # include "conf.h"
213587Swnj # include <sys/time.h>
32897Seric # ifndef V6
42897Seric # include <sys/types.h>
52897Seric # include <sys/timeb.h>
62897Seric # endif
74437Seric # include "useful.h"
8293Seric 
9*13932Seric SCCSID(@(#)arpadate.c	3.13		07/13/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 
79*13932Seric 	p = &ud[0];		/* Mon */
80*13932Seric 	*q++ = *p++;
81*13932Seric 	*q++ = *p++;
82*13932Seric 	*q++ = *p++;
83*13932Seric 	*q++ = ',';
84*13932Seric 	*q++ = ' ';
85*13932Seric 
86293Seric 	p = &ud[8];		/* 16 */
87293Seric 	if (*p == ' ')
88293Seric 		p++;
892897Seric 	else
902897Seric 		*q++ = *p++;
912897Seric 	*q++ = *p++;
9210251Seric 	*q++ = ' ';
932897Seric 
945184Seric 	p = &ud[4];		/* Sep */
955184Seric 	*q++ = *p++;
965184Seric 	*q++ = *p++;
975184Seric 	*q++ = *p++;
9810251Seric 	*q++ = ' ';
992897Seric 
100*13932Seric 	p = &ud[22];		/* 79 */
1015184Seric 	*q++ = *p++;
1025184Seric 	*q++ = *p++;
1032897Seric 	*q++ = ' ';
1042897Seric 
1052897Seric 	p = &ud[11];		/* 01:03:52 */
1065184Seric 	for (i = 8; i > 0; i--)
1072897Seric 		*q++ = *p++;
1082897Seric 
1092897Seric 				/* -PST or -PDT */
1102897Seric # ifdef V6
111293Seric 	if (localtime(&t)->tm_isdst)
1124315Seric 		p = DstTimezone;
113293Seric 	else
1144315Seric 		p = StdTimezone;
1152897Seric # else
1162897Seric 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
1172897Seric # endif V6
1182897Seric 	if (p[3] != '\0')
1192897Seric 	{
1202897Seric 		/* hours from GMT */
1212897Seric 		p += 3;
1222897Seric 		*q++ = *p++;
1232897Seric 		if (p[1] == ':')
1242897Seric 			*q++ = '0';
1252897Seric 		else
1262897Seric 			*q++ = *p++;
1272897Seric 		*q++ = *p++;
1282897Seric 		p++;		/* skip ``:'' */
1292897Seric 		*q++ = *p++;
1302897Seric 		*q++ = *p++;
1312897Seric 	}
1322897Seric 	else
1332897Seric 	{
13410251Seric 		*q++ = ' ';
1352897Seric 		*q++ = *p++;
1362897Seric 		*q++ = *p++;
1372897Seric 		*q++ = *p++;
1382897Seric 	}
1392897Seric 
1402897Seric 	*q = '\0';
141293Seric 	return (b);
142293Seric }
143