1293Seric # include <time.h>
22897Seric # ifndef V6
32897Seric # include <sys/types.h>
42897Seric # include <sys/timeb.h>
52897Seric # endif
6293Seric 
7*3381Seric static char SccsId[] = "@(#)arpadate.c	3.4	03/27/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.
29293Seric */
30293Seric 
312897Seric # ifdef V6
322897Seric # define DST_NAME	"PDT"
332897Seric # define STD_NAME	"PST"
342897Seric # endif
352897Seric 
362897Seric # define NULL		0
372897Seric 
38*3381Seric struct cvttab
39*3381Seric {
40*3381Seric 	char	*old;
41*3381Seric 	char	*new;
42*3381Seric };
43*3381Seric 
44*3381Seric struct cvttab	DowTab[] =
45*3381Seric {
46*3381Seric 	"Sun",		"Sunday",
47*3381Seric 	"Mon",		"Monday",
48*3381Seric 	"Tue",		"Tuesday",
49*3381Seric 	"Wed",		"Wednesday",
50*3381Seric 	"Thu",		"Thursday",
51*3381Seric 	"Fri",		"Friday",
52*3381Seric 	"Sat",		"Saturday",
53*3381Seric 	NULL,		NULL
54*3381Seric };
55*3381Seric 
56*3381Seric struct cvttab	MonthTab[] =
57*3381Seric {
58*3381Seric 	"Jan",		"January",
59*3381Seric 	"Feb",		"February",
60*3381Seric 	"Mar",		"March",
61*3381Seric 	"Apr",		"April",
62*3381Seric 	"May",		"May",
63*3381Seric 	"Jun",		"June",
64*3381Seric 	"Jul",		"July",
65*3381Seric 	"Aug",		"August",
66*3381Seric 	"Sep",		"September",
67*3381Seric 	"Oct",		"October",
68*3381Seric 	"Nov",		"November",
69*3381Seric 	"Dec",		"December",
70*3381Seric 	NULL,		NULL
71*3381Seric };
72*3381Seric 
731586Seric char *
742897Seric arpadate(ud)
752897Seric 	register char *ud;
76293Seric {
77293Seric 	register char *p;
782897Seric 	register char *q;
79293Seric 	static char b[40];
801586Seric 	extern char *ctime();
812897Seric 	register int i;
82*3381Seric 	struct cvttab *c;
832897Seric 	extern struct tm *localtime();
842897Seric # ifdef V6
852897Seric 	long t;
862897Seric # else
872897Seric 	struct timeb t;
882897Seric 	extern struct timeb *ftime();
892897Seric 	extern char *timezone();
902897Seric # endif
91293Seric 
922897Seric # ifdef V6
93293Seric 	time(&t);
942897Seric 	if (ud == NULL)
952897Seric 		ud = ctime(&t);
962897Seric # else
972897Seric 	ftime(&t);
982897Seric 	if (ud == NULL)
992897Seric 		ud = ctime(&t.time);
1002897Seric # endif
101293Seric 
1022897Seric 	q = b;
1032897Seric 
104*3381Seric 	p = NULL;		/* Mon */
105*3381Seric 	for (c = DowTab; c->old != NULL; c++)
106*3381Seric 	{
107*3381Seric 		if (strncmp(&ud[0], c->old, 3) == 0)
108*3381Seric 		{
109*3381Seric 			p = c->new;
110*3381Seric 			break;
111*3381Seric 		}
112*3381Seric 	}
113*3381Seric 	if (p != NULL)
114*3381Seric 	{
115*3381Seric 		while (*p != '\0')
116*3381Seric 			*q++ = *p++;
117*3381Seric 		*q++ = ',';
118*3381Seric 		*q++ = ' ';
119*3381Seric 	}
1202897Seric 
121293Seric 	p = &ud[8];		/* 16 */
122293Seric 	if (*p == ' ')
123293Seric 		p++;
1242897Seric 	else
1252897Seric 		*q++ = *p++;
1262897Seric 	*q++ = *p++;
1272966Seric 	*q++ = ' ';
1282897Seric 
129*3381Seric 	p = NULL;		/* Sep */
130*3381Seric 	for (c = MonthTab; c->old != NULL; c++)
131*3381Seric 	{
132*3381Seric 		if (strncmp(&ud[4], c->old, 3) == 0)
133*3381Seric 		{
134*3381Seric 			p = c->new;
135*3381Seric 			break;
136*3381Seric 		}
137*3381Seric 	}
138*3381Seric 	if (p != NULL)
139*3381Seric 	{
140*3381Seric 		while (*p != '\0')
141*3381Seric 			*q++ = *p++;
142*3381Seric 	}
143*3381Seric 	else
144*3381Seric 	{
145*3381Seric 		p = &ud[4];
146*3381Seric 		*q++ = *p++;
147*3381Seric 		*q++ = *p++;
148*3381Seric 		*q++ = *p++;
149*3381Seric 	}
1502966Seric 	*q++ = ' ';
1512897Seric 
1522897Seric 	p = &ud[20];		/* 1979 */
1532897Seric 	for (i = 4; i > 0; i--)
1542897Seric 		*q++ = *p++;
1552897Seric 	*q++ = ' ';
1562897Seric 
1572897Seric 	p = &ud[11];		/* 01:03:52 */
1582897Seric 	for (i = 8; i > 0; i--)
1592897Seric 		*q++ = *p++;
1602897Seric 
1612897Seric 				/* -PST or -PDT */
1622897Seric # ifdef V6
163293Seric 	if (localtime(&t)->tm_isdst)
1642897Seric 		p = DST_NAME;
165293Seric 	else
1662897Seric 		p = STD_NAME;
1672897Seric # else
1682897Seric 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
1692897Seric # endif V6
1702897Seric 	if (p[3] != '\0')
1712897Seric 	{
1722897Seric 		/* hours from GMT */
1732897Seric 		p += 3;
1742897Seric 		*q++ = *p++;
1752897Seric 		if (p[1] == ':')
1762897Seric 			*q++ = '0';
1772897Seric 		else
1782897Seric 			*q++ = *p++;
1792897Seric 		*q++ = *p++;
1802897Seric 		p++;		/* skip ``:'' */
1812897Seric 		*q++ = *p++;
1822897Seric 		*q++ = *p++;
1832897Seric 	}
1842897Seric 	else
1852897Seric 	{
1862897Seric 		*q++ = '-';
1872897Seric 		*q++ = *p++;
1882897Seric 		*q++ = *p++;
1892897Seric 		*q++ = *p++;
1902897Seric 	}
1912897Seric 
1922897Seric 	*q = '\0';
1932897Seric 
194293Seric 	return (b);
195293Seric }
196