time_t rfc822_parsedt(const char *rfcdt) { unsigned day=0, mon=0, year; int secs; int offset; time_t t; unsigned y; /* Ignore day of the week. Tolerate "Tue, 25 Feb 1997 ... " ** without the comma. Tolerate "Feb 25 1997 ...". */ while (!day || !mon) { if (!*rfcdt) return (0); if (isalpha((int)(unsigned char)*rfcdt)) { if (mon) return (0); mon=parsekey(&rfcdt, mnames); if (!mon) while (*rfcdt && isalpha((int)(unsigned char)*rfcdt)) ++rfcdt; continue; } if (isdigit((int)(unsigned char)*rfcdt)) { if (day) return (0); day=parsedig(&rfcdt); if (!day) return (0); continue; } ++rfcdt; } while (*rfcdt && isspace((int)(unsigned char)*rfcdt)) ++rfcdt; if (!isdigit((int)(unsigned char)*rfcdt)) return (0); year=parsedig(&rfcdt); if (year < 70) year += 2000; if (year < 100) year += 1900; while (*rfcdt && isspace((int)(unsigned char)*rfcdt)) ++rfcdt; if (day == 0 || mon == 0 || mon > 12 || day > mdays(mon,year)) return (0); secs=parsetime(&rfcdt); if (secs < 0) return (0); offset=0; /* RFC822 sez no parenthesis, but I've seen (EST) */ while ( *rfcdt ) { if (isalnum((int)(unsigned char)*rfcdt) || *rfcdt == '+' || *rfcdt == '-') break; ++rfcdt; } if (isalpha((int)(unsigned char)*rfcdt)) { int n=parsekey(&rfcdt, zonenames); if (n > 0) offset= zoneoffset[n-1]; } else { int sign=1; unsigned n; switch (*rfcdt) { case '-': sign= -1; case '+': ++rfcdt; } if (isdigit((int)(unsigned char)*rfcdt)) { n=parsedig(&rfcdt); if (n > 2359 || (n % 100) > 59) n=0; offset = sign * ( (n % 100) * 60 + n / 100 * 60 * 60); } } if (year < 1970) return (0); if (year > 9999) return (0); t=0; for (y=1970; y<year; y++) { if ( leap(y) ) { if (year-y >= 4) { y += 3; t += ( 365*3+366 ) * 24 * 60 * 60; continue; } t += 24 * 60 * 60; } t += 365 * 24 * 60 * 60; } for (y=1; y < mon; y++) t += mdays(y, year) * 24 * 60 * 60; return ( t + (day-1) * 24 * 60 * 60 + secs - offset ); }
time_t pcp_gmtime(int y, int m, int d, int hh, int mm, int ss) { time_t t; struct tm *tmptr; struct tm mytm; int n; if (y < 1970 || y > 3000 || m < 1 || m > 12 || d < 1 || d > mdays(m, y) || hh < 0 || mm < 0 || ss < 0 || hh > 23 || mm > 59 || ss > 59) return (0); time(&t); tmptr=localtime(&t); if (!tmptr) return (0); mytm= *tmptr; mytm.tm_year = y - 1900; mytm.tm_mon = m - 1; mytm.tm_mday = d; mytm.tm_hour=0; mytm.tm_min=0; mytm.tm_sec=0; t=mktime(&mytm); if (t == (time_t)-1) return (0); /* Do it again, due to a potential timezone change */ tmptr=localtime(&t); mytm= *tmptr; mytm.tm_year = y - 1900; mytm.tm_mon = m - 1; mytm.tm_mday = d; mytm.tm_hour=0; mytm.tm_min=0; mytm.tm_sec=0; t=mktime(&mytm); if (t == (time_t)-1) return (0); /* Sanity check */ tmptr=localtime(&t); if (tmptr->tm_hour || tmptr->tm_min || tmptr->tm_sec) { return (0); } tmptr=gmtime(&t); n=tmcmp(tmptr->tm_year + 1900, tmptr->tm_mon + 1, tmptr->tm_mday, y, m, d); if (n < 0) { while (n < 0) { t += 24 * 60 * 60; tmptr=gmtime(&t); n=tmcmp(tmptr->tm_year + 1900, tmptr->tm_mon + 1, tmptr->tm_mday, y, m, d); } } else while (n > 0) { t -= 24 * 60 * 60; tmptr=gmtime(&t); n=tmcmp(tmptr->tm_year + 1900, tmptr->tm_mon + 1, tmptr->tm_mday, y, m, d); } t -= tmptr->tm_hour * 60 * 60 + tmptr->tm_min * 60 + tmptr->tm_sec; return (t + hh * 60 * 60 + mm * 60 + ss); }