mess822x 1.23
mess822x
Loading...
Searching...
No Matches
mess822_when.c
Go to the documentation of this file.
1#include "mess822.h"
2#include "scan.h"
3#include "str.h"
4#include "case.h"
5
6static stralloc tokens = {0};
7static struct caltime ct;
8
10{
11 int state;
12 int pos;
13 int flagnumeric;
14 long number;
15 char *x;
16 int known;
17
18 if (!mess822_token(&tokens,in)) return 0;
19
20 for (pos = tokens.len; pos > 0; --pos)
21 if (pos >= 3)
22 if (!tokens.s[pos - 1] && !tokens.s[pos - 3])
23 if ((tokens.s[pos - 2] == ';') || (tokens.s[pos - 2] == ','))
24 break;
25
26 /* 29 Aug 1996 14 : 04 : 52 CDT */
27 /* states: 1 2 3 4 5 6 7 8 9 10 */
28
29 state = 1;
30 known = 0;
31
32 while (pos < tokens.len) {
33 x = tokens.s + pos;
34 pos += str_len(x) + 1;
35
36 if (*x == ':') {
37 if (state == 5) state = 6;
38 if (state == 7) state = 8;
39 }
40
41 if (*x == '|') {
42 ++x;
43 flagnumeric = !x[scan_long(x,&number)];
44 switch(state) {
45 case 1:
46 if (!flagnumeric) return 1;
47 ct.date.day = number;
48 break;
49 case 2:
50 if (!case_diffs(x,"Jan")) { ct.date.month = 1; break; }
51 if (!case_diffs(x,"Feb")) { ct.date.month = 2; break; }
52 if (!case_diffs(x,"Mar")) { ct.date.month = 3; break; }
53 if (!case_diffs(x,"Apr")) { ct.date.month = 4; break; }
54 if (!case_diffs(x,"May")) { ct.date.month = 5; break; }
55 if (!case_diffs(x,"Jun")) { ct.date.month = 6; break; }
56 if (!case_diffs(x,"Jul")) { ct.date.month = 7; break; }
57 if (!case_diffs(x,"Aug")) { ct.date.month = 8; break; }
58 if (!case_diffs(x,"Sep")) { ct.date.month = 9; break; }
59 if (!case_diffs(x,"Oct")) { ct.date.month = 10; break; }
60 if (!case_diffs(x,"Nov")) { ct.date.month = 11; break; }
61 if (!case_diffs(x,"Dec")) { ct.date.month = 12; break; }
62 return 1;
63 case 3:
64 if (!flagnumeric) return 1;
65 if (number < 50) number += 2000;
66 if (number < 999) number += 1900;
67 ct.date.year = number;
68 break;
69 case 4:
70 if (!flagnumeric) return 1;
71 ct.hour = number;
72 break;
73 case 5:
74 return 1;
75 case 6:
76 if (!flagnumeric) return 1;
77 ct.minute = number;
78 break;
79 case 8:
80 if (!flagnumeric) return 1;
81 ct.second = number;
82 break;
83 case 7:
84 ct.second = 0;
85 state = 9;
86 case 9:
87 known = 2;
88 if (flagnumeric) { /* happiness */
89 if (number >= 0)
90 ct.offset = (number / 100) * 60 + (number % 100);
91 else
92 ct.offset = -(((-number) / 100) * 60 + ((-number) % 100));
93 if (!case_diffs(x,"-0000")) known = 1;
94 break;
95 }
96 if (!case_diffs(x,"UT")) { ct.offset = 0; break; }
97 if (!case_diffs(x,"GMT")) { ct.offset = 0; break; }
98 /* XXX: GMT+nnnn? */
99
100 if (!case_diffs(x,"BST")) { ct.offset = 60; break; }
101 if (!case_diffs(x,"CDT")) { ct.offset = -300; break; }
102 if (!case_diffs(x,"CET")) { ct.offset = 60; break; }
103 if (!case_diffs(x,"CST")) { ct.offset = -360; break; }
104 if (!case_diffs(x,"EDT")) { ct.offset = -240; break; }
105 if (!case_diffs(x,"EET")) { ct.offset = 120; break; }
106 if (!case_diffs(x,"EST")) { ct.offset = -300; break; }
107 if (!case_diffs(x,"HKT")) { ct.offset = 480; break; }
108 if (!case_diffs(x,"IST")) { ct.offset = 120; break; }
109 if (!case_diffs(x,"JST")) { ct.offset = 540; break; }
110 if (!case_diffs(x,"MDT")) { ct.offset = -360; break; }
111 if (!case_diffs(x,"MET")) { ct.offset = 60; break; }
112 if (!case_diffs(x,"METDST")) { ct.offset = 120; break; }
113 if (!case_diffs(x,"MST")) { ct.offset = -420; break; }
114 if (!case_diffs(x,"PDT")) { ct.offset = -420; break; }
115 if (!case_diffs(x,"PST")) { ct.offset = -480; break; }
116 return 1;
117 case 10:
118 if (!case_diffs(x,"DST")) ct.offset += 60;
119 break;
120 }
121 if (state < 10) ++state;
122 }
123 }
124
125 if (known) {
126 out->known = known;
127 out->ct = ct;
128 }
129 return 1;
130}
int mess822_when(mess822_time *out, char *in)
Definition: mess822_when.c:9
stralloc tokens
Definition: 822received.c:25
stralloc out
Definition: b64decode.c:12
int mess822_token(stralloc *, char *)
Definition: mess822_token.c:5
int day
Definition: caldate.h:7
long year
Definition: caldate.h:5
int month
Definition: caldate.h:6
Definition: caltime.h:7
int hour
Definition: caltime.h:9
struct caldate date
Definition: caltime.h:8
int minute
Definition: caltime.h:10
int second
Definition: caltime.h:11
long offset
Definition: caltime.h:12