|
|
1.1 ! root 1: /* $Header$ */ ! 2: ! 3: #include <ctype.h> ! 4: #include "date.h" ! 5: #include "null.h" ! 6: #include "yesno.h" ! 7: /* ! 8: * date template character codes ! 9: */ ! 10: #define L 1 /* a lower case chararacter */ ! 11: #define U 2 /* an upper case character */ ! 12: #define S 3 /* a space */ ! 13: #define D 4 /* a digit */ ! 14: #define O 5 /* an optional digit or space */ ! 15: #define C 6 /* a colon */ ! 16: #define N 7 /* a newline */ ! 17: /* ! 18: * date templates ! 19: */ ! 20: static char ctypes[] = ! 21: {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,D,D,D,D,0}; ! 22: static char tmztypes[] = ! 23: {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,U,U,U,S,D,D,D,D,0}; ! 24: static char *mon_tab[] = ! 25: { ! 26: "illegal month", ! 27: "Jan", ! 28: "Feb", ! 29: "Mar", ! 30: "Apr", ! 31: "May", ! 32: "Jun", ! 33: "Jul", ! 34: "Aug", ! 35: "Sep", ! 36: "Oct", ! 37: "Nov", ! 38: "Dec" ! 39: }; ! 40: /* ! 41: * cmatch() matchs a date against a given template. Returns constant 1 if ! 42: * there is a match, otherwise 0. ! 43: */ ! 44: static ! 45: cmatch(date, template) ! 46: register char *date; /* date string */ ! 47: register char *template; /* template array */ ! 48: { ! 49: register int c; /* comparison character */ ! 50: ! 51: for (c = *date++; c != '\0' && *template != 0; c= *date++) ! 52: switch (*template++) ! 53: { ! 54: case L: ! 55: if (!islower(c)) ! 56: return(0); ! 57: break; ! 58: case U: ! 59: if (!isupper(c)) ! 60: return(0); ! 61: break; ! 62: case S: ! 63: if (c != ' ') ! 64: return(0); ! 65: break; ! 66: case D: ! 67: if (!isdigit(c)) ! 68: return(0); ! 69: break; ! 70: case O: ! 71: if (c != ' ' && !isdigit(c)) ! 72: return(0); ! 73: break; ! 74: case C: ! 75: if (c != ':') ! 76: return(0); ! 77: break; ! 78: case N: ! 79: if (c != '\n') ! 80: return(0); ! 81: break; ! 82: } ! 83: if (c != '\0' || *template != 0) ! 84: return(0); ! 85: return(1); ! 86: } ! 87: ! 88: ! 89: ! 90: /* ! 91: * isdate() tests if date is a ctime(3) generated date string. ! 92: * The ctypes template is used as the criterion of correctness. Also ! 93: * a possible trailing timezone is checked by the tmztype template. ! 94: * Returns constant 1 if valid, otherwise 0. ! 95: */ ! 96: isdate(date) ! 97: char *date; /* date string */ ! 98: { ! 99: int cmatch(); /* match date against template */ ! 100: ! 101: if (cmatch(date, ctypes) == 1) ! 102: return(1); ! 103: return(cmatch(date, tmztypes)); ! 104: } ! 105: ! 106: ! 107: ! 108: /* ! 109: * parsedate() breaks down the time returned by ctime(3) into a DATE ! 110: * struct. Returns constant NO if a bad date, otherwise YES. ! 111: */ ! 112: parsedate(cdate, dt) ! 113: char *cdate; /* ctime(3) generated date string */ ! 114: DATE *dt; /* pointer to broken-down time struct */ ! 115: { ! 116: int atoi(); /* convert alpha string to integer */ ! 117: int cmatch(); /* match date against template */ ! 118: int strncmp(); /* compare n characters in string */ ! 119: ! 120: if (cmatch(cdate, ctypes) == 1) ! 121: { ! 122: dt->t_year = atoi(cdate+20); ! 123: } ! 124: else if (cmatch(cdate, tmztypes) == 1) ! 125: { ! 126: dt->t_year = atoi(cdate+24); ! 127: } ! 128: else { ! 129: return(NO); ! 130: } ! 131: for (dt->t_mon = 12; dt->t_mon > 0; dt->t_mon--) ! 132: if (strncmp(mon_tab[dt->t_mon], cdate+4, 3) == 0) ! 133: break; ! 134: if (dt->t_mon <= 0) ! 135: return(NO); ! 136: dt->t_day = atoi(cdate+8); ! 137: dt->t_hour = atoi(cdate+11); ! 138: dt->t_min = atoi(cdate+14); ! 139: dt->t_sec = atoi(cdate+17); ! 140: return(YES); ! 141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.