parse_iso_intervals.c 23 KB

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