12168Seric # include	"../hdr/macros.h"
22168Seric 
3*2294Seric SCCSID(@(#)date_ab.c	4.2);
42168Seric 
52168Seric /*
62168Seric 	Function to convert date in the form "yymmddhhmmss" to
72168Seric 	standard UNIX time (seconds since Jan. 1, 1970 GMT).
82168Seric 	Units left off of the right are replaced by their
92168Seric 	maximum possible values.
102168Seric 
112168Seric 	The function corrects properly for leap year,
122168Seric 	daylight savings time, offset from Greenwich time, etc.
132168Seric 
142168Seric 	Function returns -1 if bad time is given (i.e., "730229").
152168Seric */
162168Seric char *Datep;
172168Seric 
182168Seric 
192168Seric date_ab(adt,bdt)
202168Seric char *adt;
212168Seric long *bdt;
222168Seric {
232168Seric 	int y, t, d, h, m, s, i;
242168Seric 	long tim;
252168Seric 	extern int *localtime();
262168Seric #define	time_t	long
272168Seric #include <sys/timeb.h>
282168Seric 	struct timeb timeb;
292168Seric 
302168Seric 	ftime(&timeb);
312168Seric 	Datep = adt;
322168Seric 
332168Seric 	if((y=g2()) == -2) y = 99;
342168Seric 	if(y<70 || y>99) return(-1);
352168Seric 
362168Seric 	if((t=g2()) == -2) t = 12;
372168Seric 	if(t<1 || t>12) return(-1);
382168Seric 
392168Seric 	if((d=g2()) == -2) d = mosize(y,t);
402168Seric 	if(d<1 || d>mosize(y,t)) return(-1);
412168Seric 
422168Seric 	if((h=g2()) == -2) h = 23;
432168Seric 	if(h<0 || h>23) return(-1);
442168Seric 
452168Seric 	if((m=g2()) == -2) m = 59;
462168Seric 	if(m<0 || m>59) return(-1);
472168Seric 
482168Seric 	if((s=g2()) == -2) s = 59;
492168Seric 	if(s<0 || s>59) return(-1);
502168Seric 
512168Seric 	tim = 0L;
522168Seric 	y =+ 1900;
532168Seric 	for(i=1970; i<y; i++)
542168Seric 		tim =+ dysize(i);
552168Seric 	while(--t)
562168Seric 		tim =+ mosize(y,t);
572168Seric 	tim =+ d - 1;
582168Seric 	tim =* 24;
592168Seric 	tim =+ h;
602168Seric 	tim =* 60;
612168Seric 	tim =+ m;
62*2294Seric 	tim =+ timeb.timezone;			/* GMT correction */
632168Seric 	tim =* 60;
642168Seric 	tim =+ s;
652168Seric 
662168Seric 	if(localtime(&tim)[8])
672168Seric 		tim =+ -1*60*60;		/* daylight savings */
682168Seric 	*bdt = tim;
692168Seric 	return(0);
702168Seric }
712168Seric 
722168Seric 
732168Seric mosize(y,t)
742168Seric int y, t;
752168Seric {
762168Seric 	extern int dmsize[];
772168Seric 
782168Seric 	if(t==2 && dysize(y)==366) return(29);
792168Seric 	return(dmsize[t-1]);
802168Seric }
812168Seric 
822168Seric 
832168Seric g2()
842168Seric {
852168Seric 	register int c;
862168Seric 	register char *p;
872168Seric 
882168Seric 	for (p = Datep; *p; p++)
892168Seric 		if (numeric(*p))
902168Seric 			break;
912168Seric 	if (*p) {
922168Seric 		c = (*p++ - '0') * 10;
932168Seric 		if (*p)
942168Seric 			c =+ (*p++ - '0');
952168Seric 		else
962168Seric 			c = -1;
972168Seric 	}
982168Seric 	else
992168Seric 		c = -2;
1002168Seric 	Datep = p;
1012168Seric 	return(c);
1022168Seric }
103