Ticket #2092: patch-1.5.11.tamo.iso8601.1

File patch-1.5.11.tamo.iso8601.1, 1.8 kB (added by anonymous, 19 months ago)

patch-1.5.11.tamo.iso8601.1

Line 
1diff -r e0ed9b512a7b pattern.c
2--- a/pattern.c Fri Sep 23 07:29:53 2005
3+++ b/pattern.c Tue Sep 27 01:15:38 2005
4@@ -429,6 +429,60 @@
5   return 0;
6 }
7 
8+static const char *getISO8601 (const char *s, struct tm *t, BUFFER *err)
9+{
10+  const char *p;
11+  char buf[9];
12+  time_t now = time (NULL);
13+  struct tm *tm = localtime (&now);
14+  size_t len = strspn (s, "0123456789");
15+
16+  if (len < 3 || len > 8)
17+  {
18+    snprintf (err->data, err->dsize, _("Invalid day of month: %s"), s);
19+    return NULL;
20+  }
21+
22+  p = s + len;
23+  strfcpy (buf, s, sizeof (buf));
24+  buf[len] = '\0';
25+
26+  t->tm_mday = strtol (buf + len - 2, NULL, 10);
27+  if (t->tm_mday < 1 || t->tm_mday > 31)
28+  {
29+    snprintf (err->data, err->dsize, _("Invalid day of month: %s"), buf + len - 2);
30+    return NULL;
31+  }
32+  buf[len -= 2] = '\0';
33+
34+  if (len == 1) /* "312" => Mar 12 */
35+    len++;
36+  t->tm_mon = strtol (buf + len - 2, NULL, 10) - 1;
37+  if (t->tm_mon < 0 || t->tm_mon > 11)
38+  {
39+    snprintf (err->data, err->dsize, _("Invalid month: %s"), buf + len - 2);
40+    return NULL;
41+  }
42+  buf[len -= 2] = '\0';
43+
44+  if (len < 2)
45+  {
46+    t->tm_year = tm->tm_year;
47+    return p;
48+  }
49+  if (len == 3)
50+  {
51+    snprintf (err->data, err->dsize, _("Invalid year: %s"), buf);
52+    return NULL;
53+  }
54+  t->tm_year = strtol (buf, NULL, 10);
55+  if (t->tm_year < 70) /* year 2000+ */
56+    t->tm_year += 100;
57+  else if (t->tm_year > 1900)
58+    t->tm_year -= 1900;
59+  return p;
60+}
61+
62 static const char *getDate (const char *s, struct tm *t, BUFFER *err)
63 {
64   char *p;
65@@ -437,10 +491,7 @@
66 
67   t->tm_mday = strtol (s, &p, 10);
68   if (t->tm_mday < 1 || t->tm_mday > 31)
69-  {
70-    snprintf (err->data, err->dsize, _("Invalid day of month: %s"), s);
71-    return NULL;
72-  }
73+    return (getISO8601 (s, t, err));
74   if (*p != '/')
75   {
76     /* fill in today's month and year */