1*2168Seric # include	"../hdr/macros.h"
2*2168Seric 
3*2168Seric SCCSID(@(#)date_ab.c	4.1);
4*2168Seric 
5*2168Seric /*
6*2168Seric 	Function to convert date in the form "yymmddhhmmss" to
7*2168Seric 	standard UNIX time (seconds since Jan. 1, 1970 GMT).
8*2168Seric 	Units left off of the right are replaced by their
9*2168Seric 	maximum possible values.
10*2168Seric 
11*2168Seric 	The function corrects properly for leap year,
12*2168Seric 	daylight savings time, offset from Greenwich time, etc.
13*2168Seric 
14*2168Seric 	Function returns -1 if bad time is given (i.e., "730229").
15*2168Seric */
16*2168Seric char *Datep;
17*2168Seric 
18*2168Seric 
19*2168Seric date_ab(adt,bdt)
20*2168Seric char *adt;
21*2168Seric long *bdt;
22*2168Seric {
23*2168Seric 	int y, t, d, h, m, s, i;
24*2168Seric 	long tim;
25*2168Seric 	extern int *localtime();
26*2168Seric #define	time_t	long
27*2168Seric #include <sys/timeb.h>
28*2168Seric 	struct timeb timeb;
29*2168Seric 
30*2168Seric 	ftime(&timeb);
31*2168Seric 	Datep = adt;
32*2168Seric 
33*2168Seric 	if((y=g2()) == -2) y = 99;
34*2168Seric 	if(y<70 || y>99) return(-1);
35*2168Seric 
36*2168Seric 	if((t=g2()) == -2) t = 12;
37*2168Seric 	if(t<1 || t>12) return(-1);
38*2168Seric 
39*2168Seric 	if((d=g2()) == -2) d = mosize(y,t);
40*2168Seric 	if(d<1 || d>mosize(y,t)) return(-1);
41*2168Seric 
42*2168Seric 	if((h=g2()) == -2) h = 23;
43*2168Seric 	if(h<0 || h>23) return(-1);
44*2168Seric 
45*2168Seric 	if((m=g2()) == -2) m = 59;
46*2168Seric 	if(m<0 || m>59) return(-1);
47*2168Seric 
48*2168Seric 	if((s=g2()) == -2) s = 59;
49*2168Seric 	if(s<0 || s>59) return(-1);
50*2168Seric 
51*2168Seric 	tim = 0L;
52*2168Seric 	y =+ 1900;
53*2168Seric 	for(i=1970; i<y; i++)
54*2168Seric 		tim =+ dysize(i);
55*2168Seric 	while(--t)
56*2168Seric 		tim =+ mosize(y,t);
57*2168Seric 	tim =+ d - 1;
58*2168Seric 	tim =* 24;
59*2168Seric 	tim =+ h;
60*2168Seric 	tim =* 60;
61*2168Seric 	tim =+ m;
62*2168Seric 	tim =* 60;
63*2168Seric 	tim =+ s;
64*2168Seric 
65*2168Seric 	tim =+ timeb.timezone;			/* GMT correction */
66*2168Seric 	if(localtime(&tim)[8])
67*2168Seric 		tim =+ -1*60*60;		/* daylight savings */
68*2168Seric 	*bdt = tim;
69*2168Seric 	return(0);
70*2168Seric }
71*2168Seric 
72*2168Seric 
73*2168Seric mosize(y,t)
74*2168Seric int y, t;
75*2168Seric {
76*2168Seric 	extern int dmsize[];
77*2168Seric 
78*2168Seric 	if(t==2 && dysize(y)==366) return(29);
79*2168Seric 	return(dmsize[t-1]);
80*2168Seric }
81*2168Seric 
82*2168Seric 
83*2168Seric g2()
84*2168Seric {
85*2168Seric 	register int c;
86*2168Seric 	register char *p;
87*2168Seric 
88*2168Seric 	for (p = Datep; *p; p++)
89*2168Seric 		if (numeric(*p))
90*2168Seric 			break;
91*2168Seric 	if (*p) {
92*2168Seric 		c = (*p++ - '0') * 10;
93*2168Seric 		if (*p)
94*2168Seric 			c =+ (*p++ - '0');
95*2168Seric 		else
96*2168Seric 			c = -1;
97*2168Seric 	}
98*2168Seric 	else
99*2168Seric 		c = -2;
100*2168Seric 	Datep = p;
101*2168Seric 	return(c);
102*2168Seric }
103