/src/php-src/ext/date/lib/parse_iso_intervals.c
Line | Count | Source |
1 | | /* Generated by re2c 1.0.3 on Thu Oct 1 17:09:40 2026 */ |
2 | | #line 1 "ext/date/lib/parse_iso_intervals.re" |
3 | | /* |
4 | | * The MIT License (MIT) |
5 | | * |
6 | | * Copyright (c) 2015-2019 Derick Rethans |
7 | | * |
8 | | * Permission is hereby granted, free of charge, to any person obtaining a copy |
9 | | * of this software and associated documentation files (the "Software"), to deal |
10 | | * in the Software without restriction, including without limitation the rights |
11 | | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
12 | | * copies of the Software, and to permit persons to whom the Software is |
13 | | * furnished to do so, subject to the following conditions: |
14 | | * |
15 | | * The above copyright notice and this permission notice shall be included in |
16 | | * all copies or substantial portions of the Software. |
17 | | * |
18 | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
19 | | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
20 | | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
21 | | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
22 | | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
23 | | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
24 | | * THE SOFTWARE. |
25 | | */ |
26 | | |
27 | | #include "timelib.h" |
28 | | #include "timelib_private.h" |
29 | | |
30 | | #include <ctype.h> |
31 | | |
32 | 0 | #define EOI 257 |
33 | | |
34 | 0 | #define TIMELIB_PERIOD 260 |
35 | 0 | #define TIMELIB_ISO_DATE 261 |
36 | | #define TIMELIB_ERROR 999 |
37 | 0 | #define TIMELIB_MAX_ERRORS 1000 |
38 | | |
39 | | typedef unsigned char uchar; |
40 | | |
41 | | #define BSIZE 8192 |
42 | | |
43 | 0 | #define YYCTYPE uchar |
44 | 0 | #define YYCURSOR cursor |
45 | 0 | #define YYLIMIT s->lim |
46 | 0 | #define YYMARKER s->ptr |
47 | 0 | #define YYFILL(n) return EOI; |
48 | | |
49 | | #define RET(i) {s->cur = cursor; return i;} |
50 | | |
51 | 0 | #define timelib_string_free timelib_free |
52 | | |
53 | 0 | #define TIMELIB_INIT s->cur = cursor; str = timelib_string(s); ptr = str |
54 | 0 | #define TIMELIB_DEINIT timelib_string_free(str) |
55 | | |
56 | | #ifdef DEBUG_PARSER |
57 | | #define DEBUG_OUTPUT(s) printf("%s\n", s); |
58 | | #define YYDEBUG(s,c) { if (s != -1) { printf("state: %d ", s); printf("[%c]\n", c); } } |
59 | | #else |
60 | | #define DEBUG_OUTPUT(s) |
61 | | #define YYDEBUG(s,c) |
62 | | #endif |
63 | | |
64 | | typedef struct _Scanner { |
65 | | int fd; |
66 | | uchar *lim, *str, *ptr, *cur, *tok, *pos; |
67 | | unsigned int line, len; |
68 | | timelib_error_container *errors; |
69 | | |
70 | | timelib_time *begin; |
71 | | timelib_time *end; |
72 | | timelib_rel_time *period; |
73 | | int recurrences; |
74 | | |
75 | | int have_period; |
76 | | int have_recurrences; |
77 | | int have_date; |
78 | | int have_begin_date; |
79 | | int have_end_date; |
80 | | } Scanner; |
81 | | |
82 | | static void add_error(Scanner *s, const char *error) |
83 | 0 | { |
84 | 0 | if (s->errors->error_count >= TIMELIB_MAX_ERRORS) { |
85 | 0 | return; |
86 | 0 | } |
87 | | |
88 | 0 | s->errors->error_count++; |
89 | 0 | s->errors->error_messages = timelib_realloc(s->errors->error_messages, s->errors->error_count * sizeof(timelib_error_message)); |
90 | 0 | s->errors->error_messages[s->errors->error_count - 1].position = s->tok ? s->tok - s->str : 0; |
91 | 0 | s->errors->error_messages[s->errors->error_count - 1].character = s->tok ? *s->tok : 0; |
92 | 0 | s->errors->error_messages[s->errors->error_count - 1].message = timelib_strdup(error); |
93 | 0 | } |
94 | | |
95 | | static char *timelib_string(Scanner *s) |
96 | 0 | { |
97 | 0 | char *tmp = timelib_calloc(1, s->cur - s->tok + 1); |
98 | 0 | memcpy(tmp, s->tok, s->cur - s->tok); |
99 | |
|
100 | 0 | return tmp; |
101 | 0 | } |
102 | | |
103 | | static timelib_sll timelib_get_nr(const char **ptr, int max_length) |
104 | 0 | { |
105 | 0 | const char *begin, *end; |
106 | 0 | char *str; |
107 | 0 | timelib_sll tmp_nr = TIMELIB_UNSET; |
108 | 0 | int len = 0; |
109 | |
|
110 | 0 | while ((**ptr < '0') || (**ptr > '9')) { |
111 | 0 | if (**ptr == '\0') { |
112 | 0 | return TIMELIB_UNSET; |
113 | 0 | } |
114 | 0 | ++*ptr; |
115 | 0 | } |
116 | 0 | begin = *ptr; |
117 | 0 | while ((**ptr >= '0') && (**ptr <= '9') && len < max_length) { |
118 | 0 | ++*ptr; |
119 | 0 | ++len; |
120 | 0 | } |
121 | 0 | end = *ptr; |
122 | 0 | str = timelib_calloc(1, end - begin + 1); |
123 | 0 | memcpy(str, begin, end - begin); |
124 | 0 | tmp_nr = strtoll(str, NULL, 10); |
125 | 0 | timelib_free(str); |
126 | 0 | return tmp_nr; |
127 | 0 | } |
128 | | |
129 | | static timelib_ull timelib_get_unsigned_nr(const char **ptr, int max_length) |
130 | 0 | { |
131 | 0 | timelib_ull dir = 1; |
132 | |
|
133 | 0 | while (((**ptr < '0') || (**ptr > '9')) && (**ptr != '+') && (**ptr != '-')) { |
134 | 0 | if (**ptr == '\0') { |
135 | 0 | return TIMELIB_UNSET; |
136 | 0 | } |
137 | 0 | ++*ptr; |
138 | 0 | } |
139 | | |
140 | 0 | while (**ptr == '+' || **ptr == '-') |
141 | 0 | { |
142 | 0 | if (**ptr == '-') { |
143 | 0 | dir *= -1; |
144 | 0 | } |
145 | 0 | ++*ptr; |
146 | 0 | } |
147 | 0 | return dir * timelib_get_nr(ptr, max_length); |
148 | 0 | } |
149 | | |
150 | | #define timelib_split_free(arg) { \ |
151 | | int i; \ |
152 | | for (i = 0; i < arg.c; i++) { \ |
153 | | timelib_free(arg.v[i]); \ |
154 | | } \ |
155 | | if (arg.v) { \ |
156 | | timelib_free(arg.v); \ |
157 | | } \ |
158 | | } |
159 | | |
160 | | /* date parser's scan function too large for VC6 - VC7.x |
161 | | drop the optimization solves the problem */ |
162 | | #ifdef PHP_WIN32 |
163 | | #pragma optimize( "", off ) |
164 | | #endif |
165 | | static int scan(Scanner *s) |
166 | 0 | { |
167 | 0 | uchar *cursor = s->cur; |
168 | 0 | char *str; |
169 | 0 | const char *ptr = NULL; |
170 | |
|
171 | 0 | std: |
172 | 0 | s->tok = cursor; |
173 | 0 | s->len = 0; |
174 | 0 | #line 199 "ext/date/lib/parse_iso_intervals.re" |
175 | | |
176 | | |
177 | |
|
178 | 0 | #line 179 "ext/date/lib/parse_iso_intervals.c" |
179 | 0 | { |
180 | 0 | YYCTYPE yych; |
181 | 0 | unsigned int yyaccept = 0; |
182 | 0 | static const unsigned char yybm[] = { |
183 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
184 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
185 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
186 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
187 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
188 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
189 | 0 | 128, 128, 128, 128, 128, 128, 128, 128, |
190 | 0 | 128, 128, 0, 0, 0, 0, 0, 0, |
191 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
192 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
193 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
194 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
195 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
196 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
197 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
198 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
199 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
200 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
201 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
202 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
203 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
204 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
205 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
206 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
207 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
208 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
209 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
210 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
211 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
212 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
213 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
214 | 0 | 0, 0, 0, 0, 0, 0, 0, 0, |
215 | 0 | }; |
216 | 0 | YYDEBUG(0, *YYCURSOR); |
217 | 0 | if ((YYLIMIT - YYCURSOR) < 20) YYFILL(20); |
218 | 0 | yych = *YYCURSOR; |
219 | 0 | if (yych <= ',') { |
220 | 0 | if (yych <= '\n') { |
221 | 0 | if (yych <= 0x00) goto yy2; |
222 | 0 | if (yych <= 0x08) goto yy4; |
223 | 0 | if (yych <= '\t') goto yy6; |
224 | 0 | } else { |
225 | 0 | if (yych == ' ') goto yy6; |
226 | 0 | if (yych <= '+') goto yy4; |
227 | 0 | goto yy6; |
228 | 0 | } |
229 | 0 | } else { |
230 | 0 | if (yych <= 'O') { |
231 | 0 | if (yych <= '-') goto yy4; |
232 | 0 | if (yych <= '/') goto yy6; |
233 | 0 | if (yych <= '9') goto yy8; |
234 | 0 | goto yy4; |
235 | 0 | } else { |
236 | 0 | if (yych <= 'P') goto yy9; |
237 | 0 | if (yych == 'R') goto yy11; |
238 | 0 | goto yy4; |
239 | 0 | } |
240 | 0 | } |
241 | 0 | yy2: |
242 | 0 | YYDEBUG(2, *YYCURSOR); |
243 | 0 | ++YYCURSOR; |
244 | 0 | YYDEBUG(3, *YYCURSOR); |
245 | 0 | #line 306 "ext/date/lib/parse_iso_intervals.re" |
246 | 0 | { |
247 | 0 | s->pos = cursor; s->line++; |
248 | 0 | goto std; |
249 | 0 | } |
250 | 0 | #line 251 "ext/date/lib/parse_iso_intervals.c" |
251 | 0 | yy4: |
252 | 0 | YYDEBUG(4, *YYCURSOR); |
253 | 0 | ++YYCURSOR; |
254 | 0 | yy5: |
255 | 0 | YYDEBUG(5, *YYCURSOR); |
256 | 0 | #line 312 "ext/date/lib/parse_iso_intervals.re" |
257 | 0 | { |
258 | 0 | add_error(s, "Unexpected character"); |
259 | 0 | goto std; |
260 | 0 | } |
261 | 0 | #line 262 "ext/date/lib/parse_iso_intervals.c" |
262 | 0 | yy6: |
263 | 0 | YYDEBUG(6, *YYCURSOR); |
264 | 0 | ++YYCURSOR; |
265 | 0 | YYDEBUG(7, *YYCURSOR); |
266 | 0 | #line 301 "ext/date/lib/parse_iso_intervals.re" |
267 | 0 | { |
268 | 0 | goto std; |
269 | 0 | } |
270 | 0 | #line 271 "ext/date/lib/parse_iso_intervals.c" |
271 | 0 | yy8: |
272 | 0 | YYDEBUG(8, *YYCURSOR); |
273 | 0 | yyaccept = 0; |
274 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
275 | 0 | if (yych <= '/') goto yy5; |
276 | 0 | if (yych <= '9') goto yy12; |
277 | 0 | goto yy5; |
278 | 0 | yy9: |
279 | 0 | YYDEBUG(9, *YYCURSOR); |
280 | 0 | yyaccept = 1; |
281 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
282 | 0 | if (yych <= '/') goto yy10; |
283 | 0 | if (yych <= '9') goto yy14; |
284 | 0 | if (yych == 'T') goto yy15; |
285 | 0 | yy10: |
286 | 0 | YYDEBUG(10, *YYCURSOR); |
287 | 0 | #line 239 "ext/date/lib/parse_iso_intervals.re" |
288 | 0 | { |
289 | 0 | timelib_sll nr; |
290 | 0 | int in_time = 0; |
291 | 0 | DEBUG_OUTPUT("period"); |
292 | 0 | TIMELIB_INIT; |
293 | 0 | ptr++; |
294 | 0 | do { |
295 | 0 | if ( *ptr == 'T' ) { |
296 | 0 | in_time = 1; |
297 | 0 | ptr++; |
298 | 0 | } |
299 | 0 | if ( *ptr == '\0' ) { |
300 | 0 | add_error(s, "Missing expected time part"); |
301 | 0 | break; |
302 | 0 | } |
303 | | |
304 | 0 | nr = timelib_get_unsigned_nr(&ptr, 12); |
305 | 0 | switch (*ptr) { |
306 | 0 | case 'Y': s->period->y = nr; break; |
307 | 0 | case 'W': s->period->d += nr * 7; break; |
308 | 0 | case 'D': s->period->d += nr; break; |
309 | 0 | case 'H': s->period->h = nr; break; |
310 | 0 | case 'S': s->period->s = nr; break; |
311 | 0 | case 'M': |
312 | 0 | if (in_time) { |
313 | 0 | s->period->i = nr; |
314 | 0 | } else { |
315 | 0 | s->period->m = nr; |
316 | 0 | } |
317 | 0 | break; |
318 | 0 | default: |
319 | 0 | add_error(s, "Undefined period specifier"); |
320 | 0 | break; |
321 | 0 | } |
322 | 0 | ptr++; |
323 | 0 | } while (!s->errors->error_count && *ptr); |
324 | 0 | s->have_period = 1; |
325 | 0 | TIMELIB_DEINIT; |
326 | 0 | return TIMELIB_PERIOD; |
327 | 0 | } |
328 | 0 | #line 329 "ext/date/lib/parse_iso_intervals.c" |
329 | 0 | yy11: |
330 | 0 | YYDEBUG(11, *YYCURSOR); |
331 | 0 | yych = *++YYCURSOR; |
332 | 0 | if (yybm[0+yych] & 128) { |
333 | 0 | goto yy16; |
334 | 0 | } |
335 | 0 | goto yy5; |
336 | 0 | yy12: |
337 | 0 | YYDEBUG(12, *YYCURSOR); |
338 | 0 | yych = *++YYCURSOR; |
339 | 0 | if (yych <= '/') goto yy13; |
340 | 0 | if (yych <= '9') goto yy19; |
341 | 0 | yy13: |
342 | 0 | YYDEBUG(13, *YYCURSOR); |
343 | 0 | YYCURSOR = YYMARKER; |
344 | 0 | if (yyaccept == 0) { |
345 | 0 | goto yy5; |
346 | 0 | } else { |
347 | 0 | goto yy10; |
348 | 0 | } |
349 | 0 | yy14: |
350 | 0 | YYDEBUG(14, *YYCURSOR); |
351 | 0 | yych = *++YYCURSOR; |
352 | 0 | if (yych <= 'L') { |
353 | 0 | if (yych <= '9') { |
354 | 0 | if (yych <= '/') goto yy13; |
355 | 0 | goto yy20; |
356 | 0 | } else { |
357 | 0 | if (yych == 'D') goto yy21; |
358 | 0 | goto yy13; |
359 | 0 | } |
360 | 0 | } else { |
361 | 0 | if (yych <= 'W') { |
362 | 0 | if (yych <= 'M') goto yy22; |
363 | 0 | if (yych <= 'V') goto yy13; |
364 | 0 | goto yy23; |
365 | 0 | } else { |
366 | 0 | if (yych == 'Y') goto yy24; |
367 | 0 | goto yy13; |
368 | 0 | } |
369 | 0 | } |
370 | 0 | yy15: |
371 | 0 | YYDEBUG(15, *YYCURSOR); |
372 | 0 | yyaccept = 1; |
373 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
374 | 0 | if (yych <= '/') goto yy10; |
375 | 0 | if (yych <= '9') goto yy25; |
376 | 0 | goto yy10; |
377 | 0 | yy16: |
378 | 0 | YYDEBUG(16, *YYCURSOR); |
379 | 0 | ++YYCURSOR; |
380 | 0 | if (YYLIMIT <= YYCURSOR) YYFILL(1); |
381 | 0 | yych = *YYCURSOR; |
382 | 0 | YYDEBUG(17, *YYCURSOR); |
383 | 0 | if (yybm[0+yych] & 128) { |
384 | 0 | goto yy16; |
385 | 0 | } |
386 | 0 | YYDEBUG(18, *YYCURSOR); |
387 | 0 | #line 204 "ext/date/lib/parse_iso_intervals.re" |
388 | 0 | { |
389 | 0 | DEBUG_OUTPUT("recurrences"); |
390 | 0 | TIMELIB_INIT; |
391 | 0 | ptr++; |
392 | 0 | s->recurrences = timelib_get_unsigned_nr(&ptr, 9); |
393 | 0 | TIMELIB_DEINIT; |
394 | 0 | s->have_recurrences = 1; |
395 | 0 | return TIMELIB_PERIOD; |
396 | 0 | } |
397 | 0 | #line 398 "ext/date/lib/parse_iso_intervals.c" |
398 | 0 | yy19: |
399 | 0 | YYDEBUG(19, *YYCURSOR); |
400 | 0 | yych = *++YYCURSOR; |
401 | 0 | if (yych <= '/') goto yy13; |
402 | 0 | if (yych <= '9') goto yy27; |
403 | 0 | goto yy13; |
404 | 0 | yy20: |
405 | 0 | YYDEBUG(20, *YYCURSOR); |
406 | 0 | yych = *++YYCURSOR; |
407 | 0 | if (yych <= 'L') { |
408 | 0 | if (yych <= '9') { |
409 | 0 | if (yych <= '/') goto yy13; |
410 | 0 | goto yy28; |
411 | 0 | } else { |
412 | 0 | if (yych != 'D') goto yy13; |
413 | 0 | } |
414 | 0 | } else { |
415 | 0 | if (yych <= 'W') { |
416 | 0 | if (yych <= 'M') goto yy22; |
417 | 0 | if (yych <= 'V') goto yy13; |
418 | 0 | goto yy23; |
419 | 0 | } else { |
420 | 0 | if (yych == 'Y') goto yy24; |
421 | 0 | goto yy13; |
422 | 0 | } |
423 | 0 | } |
424 | 0 | yy21: |
425 | 0 | YYDEBUG(21, *YYCURSOR); |
426 | 0 | yych = *++YYCURSOR; |
427 | 0 | if (yych == 'T') goto yy15; |
428 | 0 | goto yy10; |
429 | 0 | yy22: |
430 | 0 | YYDEBUG(22, *YYCURSOR); |
431 | 0 | yyaccept = 1; |
432 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
433 | 0 | if (yych <= '/') goto yy10; |
434 | 0 | if (yych <= '9') goto yy29; |
435 | 0 | if (yych == 'T') goto yy15; |
436 | 0 | goto yy10; |
437 | 0 | yy23: |
438 | 0 | YYDEBUG(23, *YYCURSOR); |
439 | 0 | yyaccept = 1; |
440 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
441 | 0 | if (yych <= '/') goto yy10; |
442 | 0 | if (yych <= '9') goto yy31; |
443 | 0 | if (yych == 'T') goto yy15; |
444 | 0 | goto yy10; |
445 | 0 | yy24: |
446 | 0 | YYDEBUG(24, *YYCURSOR); |
447 | 0 | yyaccept = 1; |
448 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
449 | 0 | if (yych <= '/') goto yy10; |
450 | 0 | if (yych <= '9') goto yy33; |
451 | 0 | if (yych == 'T') goto yy15; |
452 | 0 | goto yy10; |
453 | 0 | yy25: |
454 | 0 | YYDEBUG(25, *YYCURSOR); |
455 | 0 | ++YYCURSOR; |
456 | 0 | if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); |
457 | 0 | yych = *YYCURSOR; |
458 | 0 | YYDEBUG(26, *YYCURSOR); |
459 | 0 | if (yych <= 'H') { |
460 | 0 | if (yych <= '/') goto yy13; |
461 | 0 | if (yych <= '9') goto yy25; |
462 | 0 | if (yych <= 'G') goto yy13; |
463 | 0 | goto yy35; |
464 | 0 | } else { |
465 | 0 | if (yych <= 'M') { |
466 | 0 | if (yych <= 'L') goto yy13; |
467 | 0 | goto yy36; |
468 | 0 | } else { |
469 | 0 | if (yych == 'S') goto yy37; |
470 | 0 | goto yy13; |
471 | 0 | } |
472 | 0 | } |
473 | 0 | yy27: |
474 | 0 | YYDEBUG(27, *YYCURSOR); |
475 | 0 | yych = *++YYCURSOR; |
476 | 0 | if (yych <= '/') { |
477 | 0 | if (yych == '-') goto yy38; |
478 | 0 | goto yy13; |
479 | 0 | } else { |
480 | 0 | if (yych <= '0') goto yy39; |
481 | 0 | if (yych <= '1') goto yy40; |
482 | 0 | goto yy13; |
483 | 0 | } |
484 | 0 | yy28: |
485 | 0 | YYDEBUG(28, *YYCURSOR); |
486 | 0 | yych = *++YYCURSOR; |
487 | 0 | if (yych <= 'L') { |
488 | 0 | if (yych <= '9') { |
489 | 0 | if (yych <= '/') goto yy13; |
490 | 0 | goto yy41; |
491 | 0 | } else { |
492 | 0 | if (yych == 'D') goto yy21; |
493 | 0 | goto yy13; |
494 | 0 | } |
495 | 0 | } else { |
496 | 0 | if (yych <= 'W') { |
497 | 0 | if (yych <= 'M') goto yy22; |
498 | 0 | if (yych <= 'V') goto yy13; |
499 | 0 | goto yy23; |
500 | 0 | } else { |
501 | 0 | if (yych == 'Y') goto yy24; |
502 | 0 | goto yy13; |
503 | 0 | } |
504 | 0 | } |
505 | 0 | yy29: |
506 | 0 | YYDEBUG(29, *YYCURSOR); |
507 | 0 | ++YYCURSOR; |
508 | 0 | if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); |
509 | 0 | yych = *YYCURSOR; |
510 | 0 | YYDEBUG(30, *YYCURSOR); |
511 | 0 | if (yych <= 'C') { |
512 | 0 | if (yych <= '/') goto yy13; |
513 | 0 | if (yych <= '9') goto yy29; |
514 | 0 | goto yy13; |
515 | 0 | } else { |
516 | 0 | if (yych <= 'D') goto yy21; |
517 | 0 | if (yych == 'W') goto yy23; |
518 | 0 | goto yy13; |
519 | 0 | } |
520 | 0 | yy31: |
521 | 0 | YYDEBUG(31, *YYCURSOR); |
522 | 0 | ++YYCURSOR; |
523 | 0 | if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); |
524 | 0 | yych = *YYCURSOR; |
525 | 0 | YYDEBUG(32, *YYCURSOR); |
526 | 0 | if (yych <= '/') goto yy13; |
527 | 0 | if (yych <= '9') goto yy31; |
528 | 0 | if (yych == 'D') goto yy21; |
529 | 0 | goto yy13; |
530 | 0 | yy33: |
531 | 0 | YYDEBUG(33, *YYCURSOR); |
532 | 0 | ++YYCURSOR; |
533 | 0 | if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); |
534 | 0 | yych = *YYCURSOR; |
535 | 0 | YYDEBUG(34, *YYCURSOR); |
536 | 0 | if (yych <= 'D') { |
537 | 0 | if (yych <= '/') goto yy13; |
538 | 0 | if (yych <= '9') goto yy33; |
539 | 0 | if (yych <= 'C') goto yy13; |
540 | 0 | goto yy21; |
541 | 0 | } else { |
542 | 0 | if (yych <= 'M') { |
543 | 0 | if (yych <= 'L') goto yy13; |
544 | 0 | goto yy22; |
545 | 0 | } else { |
546 | 0 | if (yych == 'W') goto yy23; |
547 | 0 | goto yy13; |
548 | 0 | } |
549 | 0 | } |
550 | 0 | yy35: |
551 | 0 | YYDEBUG(35, *YYCURSOR); |
552 | 0 | yyaccept = 1; |
553 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
554 | 0 | if (yych <= '/') goto yy10; |
555 | 0 | if (yych <= '9') goto yy42; |
556 | 0 | goto yy10; |
557 | 0 | yy36: |
558 | 0 | YYDEBUG(36, *YYCURSOR); |
559 | 0 | yyaccept = 1; |
560 | 0 | yych = *(YYMARKER = ++YYCURSOR); |
561 | 0 | if (yych <= '/') goto yy10; |
562 | 0 | if (yych <= '9') goto yy44; |
563 | 0 | goto yy10; |
564 | 0 | yy37: |
565 | 0 | YYDEBUG(37, *YYCURSOR); |
566 | 0 | ++YYCURSOR; |
567 | 0 | goto yy10; |
568 | 0 | yy38: |
569 | 0 | YYDEBUG(38, *YYCURSOR); |
570 | 0 | yych = *++YYCURSOR; |
571 | 0 | if (yych <= '/') goto yy13; |
572 | 0 | if (yych <= '0') goto yy46; |
573 | 0 | if (yych <= '1') goto yy47; |
574 | 0 | goto yy13; |
575 | 0 | yy39: |
576 | 0 | YYDEBUG(39, *YYCURSOR); |
577 | 0 | yych = *++YYCURSOR; |
578 | 0 | if (yych <= '0') goto yy13; |
579 | 0 | if (yych <= '9') goto yy48; |
580 | 0 | goto yy13; |
581 | 0 | yy40: |
582 | 0 | YYDEBUG(40, *YYCURSOR); |
583 | 0 | yych = *++YYCURSOR; |
584 | 0 | if (yych <= '/') goto yy13; |
585 | 0 | if (yych <= '2') goto yy48; |
586 | 0 | goto yy13; |
587 | 0 | yy41: |
588 | 0 | YYDEBUG(41, *YYCURSOR); |
589 | 0 | yych = *++YYCURSOR; |
590 | 0 | if (yych == '-') goto yy49; |
591 | 0 | goto yy51; |
592 | 0 | yy42: |
593 | 0 | YYDEBUG(42, *YYCURSOR); |
594 | 0 | ++YYCURSOR; |
595 | 0 | if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); |
596 | 0 | yych = *YYCURSOR; |
597 | 0 | YYDEBUG(43, *YYCURSOR); |
598 | 0 | if (yych <= 'L') { |
599 | 0 | if (yych <= '/') goto yy13; |
600 | 0 | if (yych <= '9') goto yy42; |
601 | 0 | goto yy13; |
602 | 0 | } else { |
603 | 0 | if (yych <= 'M') goto yy36; |
604 | 0 | if (yych == 'S') goto yy37; |
605 | 0 | goto yy13; |
606 | 0 | } |
607 | 0 | yy44: |
608 | 0 | YYDEBUG(44, *YYCURSOR); |
609 | 0 | ++YYCURSOR; |
610 | 0 | if (YYLIMIT <= YYCURSOR) YYFILL(1); |
611 | 0 | yych = *YYCURSOR; |
612 | 0 | YYDEBUG(45, *YYCURSOR); |
613 | 0 | if (yych <= '/') goto yy13; |
614 | 0 | if (yych <= '9') goto yy44; |
615 | 0 | if (yych == 'S') goto yy37; |
616 | 0 | goto yy13; |
617 | 0 | yy46: |
618 | 0 | YYDEBUG(46, *YYCURSOR); |
619 | 0 | yych = *++YYCURSOR; |
620 | 0 | if (yych <= '0') goto yy13; |
621 | 0 | if (yych <= '9') goto yy52; |
622 | 0 | goto yy13; |
623 | 0 | yy47: |
624 | 0 | YYDEBUG(47, *YYCURSOR); |
625 | 0 | yych = *++YYCURSOR; |
626 | 0 | if (yych <= '/') goto yy13; |
627 | 0 | if (yych <= '2') goto yy52; |
628 | 0 | goto yy13; |
629 | 0 | yy48: |
630 | 0 | YYDEBUG(48, *YYCURSOR); |
631 | 0 | yych = *++YYCURSOR; |
632 | 0 | if (yych <= '/') goto yy13; |
633 | 0 | if (yych <= '0') goto yy53; |
634 | 0 | if (yych <= '2') goto yy54; |
635 | 0 | if (yych <= '3') goto yy55; |
636 | 0 | goto yy13; |
637 | 0 | yy49: |
638 | 0 | YYDEBUG(49, *YYCURSOR); |
639 | 0 | yych = *++YYCURSOR; |
640 | 0 | if (yych <= '/') goto yy13; |
641 | 0 | if (yych <= '0') goto yy56; |
642 | 0 | if (yych <= '1') goto yy57; |
643 | 0 | goto yy13; |
644 | 0 | yy50: |
645 | 0 | YYDEBUG(50, *YYCURSOR); |
646 | 0 | ++YYCURSOR; |
647 | 0 | if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); |
648 | 0 | yych = *YYCURSOR; |
649 | 0 | yy51: |
650 | 0 | YYDEBUG(51, *YYCURSOR); |
651 | 0 | if (yych <= 'L') { |
652 | 0 | if (yych <= '9') { |
653 | 0 | if (yych <= '/') goto yy13; |
654 | 0 | goto yy50; |
655 | 0 | } else { |
656 | 0 | if (yych == 'D') goto yy21; |
657 | 0 | goto yy13; |
658 | 0 | } |
659 | 0 | } else { |
660 | 0 | if (yych <= 'W') { |
661 | 0 | if (yych <= 'M') goto yy22; |
662 | 0 | if (yych <= 'V') goto yy13; |
663 | 0 | goto yy23; |
664 | 0 | } else { |
665 | 0 | if (yych == 'Y') goto yy24; |
666 | 0 | goto yy13; |
667 | 0 | } |
668 | 0 | } |
669 | 0 | yy52: |
670 | 0 | YYDEBUG(52, *YYCURSOR); |
671 | 0 | yych = *++YYCURSOR; |
672 | 0 | if (yych == '-') goto yy58; |
673 | 0 | goto yy13; |
674 | 0 | yy53: |
675 | 0 | YYDEBUG(53, *YYCURSOR); |
676 | 0 | yych = *++YYCURSOR; |
677 | 0 | if (yych <= '0') goto yy13; |
678 | 0 | if (yych <= '9') goto yy59; |
679 | 0 | goto yy13; |
680 | 0 | yy54: |
681 | 0 | YYDEBUG(54, *YYCURSOR); |
682 | 0 | yych = *++YYCURSOR; |
683 | 0 | if (yych <= '/') goto yy13; |
684 | 0 | if (yych <= '9') goto yy59; |
685 | 0 | goto yy13; |
686 | 0 | yy55: |
687 | 0 | YYDEBUG(55, *YYCURSOR); |
688 | 0 | yych = *++YYCURSOR; |
689 | 0 | if (yych <= '/') goto yy13; |
690 | 0 | if (yych <= '1') goto yy59; |
691 | 0 | goto yy13; |
692 | 0 | yy56: |
693 | 0 | YYDEBUG(56, *YYCURSOR); |
694 | 0 | yych = *++YYCURSOR; |
695 | 0 | if (yych <= '/') goto yy13; |
696 | 0 | if (yych <= '9') goto yy60; |
697 | 0 | goto yy13; |
698 | 0 | yy57: |
699 | 0 | YYDEBUG(57, *YYCURSOR); |
700 | 0 | yych = *++YYCURSOR; |
701 | 0 | if (yych <= '/') goto yy13; |
702 | 0 | if (yych <= '2') goto yy60; |
703 | 0 | goto yy13; |
704 | 0 | yy58: |
705 | 0 | YYDEBUG(58, *YYCURSOR); |
706 | 0 | yych = *++YYCURSOR; |
707 | 0 | if (yych <= '/') goto yy13; |
708 | 0 | if (yych <= '0') goto yy61; |
709 | 0 | if (yych <= '2') goto yy62; |
710 | 0 | if (yych <= '3') goto yy63; |
711 | 0 | goto yy13; |
712 | 0 | yy59: |
713 | 0 | YYDEBUG(59, *YYCURSOR); |
714 | 0 | yych = *++YYCURSOR; |
715 | 0 | if (yych == 'T') goto yy64; |
716 | 0 | goto yy13; |
717 | 0 | yy60: |
718 | 0 | YYDEBUG(60, *YYCURSOR); |
719 | 0 | yych = *++YYCURSOR; |
720 | 0 | if (yych == '-') goto yy65; |
721 | 0 | goto yy13; |
722 | 0 | yy61: |
723 | 0 | YYDEBUG(61, *YYCURSOR); |
724 | 0 | yych = *++YYCURSOR; |
725 | 0 | if (yych <= '0') goto yy13; |
726 | 0 | if (yych <= '9') goto yy66; |
727 | 0 | goto yy13; |
728 | 0 | yy62: |
729 | 0 | YYDEBUG(62, *YYCURSOR); |
730 | 0 | yych = *++YYCURSOR; |
731 | 0 | if (yych <= '/') goto yy13; |
732 | 0 | if (yych <= '9') goto yy66; |
733 | 0 | goto yy13; |
734 | 0 | yy63: |
735 | 0 | YYDEBUG(63, *YYCURSOR); |
736 | 0 | yych = *++YYCURSOR; |
737 | 0 | if (yych <= '/') goto yy13; |
738 | 0 | if (yych <= '1') goto yy66; |
739 | 0 | goto yy13; |
740 | 0 | yy64: |
741 | 0 | YYDEBUG(64, *YYCURSOR); |
742 | 0 | yych = *++YYCURSOR; |
743 | 0 | if (yych <= '/') goto yy13; |
744 | 0 | if (yych <= '1') goto yy67; |
745 | 0 | if (yych <= '2') goto yy68; |
746 | 0 | goto yy13; |
747 | 0 | yy65: |
748 | 0 | YYDEBUG(65, *YYCURSOR); |
749 | 0 | yych = *++YYCURSOR; |
750 | 0 | if (yych <= '/') goto yy13; |
751 | 0 | if (yych <= '2') goto yy69; |
752 | 0 | if (yych <= '3') goto yy70; |
753 | 0 | goto yy13; |
754 | 0 | yy66: |
755 | 0 | YYDEBUG(66, *YYCURSOR); |
756 | 0 | yych = *++YYCURSOR; |
757 | 0 | if (yych == 'T') goto yy71; |
758 | 0 | goto yy13; |
759 | 0 | yy67: |
760 | 0 | YYDEBUG(67, *YYCURSOR); |
761 | 0 | yych = *++YYCURSOR; |
762 | 0 | if (yych <= '/') goto yy13; |
763 | 0 | if (yych <= '9') goto yy72; |
764 | 0 | goto yy13; |
765 | 0 | yy68: |
766 | 0 | YYDEBUG(68, *YYCURSOR); |
767 | 0 | yych = *++YYCURSOR; |
768 | 0 | if (yych <= '/') goto yy13; |
769 | 0 | if (yych <= '4') goto yy72; |
770 | 0 | goto yy13; |
771 | 0 | yy69: |
772 | 0 | YYDEBUG(69, *YYCURSOR); |
773 | 0 | yych = *++YYCURSOR; |
774 | 0 | if (yych <= '/') goto yy13; |
775 | 0 | if (yych <= '9') goto yy73; |
776 | 0 | goto yy13; |
777 | 0 | yy70: |
778 | 0 | YYDEBUG(70, *YYCURSOR); |
779 | 0 | yych = *++YYCURSOR; |
780 | 0 | if (yych <= '/') goto yy13; |
781 | 0 | if (yych <= '1') goto yy73; |
782 | 0 | goto yy13; |
783 | 0 | yy71: |
784 | 0 | YYDEBUG(71, *YYCURSOR); |
785 | 0 | yych = *++YYCURSOR; |
786 | 0 | if (yych <= '/') goto yy13; |
787 | 0 | if (yych <= '1') goto yy74; |
788 | 0 | if (yych <= '2') goto yy75; |
789 | 0 | goto yy13; |
790 | 0 | yy72: |
791 | 0 | YYDEBUG(72, *YYCURSOR); |
792 | 0 | yych = *++YYCURSOR; |
793 | 0 | if (yych <= '/') goto yy13; |
794 | 0 | if (yych <= '5') goto yy76; |
795 | 0 | goto yy13; |
796 | 0 | yy73: |
797 | 0 | YYDEBUG(73, *YYCURSOR); |
798 | 0 | yych = *++YYCURSOR; |
799 | 0 | if (yych == 'T') goto yy77; |
800 | 0 | goto yy13; |
801 | 0 | yy74: |
802 | 0 | YYDEBUG(74, *YYCURSOR); |
803 | 0 | yych = *++YYCURSOR; |
804 | 0 | if (yych <= '/') goto yy13; |
805 | 0 | if (yych <= '9') goto yy78; |
806 | 0 | goto yy13; |
807 | 0 | yy75: |
808 | 0 | YYDEBUG(75, *YYCURSOR); |
809 | 0 | yych = *++YYCURSOR; |
810 | 0 | if (yych <= '/') goto yy13; |
811 | 0 | if (yych <= '4') goto yy78; |
812 | 0 | goto yy13; |
813 | 0 | yy76: |
814 | 0 | YYDEBUG(76, *YYCURSOR); |
815 | 0 | yych = *++YYCURSOR; |
816 | 0 | if (yych <= '/') goto yy13; |
817 | 0 | if (yych <= '9') goto yy79; |
818 | 0 | goto yy13; |
819 | 0 | yy77: |
820 | 0 | YYDEBUG(77, *YYCURSOR); |
821 | 0 | yych = *++YYCURSOR; |
822 | 0 | if (yych <= '/') goto yy13; |
823 | 0 | if (yych <= '1') goto yy80; |
824 | 0 | if (yych <= '2') goto yy81; |
825 | 0 | goto yy13; |
826 | 0 | yy78: |
827 | 0 | YYDEBUG(78, *YYCURSOR); |
828 | 0 | yych = *++YYCURSOR; |
829 | 0 | if (yych == ':') goto yy82; |
830 | 0 | goto yy13; |
831 | 0 | yy79: |
832 | 0 | YYDEBUG(79, *YYCURSOR); |
833 | 0 | yych = *++YYCURSOR; |
834 | 0 | if (yych <= '/') goto yy13; |
835 | 0 | if (yych <= '5') goto yy83; |
836 | 0 | goto yy13; |
837 | 0 | yy80: |
838 | 0 | YYDEBUG(80, *YYCURSOR); |
839 | 0 | yych = *++YYCURSOR; |
840 | 0 | if (yych <= '/') goto yy13; |
841 | 0 | if (yych <= '9') goto yy84; |
842 | 0 | goto yy13; |
843 | 0 | yy81: |
844 | 0 | YYDEBUG(81, *YYCURSOR); |
845 | 0 | yych = *++YYCURSOR; |
846 | 0 | if (yych <= '/') goto yy13; |
847 | 0 | if (yych <= '4') goto yy84; |
848 | 0 | goto yy13; |
849 | 0 | yy82: |
850 | 0 | YYDEBUG(82, *YYCURSOR); |
851 | 0 | yych = *++YYCURSOR; |
852 | 0 | if (yych <= '/') goto yy13; |
853 | 0 | if (yych <= '5') goto yy85; |
854 | 0 | goto yy13; |
855 | 0 | yy83: |
856 | 0 | YYDEBUG(83, *YYCURSOR); |
857 | 0 | yych = *++YYCURSOR; |
858 | 0 | if (yych <= '/') goto yy13; |
859 | 0 | if (yych <= '9') goto yy86; |
860 | 0 | goto yy13; |
861 | 0 | yy84: |
862 | 0 | YYDEBUG(84, *YYCURSOR); |
863 | 0 | yych = *++YYCURSOR; |
864 | 0 | if (yych == ':') goto yy87; |
865 | 0 | goto yy13; |
866 | 0 | yy85: |
867 | 0 | YYDEBUG(85, *YYCURSOR); |
868 | 0 | yych = *++YYCURSOR; |
869 | 0 | if (yych <= '/') goto yy13; |
870 | 0 | if (yych <= '9') goto yy88; |
871 | 0 | goto yy13; |
872 | 0 | yy86: |
873 | 0 | YYDEBUG(86, *YYCURSOR); |
874 | 0 | yych = *++YYCURSOR; |
875 | 0 | if (yych == 'Z') goto yy89; |
876 | 0 | goto yy13; |
877 | 0 | yy87: |
878 | 0 | YYDEBUG(87, *YYCURSOR); |
879 | 0 | yych = *++YYCURSOR; |
880 | 0 | if (yych <= '/') goto yy13; |
881 | 0 | if (yych <= '5') goto yy91; |
882 | 0 | goto yy13; |
883 | 0 | yy88: |
884 | 0 | YYDEBUG(88, *YYCURSOR); |
885 | 0 | yych = *++YYCURSOR; |
886 | 0 | if (yych == ':') goto yy79; |
887 | 0 | goto yy13; |
888 | 0 | yy89: |
889 | 0 | YYDEBUG(89, *YYCURSOR); |
890 | 0 | ++YYCURSOR; |
891 | 0 | YYDEBUG(90, *YYCURSOR); |
892 | 0 | #line 215 "ext/date/lib/parse_iso_intervals.re" |
893 | 0 | { |
894 | 0 | timelib_time *current; |
895 | |
|
896 | 0 | if (s->have_date || s->have_period) { |
897 | 0 | current = s->end; |
898 | 0 | s->have_end_date = 1; |
899 | 0 | } else { |
900 | 0 | current = s->begin; |
901 | 0 | s->have_begin_date = 1; |
902 | 0 | } |
903 | 0 | DEBUG_OUTPUT("datetimebasic | datetimeextended"); |
904 | 0 | TIMELIB_INIT; |
905 | 0 | current->y = timelib_get_nr(&ptr, 4); |
906 | 0 | current->m = timelib_get_nr(&ptr, 2); |
907 | 0 | current->d = timelib_get_nr(&ptr, 2); |
908 | 0 | current->h = timelib_get_nr(&ptr, 2); |
909 | 0 | current->i = timelib_get_nr(&ptr, 2); |
910 | 0 | current->s = timelib_get_nr(&ptr, 2); |
911 | 0 | s->have_date = 1; |
912 | 0 | TIMELIB_DEINIT; |
913 | 0 | return TIMELIB_ISO_DATE; |
914 | 0 | } |
915 | 0 | #line 916 "ext/date/lib/parse_iso_intervals.c" |
916 | 0 | yy91: |
917 | 0 | YYDEBUG(91, *YYCURSOR); |
918 | 0 | yych = *++YYCURSOR; |
919 | 0 | if (yych <= '/') goto yy13; |
920 | 0 | if (yych >= ':') goto yy13; |
921 | 0 | YYDEBUG(92, *YYCURSOR); |
922 | 0 | yych = *++YYCURSOR; |
923 | 0 | if (yych != ':') goto yy13; |
924 | 0 | YYDEBUG(93, *YYCURSOR); |
925 | 0 | yych = *++YYCURSOR; |
926 | 0 | if (yych <= '/') goto yy13; |
927 | 0 | if (yych >= '6') goto yy13; |
928 | 0 | YYDEBUG(94, *YYCURSOR); |
929 | 0 | yych = *++YYCURSOR; |
930 | 0 | if (yych <= '/') goto yy13; |
931 | 0 | if (yych >= ':') goto yy13; |
932 | 0 | YYDEBUG(95, *YYCURSOR); |
933 | 0 | ++YYCURSOR; |
934 | 0 | YYDEBUG(96, *YYCURSOR); |
935 | 0 | #line 281 "ext/date/lib/parse_iso_intervals.re" |
936 | 0 | { |
937 | 0 | DEBUG_OUTPUT("combinedrep"); |
938 | 0 | TIMELIB_INIT; |
939 | 0 | s->period->y = timelib_get_unsigned_nr(&ptr, 4); |
940 | 0 | ptr++; |
941 | 0 | s->period->m = timelib_get_unsigned_nr(&ptr, 2); |
942 | 0 | ptr++; |
943 | 0 | s->period->d = timelib_get_unsigned_nr(&ptr, 2); |
944 | 0 | ptr++; |
945 | 0 | s->period->h = timelib_get_unsigned_nr(&ptr, 2); |
946 | 0 | ptr++; |
947 | 0 | s->period->i = timelib_get_unsigned_nr(&ptr, 2); |
948 | 0 | ptr++; |
949 | 0 | s->period->s = timelib_get_unsigned_nr(&ptr, 2); |
950 | 0 | s->have_period = 1; |
951 | 0 | TIMELIB_DEINIT; |
952 | 0 | return TIMELIB_PERIOD; |
953 | 0 | } |
954 | 0 | #line 955 "ext/date/lib/parse_iso_intervals.c" |
955 | 0 | } |
956 | 0 | #line 316 "ext/date/lib/parse_iso_intervals.re" |
957 | |
|
958 | 0 | } |
959 | | #ifdef PHP_WIN32 |
960 | | #pragma optimize( "", on ) |
961 | | #endif |
962 | | |
963 | 0 | #define YYMAXFILL 20 |
964 | | |
965 | | |
966 | | void timelib_strtointerval(const char *s, size_t len, |
967 | | timelib_time **begin, timelib_time **end, |
968 | | timelib_rel_time **period, int *recurrences, |
969 | | timelib_error_container **errors) |
970 | 0 | { |
971 | 0 | Scanner in; |
972 | 0 | int t; |
973 | 0 | const char *e = s + len - 1; |
974 | |
|
975 | 0 | memset(&in, 0, sizeof(in)); |
976 | 0 | in.errors = timelib_malloc(sizeof(timelib_error_container)); |
977 | 0 | in.errors->warning_count = 0; |
978 | 0 | in.errors->warning_messages = NULL; |
979 | 0 | in.errors->error_count = 0; |
980 | 0 | in.errors->error_messages = NULL; |
981 | |
|
982 | 0 | if (len > 0) { |
983 | 0 | while (isspace((unsigned char)*s) && s < e) { |
984 | 0 | s++; |
985 | 0 | } |
986 | 0 | while (isspace((unsigned char)*e) && e > s) { |
987 | 0 | e--; |
988 | 0 | } |
989 | 0 | } |
990 | 0 | if (e - s < 0) { |
991 | 0 | add_error(&in, "Empty string"); |
992 | 0 | if (errors) { |
993 | 0 | *errors = in.errors; |
994 | 0 | } else { |
995 | 0 | timelib_error_container_dtor(in.errors); |
996 | 0 | } |
997 | 0 | return; |
998 | 0 | } |
999 | 0 | e++; |
1000 | | |
1001 | | /* init cursor */ |
1002 | 0 | in.str = timelib_malloc((e - s) + YYMAXFILL); |
1003 | 0 | memset(in.str, 0, (e - s) + YYMAXFILL); |
1004 | 0 | memcpy(in.str, s, (e - s)); |
1005 | 0 | in.lim = in.str + (e - s) + YYMAXFILL; |
1006 | 0 | in.cur = in.str; |
1007 | | |
1008 | | /* init value containers */ |
1009 | 0 | in.begin = timelib_time_ctor(); |
1010 | 0 | in.begin->y = TIMELIB_UNSET; |
1011 | 0 | in.begin->d = TIMELIB_UNSET; |
1012 | 0 | in.begin->m = TIMELIB_UNSET; |
1013 | 0 | in.begin->h = TIMELIB_UNSET; |
1014 | 0 | in.begin->i = TIMELIB_UNSET; |
1015 | 0 | in.begin->s = TIMELIB_UNSET; |
1016 | 0 | in.begin->us = 0; |
1017 | 0 | in.begin->z = 0; |
1018 | 0 | in.begin->dst = 0; |
1019 | 0 | in.begin->is_localtime = 0; |
1020 | 0 | in.begin->zone_type = TIMELIB_ZONETYPE_OFFSET; |
1021 | |
|
1022 | 0 | in.end = timelib_time_ctor(); |
1023 | 0 | in.end->y = TIMELIB_UNSET; |
1024 | 0 | in.end->d = TIMELIB_UNSET; |
1025 | 0 | in.end->m = TIMELIB_UNSET; |
1026 | 0 | in.end->h = TIMELIB_UNSET; |
1027 | 0 | in.end->i = TIMELIB_UNSET; |
1028 | 0 | in.end->s = TIMELIB_UNSET; |
1029 | 0 | in.end->us = 0; |
1030 | 0 | in.end->z = 0; |
1031 | 0 | in.end->dst = 0; |
1032 | 0 | in.end->is_localtime = 0; |
1033 | 0 | in.end->zone_type = TIMELIB_ZONETYPE_OFFSET; |
1034 | |
|
1035 | 0 | in.period = timelib_rel_time_ctor(); |
1036 | 0 | in.period->y = 0; |
1037 | 0 | in.period->d = 0; |
1038 | 0 | in.period->m = 0; |
1039 | 0 | in.period->h = 0; |
1040 | 0 | in.period->i = 0; |
1041 | 0 | in.period->s = 0; |
1042 | 0 | in.period->weekday = 0; |
1043 | 0 | in.period->weekday_behavior = 0; |
1044 | 0 | in.period->first_last_day_of = 0; |
1045 | 0 | in.period->days = TIMELIB_UNSET; |
1046 | |
|
1047 | 0 | in.recurrences = 1; |
1048 | |
|
1049 | 0 | do { |
1050 | 0 | t = scan(&in); |
1051 | | #ifdef DEBUG_PARSER |
1052 | | printf("%d\n", t); |
1053 | | #endif |
1054 | 0 | } while(t != EOI); |
1055 | |
|
1056 | 0 | timelib_free(in.str); |
1057 | 0 | if (errors) { |
1058 | 0 | *errors = in.errors; |
1059 | 0 | } else { |
1060 | 0 | timelib_error_container_dtor(in.errors); |
1061 | 0 | } |
1062 | 0 | if (in.have_begin_date) { |
1063 | 0 | *begin = in.begin; |
1064 | 0 | } else { |
1065 | 0 | timelib_time_dtor(in.begin); |
1066 | 0 | } |
1067 | 0 | if (in.have_end_date) { |
1068 | 0 | *end = in.end; |
1069 | 0 | } else { |
1070 | 0 | timelib_time_dtor(in.end); |
1071 | 0 | } |
1072 | 0 | if (in.have_period) { |
1073 | 0 | *period = in.period; |
1074 | 0 | } else { |
1075 | 0 | timelib_rel_time_dtor(in.period); |
1076 | 0 | } |
1077 | 0 | if (in.have_recurrences) { |
1078 | 0 | *recurrences = in.recurrences; |
1079 | 0 | } |
1080 | 0 | } |
1081 | | |
1082 | | |
1083 | | /* |
1084 | | * vim: syntax=c |
1085 | | */ |