#include #include #include #include static const char* months [12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; static int getint(const char** s,int max) { int i,j; for (i=j=0; jtm_mon=i; break; case 'c': s=strptime(s,"%b %a %d %k:%M:%S %Z %Y",tm); break; case 'C': i=getint(&s,2); if (i==-1) return (char*)s; tm->tm_year=(tm->tm_year%100)+(i*100); break; case 'd': case 'e': i=getint(&s,2); if (i==-1 || i>31) return (char*)s; tm->tm_mday=i; break; case 'D': s=strptime(s,"%m/%d/%y",tm); break; case 'H': case 'k': i=getint(&s,2); if (i==-1 || i>23) return (char*)s; tm->tm_hour=i; break; case 'I': case 'l': i=getint(&s,2); if (i==-1 || i>12) return (char*)s; tm->tm_hour=(tm->tm_hour/12)*12+i; break; case 'j': getint(&s,3); /* not used */ break; case 'm': i=getint(&s,2); if (i<=0 || i>12) return (char*)s; tm->tm_mon=i-1; break; case 'M': i=getint(&s,2); if (i==-1 || i>59) return (char*)s; tm->tm_min=i; break; case 'n': case 't': while (isblank(*s)) ++s; break; case 'p': case 'P': if (*s=='p' || *s=='P') tm->tm_hour=(tm->tm_hour%12)+12; s+=2; break; case 'r': s=strptime(s,"%I:%M:%S %p",tm); break; case 'R': s=strptime(s,"%H:%M",tm); break; case 'S': i=getint(&s,2); if (i==-1 || i>60) return (char*)s; tm->tm_sec=i; break; case 'T': s=strptime(s,"%H:%M:%S",tm); break; case 'U': case 'W': if (getint(&s,2)==-1) return (char*)s; break; case 'w': if (*s<'0' || *s>'6') return (char*)s; ++s; break; case 'x': s=strptime(s,"%b %a %d",tm); break; case 'X': s=strptime(s,"%k:%M:%S",tm); break; case 'y': i=getint(&s,2); if (i<0) return (char*)s; tm->tm_year=(i<69)?i+100:i; break; case 'Y': i=getint(&s,5); if (i==-1) return (char*)s; tm->tm_year=i-1900; break; } ++format; break; default: if (*s != *format) return (char*)s; ++format; ++s; break; } } return (char*)s; }