1 # include <time.h>
2 # ifndef V6
3 # include <sys/types.h>
4 # include <sys/timeb.h>
5 # endif
6 
7 static char SccsId[] = "@(#)arpadate.c	3.3	03/11/81";
8 
9 /*
10 **  ARPADATE -- Create date in ARPANET format
11 **
12 **	Parameters:
13 **		ud -- unix style date string.  if NULL, one is created.
14 **
15 **	Returns:
16 **		pointer to an ARPANET date field
17 **
18 **	Side Effects:
19 **		none
20 **
21 **	WARNING:
22 **		date is stored in a local buffer -- subsequent
23 **		calls will overwrite.
24 **
25 **	Bugs:
26 **		Timezone is computed from local time, rather than
27 **		from whereever (and whenever) the message was sent.
28 **		To do better is very hard.
29 */
30 
31 # ifdef V6
32 # define DST_NAME	"PDT"
33 # define STD_NAME	"PST"
34 # endif
35 
36 # define NULL		0
37 
38 char *
39 arpadate(ud)
40 	register char *ud;
41 {
42 	register char *p;
43 	register char *q;
44 	static char b[40];
45 	extern char *ctime();
46 	register int i;
47 	extern struct tm *localtime();
48 # ifdef V6
49 	long t;
50 # else
51 	struct timeb t;
52 	extern struct timeb *ftime();
53 	extern char *timezone();
54 # endif
55 
56 # ifdef V6
57 	time(&t);
58 	if (ud == NULL)
59 		ud = ctime(&t);
60 # else
61 	ftime(&t);
62 	if (ud == NULL)
63 		ud = ctime(&t.time);
64 # endif
65 
66 	q = b;
67 
68 	p = &ud[0];		/* Mon */
69 	*q++ = *p++;
70 	*q++ = *p++;
71 	*q++ = *p++;
72 	*q++ = ',';
73 	*q++ = ' ';
74 
75 	p = &ud[8];		/* 16 */
76 	if (*p == ' ')
77 		p++;
78 	else
79 		*q++ = *p++;
80 	*q++ = *p++;
81 	*q++ = ' ';
82 
83 	p = &ud[4];		/* Sep */
84 	*q++ = *p++;
85 	*q++ = *p++;
86 	*q++ = *p++;
87 	*q++ = ' ';
88 
89 	p = &ud[20];		/* 1979 */
90 	for (i = 4; i > 0; i--)
91 		*q++ = *p++;
92 	*q++ = ' ';
93 
94 	p = &ud[11];		/* 01:03:52 */
95 	for (i = 8; i > 0; i--)
96 		*q++ = *p++;
97 
98 				/* -PST or -PDT */
99 # ifdef V6
100 	if (localtime(&t)->tm_isdst)
101 		p = DST_NAME;
102 	else
103 		p = STD_NAME;
104 # else
105 	p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
106 # endif V6
107 	if (p[3] != '\0')
108 	{
109 		/* hours from GMT */
110 		p += 3;
111 		*q++ = *p++;
112 		if (p[1] == ':')
113 			*q++ = '0';
114 		else
115 			*q++ = *p++;
116 		*q++ = *p++;
117 		p++;		/* skip ``:'' */
118 		*q++ = *p++;
119 		*q++ = *p++;
120 	}
121 	else
122 	{
123 		*q++ = '-';
124 		*q++ = *p++;
125 		*q++ = *p++;
126 		*q++ = *p++;
127 	}
128 
129 	*q = '\0';
130 
131 	return (b);
132 }
133