home_run 0.9.0-x86-mswin32-60 → 0.9.1-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,352 @@
1
+ #include "date_ext.h"
2
+
3
+ #define RHRR_ISO_PARSER 0x1
4
+ #define RHRR_RFC_PARSER 0x2
5
+ #define RHRR_CLF_PARSER 0x4
6
+
7
+ #define RHRR_ISO_TIME_SET 0x1
8
+ #define RHRR_ISO_ZONE_SET 0x2
9
+
10
+ #define RHRR_RFC_TIME_SET 0x1
11
+ #define RHRR_RFC_ZONE_SET 0x2
12
+ #define RHRR_RFC_ZONE_NUM_SET 0x4
13
+ #define RHRR_RFC_ZONE_NAME_SET 0x8
14
+
15
+ #define RHRR_CLF_TIME_SET 0x1
16
+ #define RHRR_CLF_ZONE_SET 0x2
17
+
18
+ #define RHRR_BAD_OFFSET 86400
19
+
20
+ extern const char * rhrd__abbr_month_names[];
21
+ extern const char * rhrd__abbr_day_names[];
22
+
23
+ extern VALUE rhrd_sym_hour;
24
+ extern VALUE rhrd_sym_mday;
25
+ extern VALUE rhrd_sym_min;
26
+ extern VALUE rhrd_sym_mon;
27
+ extern VALUE rhrd_sym_offset;
28
+ extern VALUE rhrd_sym_sec;
29
+ extern VALUE rhrd_sym_wday;
30
+ extern VALUE rhrd_sym_year;
31
+ extern VALUE rhrd_sym_zone;
32
+
33
+ const char * rhrd__rfc_zone_names[] = {"UT", "GMT", "EST", "EDT", "CST", "CDT", "MST", "MDT", "PST", "PDT",
34
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M",
35
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
36
+ long rhrd__rfc_zone_offsets[] = {0, 0, -18000, -14400, -21600, -18000, -25200, -21600, -28800, -25200,
37
+ 3600, 7200, 10800, 14400, 18000, 21600, 25200, 28800, 32400, 36000, 39600, 43200,
38
+ -3600, -7200, -10800, -14400, -18000, -21600, -25200, -28800, -32400, -36000, -39600, -43200, 0};
39
+
40
+ long rhrd__rfc_zone_offset(char * str) {
41
+ int i;
42
+
43
+ for(i = 0; i < 36; i++) {
44
+ if(strcasecmp(rhrd__rfc_zone_names[i], str) == 0) {
45
+ return rhrd__rfc_zone_offsets[i];
46
+ }
47
+ }
48
+
49
+ return RHRR_BAD_OFFSET;
50
+ }
51
+
52
+ long rhrd__month_num(char * str) {
53
+ int i;
54
+
55
+ for(i = 1; i < 13; i++) {
56
+ if(strncasecmp(str, rhrd__abbr_month_names[i], 3) == 0) {
57
+ return i;
58
+ }
59
+ }
60
+
61
+ return atol(str);
62
+ }
63
+
64
+ long rhrd__weekday_num(char * str) {
65
+ int i;
66
+
67
+ for(i = 0; i < 7; i++) {
68
+ if(strncasecmp(str, rhrd__abbr_day_names[i], 3) == 0) {
69
+ return i;
70
+ }
71
+ }
72
+
73
+ return 7;
74
+ }
75
+
76
+ %%{
77
+ machine date_parser;
78
+
79
+ # Shared
80
+
81
+ abbr_month_name = /jan/i | /feb/i | /mar/i | /apr/i | /may/i | /jun/i |
82
+ /jul/i | /aug/i | /sep/i | /oct/i | /nov/i | /dec/i;
83
+ # ISO 8601
84
+
85
+ action tag_iso_year { t_iso_year = p; }
86
+ action tag_iso_month { t_iso_month = p; }
87
+ action tag_iso_day { t_iso_day = p; }
88
+ action tag_iso_hour { t_iso_hour = p; }
89
+ action tag_iso_minute { t_iso_minute = p; }
90
+ action tag_iso_second { t_iso_second = p; }
91
+ action tag_iso_zone { t_iso_zone = p; }
92
+
93
+ action set_iso_time { iso_state |= RHRR_ISO_TIME_SET; }
94
+ action set_iso_zone {
95
+ t_iso_zone_end = p;
96
+ iso_state |= RHRR_ISO_ZONE_SET;
97
+ }
98
+ action set_parser_iso { parsers |= RHRR_ISO_PARSER; }
99
+
100
+ iso_year = ('-'? . digit{4}) >tag_iso_year;
101
+ iso_month = ('0' . [1-9] | '1' . [0-2]) >tag_iso_month;
102
+ iso_day = ('0' . [1-9] | [12] . [0-9] | '3' . [01]) >tag_iso_day;
103
+ iso_hour = ([0-1] . [0-9] | '2' . [0-4]) >tag_iso_hour;
104
+ iso_minute = ([0-5] . [0-9]) >tag_iso_minute;
105
+ iso_second = ([0-5] . [0-9]) >tag_iso_second;
106
+ iso_zone = ([+\-] . digit{2} . ':' . digit{2}) > tag_iso_zone;
107
+
108
+ iso_date = (iso_year . [\-/] . iso_month . [\-/] . iso_day);
109
+ iso_time = (iso_hour . ':' . iso_minute . ':' . iso_second . (iso_zone %set_iso_zone)?) %set_iso_time;
110
+ iso_date_time = (iso_date . ([Tt ] . iso_time)? . space*) %/set_parser_iso;
111
+
112
+ # RFC 2822 / HTTP
113
+
114
+ action tag_rfc_wday { t_rfc_wday = p; }
115
+ action tag_rfc_day { t_rfc_day = p; }
116
+ action tag_rfc_month { t_rfc_month = p; }
117
+ action tag_rfc_year { t_rfc_year = p; }
118
+ action tag_rfc_hour { t_rfc_hour = p; }
119
+ action tag_rfc_minute { t_rfc_minute = p; }
120
+ action tag_rfc_second { t_rfc_second = p; }
121
+ action tag_rfc_zone { t_rfc_zone = p; }
122
+
123
+ action set_rfc_time { rfc_state |= RHRR_RFC_TIME_SET; }
124
+ action set_rfc_zone_num {
125
+ t_rfc_zone_end = p;
126
+ rfc_state |= RHRR_RFC_ZONE_SET | RHRR_RFC_ZONE_NUM_SET;
127
+ }
128
+ action set_rfc_zone_name {
129
+ t_rfc_zone_end = p;
130
+ rfc_state |= RHRR_RFC_ZONE_SET | RHRR_RFC_ZONE_NAME_SET;
131
+ }
132
+ action set_parser_rfc { parsers |= RHRR_RFC_PARSER; }
133
+
134
+ rfc_wday = (/sun/i | /mon/i | /tue/i | /wed/i | /thu/i | /fri/i | /sat/i) >tag_rfc_wday;
135
+ rfc_day = ([ 0] . [1-9] | [12] . [0-9] | '3' . [01]) >tag_rfc_day;
136
+ rfc_month = abbr_month_name >tag_rfc_month;
137
+ rfc_year = ('-'? . digit{4}) >tag_rfc_year;
138
+ rfc_hour = ([0-1] . [0-9] | '2' . [0-4]) >tag_rfc_hour;
139
+ rfc_minute = ([0-5] . [0-9]) >tag_rfc_minute;
140
+ rfc_second = ([0-5] . [0-9]) >tag_rfc_second;
141
+ rfc_zone_num = ([+\-] . digit{4}) >tag_rfc_zone %set_rfc_zone_num;
142
+ rfc_zone_name = (/[a-ik-z]/i | /gmt/i | /ut/i | /[ecmp][ds]t/i) >tag_rfc_zone %set_rfc_zone_name;
143
+ rfc_zone = space* . (rfc_zone_num | rfc_zone_name );
144
+
145
+ rfc_date = (rfc_wday . ',' . space* . rfc_day . space* . rfc_month . space* . rfc_year);
146
+ rfc_time = (rfc_hour . ':' . rfc_minute . ':' . rfc_second . (space* . rfc_zone)?) %set_rfc_time;
147
+ rfc_date_time = (rfc_date . (space* . rfc_time)? . space*) %/set_parser_rfc;
148
+
149
+ # Common Log Format
150
+
151
+ action tag_clf_day { t_clf_day = p; }
152
+ action tag_clf_month { t_clf_month = p; }
153
+ action tag_clf_year { t_clf_year = p; }
154
+ action tag_clf_hour { t_clf_hour = p; }
155
+ action tag_clf_minute { t_clf_minute = p; }
156
+ action tag_clf_second { t_clf_second = p; }
157
+ action tag_clf_zone { t_clf_zone = p; }
158
+
159
+ action set_clf_time { clf_state |= RHRR_CLF_TIME_SET; }
160
+ action set_clf_zone {
161
+ t_clf_zone_end = p;
162
+ clf_state |= RHRR_CLF_ZONE_SET;
163
+ }
164
+ action set_parser_clf { parsers |= RHRR_CLF_PARSER; }
165
+
166
+ clf_year = ('-'? . digit{4}) >tag_clf_year;
167
+ clf_month = abbr_month_name >tag_clf_month;
168
+ clf_day = ('0' . [1-9] | [12] . [0-9] | '3' . [01]) >tag_clf_day;
169
+ clf_hour = ([0-1] . [0-9] | '2' . [0-4]) >tag_clf_hour;
170
+ clf_minute = ([0-5] . [0-9]) >tag_clf_minute;
171
+ clf_second = ([0-5] . [0-9]) >tag_clf_second;
172
+ clf_zone = ([+\-] . digit{4}) > tag_clf_zone;
173
+
174
+ clf_date = (clf_day . '/' . clf_month . '/' . clf_year);
175
+ clf_time = (clf_hour . ':' . clf_minute . ':' . clf_second . (space* . clf_zone %set_clf_zone)?) %set_clf_time;
176
+ clf_date_time = (clf_date . (':' . clf_time)? . space*) %/set_parser_clf;
177
+
178
+ date_time = (iso_date_time | rfc_date_time | clf_date_time);
179
+ main := (space* . date_time);
180
+ write data;
181
+ }%%
182
+
183
+ VALUE rhrd__ragel_parse(char * p, long len) {
184
+ VALUE hash;
185
+ long state = 0;
186
+ long parsers = 0;
187
+
188
+ long year = 0;
189
+ long month = 0;
190
+ long day = 0;
191
+ long wday = 0;
192
+
193
+ long hour = 0;
194
+ long minute = 0;
195
+ long second = 0;
196
+
197
+ VALUE rzone;
198
+ char * zone = NULL;
199
+ long zone_len = 0;
200
+ long offset = 0;
201
+
202
+ long iso_state = 0;
203
+ char * t_iso_year = NULL;
204
+ char * t_iso_month = NULL;
205
+ char * t_iso_day = NULL;
206
+ char * t_iso_hour= NULL;
207
+ char * t_iso_minute = NULL;
208
+ char * t_iso_second = NULL;
209
+ char * t_iso_zone = NULL;
210
+ char * t_iso_zone_end = NULL;
211
+
212
+ long rfc_state = 0;
213
+ char * t_rfc_wday = NULL;
214
+ char * t_rfc_year = NULL;
215
+ char * t_rfc_month = NULL;
216
+ char * t_rfc_day = NULL;
217
+ char * t_rfc_hour= NULL;
218
+ char * t_rfc_minute = NULL;
219
+ char * t_rfc_second = NULL;
220
+ char * t_rfc_zone = NULL;
221
+ char * t_rfc_zone_end = NULL;
222
+
223
+ long clf_state = 0;
224
+ char * t_clf_year = NULL;
225
+ char * t_clf_month = NULL;
226
+ char * t_clf_day = NULL;
227
+ char * t_clf_hour= NULL;
228
+ char * t_clf_minute = NULL;
229
+ char * t_clf_second = NULL;
230
+ char * t_clf_zone = NULL;
231
+ char * t_clf_zone_end = NULL;
232
+
233
+ int cs = 0;
234
+ char * eof;
235
+ char * pe;
236
+ pe = p + len;
237
+ eof = pe;
238
+
239
+ %%write init;
240
+ %%write exec;
241
+
242
+ switch(parsers) {
243
+ case RHRR_ISO_PARSER:
244
+ year = atol(t_iso_year);
245
+ month = atol(t_iso_month);
246
+ day = atol(t_iso_day);
247
+ state |= RHRR_YEAR_SET | RHRR_MONTH_SET | RHRR_DAY_SET;
248
+ if (iso_state & RHRR_ISO_TIME_SET) {
249
+ hour = atol(t_iso_hour);
250
+ minute = atol(t_iso_minute);
251
+ second = atol(t_iso_second);
252
+ state |= RHRR_HOUR_SET | RHRR_MINUTE_SET | RHRR_SECOND_SET;
253
+ if (iso_state & RHRR_ISO_ZONE_SET) {
254
+ zone = t_iso_zone;
255
+ zone_len = t_iso_zone_end - zone;
256
+ offset = atol(zone) * 3600 + atol(zone + 4) * 60;
257
+ state |= RHRR_ZONE_SET | RHRR_OFFSET_SET;
258
+ }
259
+ }
260
+ break;
261
+ case RHRR_RFC_PARSER:
262
+ wday = rhrd__weekday_num(t_rfc_wday);
263
+ day = atol(t_rfc_day);
264
+ month = rhrd__month_num(t_rfc_month);
265
+ year = atol(t_rfc_year);
266
+ state |= RHRR_WDAY_SET | RHRR_YEAR_SET | RHRR_MONTH_SET | RHRR_DAY_SET;
267
+ if (rfc_state & RHRR_RFC_TIME_SET) {
268
+ hour = atol(t_rfc_hour);
269
+ minute = atol(t_rfc_minute);
270
+ second = atol(t_rfc_second);
271
+ state |= RHRR_HOUR_SET | RHRR_MINUTE_SET | RHRR_SECOND_SET;
272
+ if (rfc_state & RHRR_RFC_ZONE_SET) {
273
+ zone = t_rfc_zone;
274
+ zone_len = t_rfc_zone_end - zone;
275
+ state |= RHRR_ZONE_SET;
276
+ if (rfc_state & RHRR_RFC_ZONE_NUM_SET) {
277
+ offset = atol(zone);
278
+ offset = (offset/100) * 3600 + (labs(offset) % 100) * 60 * (offset < 0 ? -1 : 1);
279
+ state |= RHRR_OFFSET_SET;
280
+ } else if (rfc_state & RHRR_RFC_ZONE_NAME_SET) {
281
+ offset = rhrd__rfc_zone_offset(zone);
282
+ if (offset == RHRR_BAD_OFFSET) {
283
+ state = 0;
284
+ } else {
285
+ state |= RHRR_OFFSET_SET;
286
+ }
287
+ }
288
+ }
289
+ }
290
+ break;
291
+ case RHRR_CLF_PARSER:
292
+ year = atol(t_clf_year);
293
+ month = rhrd__month_num(t_clf_month);
294
+ day = atol(t_clf_day);
295
+ state |= RHRR_YEAR_SET | RHRR_MONTH_SET | RHRR_DAY_SET;
296
+ if (clf_state & RHRR_ISO_TIME_SET) {
297
+ hour = atol(t_clf_hour);
298
+ minute = atol(t_clf_minute);
299
+ second = atol(t_clf_second);
300
+ state |= RHRR_HOUR_SET | RHRR_MINUTE_SET | RHRR_SECOND_SET;
301
+ if (clf_state & RHRR_ISO_ZONE_SET) {
302
+ zone = t_clf_zone;
303
+ zone_len = t_clf_zone_end - zone;
304
+ offset = atol(zone);
305
+ offset = (offset/100) * 3600 + (labs(offset) % 100) * 60 * (offset < 0 ? -1 : 1);
306
+ state |= RHRR_ZONE_SET | RHRR_OFFSET_SET;
307
+ }
308
+ }
309
+ break;
310
+ }
311
+
312
+ if (!state) {
313
+ return Qnil;
314
+ }
315
+
316
+ hash = rb_hash_new();
317
+ if(state & RHRR_WDAY_SET) {
318
+ rb_hash_aset(hash, rhrd_sym_wday, INT2NUM(wday));
319
+ }
320
+ if(state & RHRR_YEAR_SET) {
321
+ rb_hash_aset(hash, rhrd_sym_year, INT2NUM(year));
322
+ }
323
+ if(state & RHRR_MONTH_SET) {
324
+ rb_hash_aset(hash, rhrd_sym_mon, INT2NUM(month));
325
+ }
326
+ if(state & RHRR_DAY_SET) {
327
+ rb_hash_aset(hash, rhrd_sym_mday, INT2NUM(day));
328
+ }
329
+ if(state & RHRR_HOUR_SET) {
330
+ rb_hash_aset(hash, rhrd_sym_hour, INT2NUM(hour));
331
+ }
332
+ if(state & RHRR_MINUTE_SET) {
333
+ rb_hash_aset(hash, rhrd_sym_min, INT2NUM(minute));
334
+ }
335
+ if(state & RHRR_SECOND_SET) {
336
+ rb_hash_aset(hash, rhrd_sym_sec, INT2NUM(second));
337
+ }
338
+ if(state & RHRR_ZONE_SET) {
339
+ rzone = rb_str_new(zone, zone_len);
340
+ rb_hash_aset(hash, rhrd_sym_zone, rzone);
341
+ if (state & RHRR_OFFSET_SET) {
342
+ rb_hash_aset(hash, rhrd_sym_offset, INT2NUM(offset));
343
+ } else {
344
+ rzone = rhrd_s_zone_to_diff(rzone, rzone);
345
+ if(RTEST(rzone)) {
346
+ rb_hash_aset(hash, rhrd_sym_offset, rzone);
347
+ }
348
+ }
349
+ }
350
+
351
+ return hash;
352
+ }