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