X-Git-Url: https://git.distorted.org.uk/~mdw/ezmlm/blobdiff_plain/5b62e993b0af39700031c2875d7f6654e6a02850..f8beb284087c279acfb30506f5bb32baa4949b44:/date2yyyymm.c diff --git a/date2yyyymm.c b/date2yyyymm.c new file mode 100644 index 0000000..dd6ea87 --- /dev/null +++ b/date2yyyymm.c @@ -0,0 +1,71 @@ + +/*$Id: date2yyyymm.c,v 1.1 1999/10/09 16:45:43 lindberg Exp $*/ +/*$Name: ezmlm-idx-040 $*/ +#include "yyyymm.h" + +unsigned int date2yyyymm(s) +char *s; +/* expects a qmail date string s and returns yyyymm */ +/* if there are problems, it returns 0. If there is no terminating char */ +/* we may segfault if the syntax is bad. Assure that the ';' is there */ +/* or add '\0' */ +{ + unsigned int mo; + unsigned int year; /* must hold yyyymm - ok to year 65K */ + char ch,ch1,ch2; + +/* jan feb mar apr may jun jul aug sep oct nov dec */ +/* - strictly qmail datefmt dependent*/ + for (;;s++) { + ch = *s; + if (ch != ' ' && (ch < '0' || ch > '9')) break; + } + mo = 0; + if (!(ch = *(s++))) return 0; + if (ch >= 'a') ch -= ('a' - 'A'); /* toupper */ + if (!(ch1 = *(s++))) return 0; /* rfc822 hrds are case-insens */ + if (ch1 >= 'a') ch1 -= ('a' - 'A'); + if (!(ch2 = *(s++))) return 0; + if (ch2 >= 'a') ch2 -= ('a' - 'A'); + + switch (ch) { + case 'J': + if (ch1 == 'A' && ch2 == 'N') { mo = 1; break; } + if (ch1 == 'U') { + if (ch2 == 'N') mo = 6; + else if (ch2 == 'L') mo = 7; + } + break; + case 'F': if (ch1 == 'E' && ch2 == 'B') mo = 2; break; + case 'A': + if (ch1 == 'P' && ch2 == 'R') mo = 4; + else if (ch1 == 'U' && ch2 == 'G') mo = 8; + break; + case 'M': + if (ch1 != 'A') break; + if (ch2 == 'R') mo = 3; + else if (ch2 == 'Y') mo = 5; + break; + case 'S': if (ch1 == 'E' && ch2 == 'P') mo = 9; break; + case 'O': if (ch1 == 'C' && ch2 == 'T') mo = 10; break; + case 'N': if (ch1 == 'O' && ch2 == 'V') mo = 11; break; + case 'D': if (ch1 == 'E' && ch2 == 'C') mo = 12; break; + default: + break; + } + if (!mo || *(s++) != ' ') + return 0L; /* mo true means s[0-2] valid */ + year = 0L; + for (;;) { + register unsigned char chy; + chy = (unsigned char) *(s++); + if (chy < '0' || chy > '9') { + if (year) break; + else return 0; + } + year = year * 10 + (chy - '0'); + } + return year * 100 + mo; +} + +