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