Import ezmlm-idx 0.40
[ezmlm] / date2yyyymm.c
diff --git a/date2yyyymm.c b/date2yyyymm.c
new file mode 100644 (file)
index 0000000..dd6ea87
--- /dev/null
@@ -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;
+}
+
+