1 /*
2 +----------------------------------------------------------------------+
3 | Copyright (c) The PHP Group |
4 +----------------------------------------------------------------------+
5 | This source file is subject to version 3.01 of the PHP license, |
6 | that is bundled with this package in the file LICENSE, and is |
7 | available through the world-wide-web at the following url: |
8 | http://www.php.net/license/3_01.txt |
9 | If you did not receive a copy of the PHP license and are unable to |
10 | obtain it through the world-wide-web, please send a note to |
11 | license@php.net so we can mail you a copy immediately. |
12 +----------------------------------------------------------------------+
13 | Author: Dmitry Stogov <dmitry@zend.com> |
14 +----------------------------------------------------------------------+
15 */
16
17 #ifdef HAVE_CONFIG_H
18 # include "config.h"
19 #endif
20
21 #include "php.h"
22 #include "php_ffi.h"
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27
28 #define yy_buf FFI_G(buf)
29 #define yy_end FFI_G(end)
30 #define yy_pos FFI_G(pos)
31 #define yy_text FFI_G(text)
32 #define yy_line FFI_G(line)
33
34 /* forward declarations */
35 static void yy_error(const char *msg);
36 static void yy_error_sym(const char *msg, int sym);
37
38 #define YYPOS cpos
39 #define YYEND cend
40
41 #define YY_EOF 0
42 #define YY___EXTENSION__ 1
43 #define YY___ASM__ 2
44 #define YY__LPAREN 3
45 #define YY__RPAREN 4
46 #define YY__COMMA 5
47 #define YY__SEMICOLON 6
48 #define YY_TYPEDEF 7
49 #define YY_EXTERN 8
50 #define YY_STATIC 9
51 #define YY_AUTO 10
52 #define YY_REGISTER 11
53 #define YY_INLINE 12
54 #define YY___INLINE 13
55 #define YY___INLINE__ 14
56 #define YY__NORETURN 15
57 #define YY__ALIGNAS 16
58 #define YY_CONST 17
59 #define YY___CONST 18
60 #define YY___CONST__ 19
61 #define YY_RESTRICT 20
62 #define YY___RESTRICT 21
63 #define YY___RESTRICT__ 22
64 #define YY_VOLATILE 23
65 #define YY___VOLATILE 24
66 #define YY___VOLATILE__ 25
67 #define YY__ATOMIC 26
68 #define YY_VOID 27
69 #define YY_CHAR 28
70 #define YY_SHORT 29
71 #define YY_INT 30
72 #define YY_LONG 31
73 #define YY_FLOAT 32
74 #define YY_DOUBLE 33
75 #define YY_SIGNED 34
76 #define YY_UNSIGNED 35
77 #define YY__BOOL 36
78 #define YY__COMPLEX 37
79 #define YY_COMPLEX 38
80 #define YY___COMPLEX 39
81 #define YY___COMPLEX__ 40
82 #define YY_STRUCT 41
83 #define YY_UNION 42
84 #define YY__LBRACE 43
85 #define YY__RBRACE 44
86 #define YY__COLON 45
87 #define YY_ENUM 46
88 #define YY__EQUAL 47
89 #define YY__STAR 48
90 #define YY__LBRACK 49
91 #define YY__RBRACK 50
92 #define YY__POINT_POINT_POINT 51
93 #define YY___ATTRIBUTE 52
94 #define YY___ATTRIBUTE__ 53
95 #define YY___DECLSPEC 54
96 #define YY___CDECL 55
97 #define YY___STDCALL 56
98 #define YY___FASTCALL 57
99 #define YY___THISCALL 58
100 #define YY___VECTORCALL 59
101 #define YY__POINT 60
102 #define YY__QUERY 61
103 #define YY__BAR_BAR 62
104 #define YY__AND_AND 63
105 #define YY__BAR 64
106 #define YY__UPARROW 65
107 #define YY__AND 66
108 #define YY__EQUAL_EQUAL 67
109 #define YY__BANG_EQUAL 68
110 #define YY__LESS 69
111 #define YY__GREATER 70
112 #define YY__LESS_EQUAL 71
113 #define YY__GREATER_EQUAL 72
114 #define YY__LESS_LESS 73
115 #define YY__GREATER_GREATER 74
116 #define YY__PLUS 75
117 #define YY__MINUS 76
118 #define YY__SLASH 77
119 #define YY__PERCENT 78
120 #define YY__MINUS_GREATER 79
121 #define YY__PLUS_PLUS 80
122 #define YY__MINUS_MINUS 81
123 #define YY__TILDE 82
124 #define YY__BANG 83
125 #define YY_SIZEOF 84
126 #define YY__ALIGNOF 85
127 #define YY___ALIGNOF 86
128 #define YY___ALIGNOF__ 87
129 #define YY___RESTICT 88
130 #define YY_ID 89
131 #define YY_OCTNUMBER 90
132 #define YY_DECNUMBER 91
133 #define YY_HEXNUMBER 92
134 #define YY_FLOATNUMBER 93
135 #define YY_STRING 94
136 #define YY_CHARACTER 95
137 #define YY_EOL 96
138 #define YY_WS 97
139 #define YY_ONE_LINE_COMMENT 98
140 #define YY_COMMENT 99
141
142 static const char * sym_name[] = {
143 "<EOF>",
144 "__extension__",
145 "__asm__",
146 "(",
147 ")",
148 ",",
149 ";",
150 "typedef",
151 "extern",
152 "static",
153 "auto",
154 "register",
155 "inline",
156 "__inline",
157 "__inline__",
158 "_Noreturn",
159 "_Alignas",
160 "const",
161 "__const",
162 "__const__",
163 "restrict",
164 "__restrict",
165 "__restrict__",
166 "volatile",
167 "__volatile",
168 "__volatile__",
169 "_Atomic",
170 "void",
171 "char",
172 "short",
173 "int",
174 "long",
175 "float",
176 "double",
177 "signed",
178 "unsigned",
179 "_Bool",
180 "_Complex",
181 "complex",
182 "__complex",
183 "__complex__",
184 "struct",
185 "union",
186 "{",
187 "}",
188 ":",
189 "enum",
190 "=",
191 "*",
192 "[",
193 "]",
194 "...",
195 "__attribute",
196 "__attribute__",
197 "__declspec",
198 "__cdecl",
199 "__stdcall",
200 "__fastcall",
201 "__thiscall",
202 "__vectorcall",
203 ".",
204 "?",
205 "||",
206 "&&",
207 "|",
208 "^",
209 "&",
210 "==",
211 "!=",
212 "<",
213 ">",
214 "<=",
215 ">=",
216 "<<",
217 ">>",
218 "+",
219 "-",
220 "/",
221 "%",
222 "->",
223 "++",
224 "--",
225 "~",
226 "!",
227 "sizeof",
228 "_Alignof",
229 "__alignof",
230 "__alignof__",
231 "__restict",
232 "<ID>",
233 "<OCTNUMBER>",
234 "<DECNUMBER>",
235 "<HEXNUMBER>",
236 "<FLOATNUMBER>",
237 "<STRING>",
238 "<CHARACTER>",
239 "<EOL>",
240 "<WS>",
241 "<ONE_LINE_COMMENT>",
242 "<COMMENT>",
243 NULL
244 };
245
246 #define YY_IN_SET(sym, set, bitset) \
247 (bitset[sym>>3] & (1 << (sym & 0x7)))
248
249 static int skip_EOL(int sym);
250 static int skip_WS(int sym);
251 static int skip_ONE_LINE_COMMENT(int sym);
252 static int skip_COMMENT(int sym);
253 static int get_sym(void);
254 static int check_nested_declarator_start(int sym);
255 static int check_type_name_start(int sym);
256 static int check_ID(int sym);
257 static int parse_declarations(int sym);
258 static int parse_declaration_specifiers(int sym, zend_ffi_dcl *dcl);
259 static int parse_specifier_qualifier_list(int sym, zend_ffi_dcl *dcl);
260 static int parse_type_qualifier_list(int sym, zend_ffi_dcl *dcl);
261 static int parse_type_qualifier(int sym, zend_ffi_dcl *dcl);
262 static int parse_type_specifier(int sym, zend_ffi_dcl *dcl);
263 static int parse_struct_or_union_specifier(int sym, zend_ffi_dcl *dcl);
264 static int parse_struct_contents(int sym, zend_ffi_dcl *dcl);
265 static int parse_struct_declaration(int sym, zend_ffi_dcl *struct_dcl);
266 static int parse_struct_declarator(int sym, zend_ffi_dcl *struct_dcl, zend_ffi_dcl *field_dcl);
267 static int parse_enum_specifier(int sym, zend_ffi_dcl *dcl);
268 static int parse_enumerator_list(int sym, zend_ffi_dcl *enum_dcl);
269 static int parse_enumerator(int sym, zend_ffi_dcl *enum_dcl, int64_t *min, int64_t *max, int64_t *last);
270 static int parse_declarator(int sym, zend_ffi_dcl *dcl, const char **name, size_t *name_len);
271 static int parse_abstract_declarator(int sym, zend_ffi_dcl *dcl);
272 static int parse_parameter_declarator(int sym, zend_ffi_dcl *dcl, const char **name, size_t *name_len);
273 static int parse_pointer(int sym, zend_ffi_dcl *dcl);
274 static int parse_array_or_function_declarators(int sym, zend_ffi_dcl *dcl, zend_ffi_dcl *nested_dcl);
275 static int parse_parameter_declaration(int sym, HashTable **args);
276 static int parse_type_name(int sym, zend_ffi_dcl *dcl);
277 static int parse_attributes(int sym, zend_ffi_dcl *dcl);
278 static int parse_attrib(int sym, zend_ffi_dcl *dcl);
279 static int parse_initializer(int sym);
280 static int parse_designation(int sym);
281 static int parse_expr_list(int sym);
282 static int parse_expression(int sym, zend_ffi_val *val);
283 static int parse_assignment_expression(int sym, zend_ffi_val *val);
284 static int parse_constant_expression(int sym, zend_ffi_val *val);
285 static int parse_conditional_expression(int sym, zend_ffi_val *val);
286 static int parse_logical_or_expression(int sym, zend_ffi_val *val);
287 static int parse_logical_and_expression(int sym, zend_ffi_val *val);
288 static int parse_inclusive_or_expression(int sym, zend_ffi_val *val);
289 static int parse_exclusive_or_expression(int sym, zend_ffi_val *val);
290 static int parse_and_expression(int sym, zend_ffi_val *val);
291 static int parse_equality_expression(int sym, zend_ffi_val *val);
292 static int parse_relational_expression(int sym, zend_ffi_val *val);
293 static int parse_shift_expression(int sym, zend_ffi_val *val);
294 static int parse_additive_expression(int sym, zend_ffi_val *val);
295 static int parse_multiplicative_expression(int sym, zend_ffi_val *val);
296 static int parse_cast_expression(int sym, zend_ffi_val *val);
297 static int parse_unary_expression(int sym, zend_ffi_val *val);
298 static int parse_ID(int sym, const char **name, size_t *name_len);
299 static int parse_OCTNUMBER(int sym, zend_ffi_val *val);
300 static int parse_DECNUMBER(int sym, zend_ffi_val *val);
301 static int parse_HEXNUMBER(int sym, zend_ffi_val *val);
302 static int parse_FLOATNUMBER(int sym, zend_ffi_val *val);
303 static int parse_STRING(int sym, zend_ffi_val *val);
304 static int parse_CHARACTER(int sym, zend_ffi_val *val);
305 static int synpred_1(int sym);
306 static int synpred_2(int sym);
307 static int synpred_3(int sym);
308 static int synpred_4(int sym);
309 static int synpred_5(int sym);
310 static int synpred_6(int sym);
311
get_skip_sym(void)312 static int get_skip_sym(void) {
313 int ch;
314 int ret;
315 int accept = -1;
316 const unsigned char *accept_pos;
317 const unsigned char *cpos = yy_pos;
318 const unsigned char *cend = yy_end;
319
320 _yy_state_start:
321 yy_text = YYPOS;
322 ch = *YYPOS;
323 switch (ch) {
324 case '_':
325 ch = *++YYPOS;
326 switch (ch) {
327 case '_':
328 ch = *++YYPOS;
329 switch (ch) {
330 case 'e':
331 ch = *++YYPOS;
332 if (ch != 'x') goto _yy_tunnel_9;
333 ch = *++YYPOS;
334 if (ch != 't') goto _yy_tunnel_9;
335 ch = *++YYPOS;
336 if (ch != 'e') goto _yy_tunnel_9;
337 ch = *++YYPOS;
338 if (ch != 'n') goto _yy_tunnel_9;
339 ch = *++YYPOS;
340 if (ch != 's') goto _yy_tunnel_9;
341 ch = *++YYPOS;
342 if (ch != 'i') goto _yy_tunnel_9;
343 ch = *++YYPOS;
344 if (ch != 'o') goto _yy_tunnel_9;
345 ch = *++YYPOS;
346 if (ch != 'n') goto _yy_tunnel_9;
347 ch = *++YYPOS;
348 if (ch != '_') goto _yy_tunnel_9;
349 ch = *++YYPOS;
350 if (ch != '_') goto _yy_tunnel_9;
351 ret = YY___EXTENSION__;
352 goto _yy_state_390;
353 case 'i':
354 ch = *++YYPOS;
355 if (ch != 'n') goto _yy_tunnel_9;
356 ch = *++YYPOS;
357 if (ch != 'l') goto _yy_tunnel_9;
358 ch = *++YYPOS;
359 if (ch != 'i') goto _yy_tunnel_9;
360 ch = *++YYPOS;
361 if (ch != 'n') goto _yy_tunnel_9;
362 ch = *++YYPOS;
363 if (ch != 'e') goto _yy_tunnel_9;
364 ch = *++YYPOS;
365 if (ch != '_') {ret = YY___INLINE; goto _yy_tunnel_390;}
366 ch = *++YYPOS;
367 if (ch != '_') goto _yy_tunnel_9;
368 ret = YY___INLINE__;
369 goto _yy_state_390;
370 case 'a':
371 ch = *++YYPOS;
372 if (ch == 'l') {
373 ch = *++YYPOS;
374 if (ch != 'i') goto _yy_tunnel_9;
375 ch = *++YYPOS;
376 if (ch != 'g') goto _yy_tunnel_9;
377 ch = *++YYPOS;
378 if (ch != 'n') goto _yy_tunnel_9;
379 ch = *++YYPOS;
380 if (ch != 'o') goto _yy_tunnel_9;
381 ch = *++YYPOS;
382 if (ch != 'f') goto _yy_tunnel_9;
383 ch = *++YYPOS;
384 if (ch != '_') {ret = YY___ALIGNOF; goto _yy_tunnel_390;}
385 ch = *++YYPOS;
386 if (ch != '_') goto _yy_tunnel_9;
387 ret = YY___ALIGNOF__;
388 goto _yy_state_390;
389 } else if (ch == 's') {
390 ch = *++YYPOS;
391 if (ch != 'm') goto _yy_tunnel_9;
392 ch = *++YYPOS;
393 if (ch != '_') goto _yy_tunnel_9;
394 ch = *++YYPOS;
395 if (ch != '_') goto _yy_tunnel_9;
396 ret = YY___ASM__;
397 goto _yy_state_390;
398 } else if (ch == 't') {
399 ch = *++YYPOS;
400 if (ch != 't') goto _yy_tunnel_9;
401 ch = *++YYPOS;
402 if (ch != 'r') goto _yy_tunnel_9;
403 ch = *++YYPOS;
404 if (ch != 'i') goto _yy_tunnel_9;
405 ch = *++YYPOS;
406 if (ch != 'b') goto _yy_tunnel_9;
407 ch = *++YYPOS;
408 if (ch != 'u') goto _yy_tunnel_9;
409 ch = *++YYPOS;
410 if (ch != 't') goto _yy_tunnel_9;
411 ch = *++YYPOS;
412 if (ch != 'e') goto _yy_tunnel_9;
413 ch = *++YYPOS;
414 if (ch != '_') {ret = YY___ATTRIBUTE; goto _yy_tunnel_390;}
415 ch = *++YYPOS;
416 if (ch != '_') goto _yy_tunnel_9;
417 ret = YY___ATTRIBUTE__;
418 goto _yy_state_390;
419 } else {
420 goto _yy_tunnel_9;
421 }
422 case 'c':
423 ch = *++YYPOS;
424 if (ch == 'd') {
425 ch = *++YYPOS;
426 if (ch != 'e') goto _yy_tunnel_9;
427 ch = *++YYPOS;
428 if (ch != 'c') goto _yy_tunnel_9;
429 ch = *++YYPOS;
430 if (ch != 'l') goto _yy_tunnel_9;
431 ret = YY___CDECL;
432 goto _yy_state_390;
433 } else if (ch == 'o') {
434 ch = *++YYPOS;
435 if (ch == 'm') {
436 ch = *++YYPOS;
437 if (ch != 'p') goto _yy_tunnel_9;
438 ch = *++YYPOS;
439 if (ch != 'l') goto _yy_tunnel_9;
440 ch = *++YYPOS;
441 if (ch != 'e') goto _yy_tunnel_9;
442 ch = *++YYPOS;
443 if (ch != 'x') goto _yy_tunnel_9;
444 ch = *++YYPOS;
445 if (ch != '_') {ret = YY___COMPLEX; goto _yy_tunnel_390;}
446 ch = *++YYPOS;
447 if (ch != '_') goto _yy_tunnel_9;
448 ret = YY___COMPLEX__;
449 goto _yy_state_390;
450 } else if (ch == 'n') {
451 ch = *++YYPOS;
452 if (ch != 's') goto _yy_tunnel_9;
453 ch = *++YYPOS;
454 if (ch != 't') goto _yy_tunnel_9;
455 ch = *++YYPOS;
456 if (ch != '_') {ret = YY___CONST; goto _yy_tunnel_390;}
457 ch = *++YYPOS;
458 if (ch != '_') goto _yy_tunnel_9;
459 ret = YY___CONST__;
460 goto _yy_state_390;
461 } else {
462 goto _yy_tunnel_9;
463 }
464 } else {
465 goto _yy_tunnel_9;
466 }
467 case 'd':
468 ch = *++YYPOS;
469 if (ch != 'e') goto _yy_tunnel_9;
470 ch = *++YYPOS;
471 if (ch != 'c') goto _yy_tunnel_9;
472 ch = *++YYPOS;
473 if (ch != 'l') goto _yy_tunnel_9;
474 ch = *++YYPOS;
475 if (ch != 's') goto _yy_tunnel_9;
476 ch = *++YYPOS;
477 if (ch != 'p') goto _yy_tunnel_9;
478 ch = *++YYPOS;
479 if (ch != 'e') goto _yy_tunnel_9;
480 ch = *++YYPOS;
481 if (ch != 'c') goto _yy_tunnel_9;
482 ret = YY___DECLSPEC;
483 goto _yy_state_390;
484 case 'f':
485 ch = *++YYPOS;
486 if (ch != 'a') goto _yy_tunnel_9;
487 ch = *++YYPOS;
488 if (ch != 's') goto _yy_tunnel_9;
489 ch = *++YYPOS;
490 if (ch != 't') goto _yy_tunnel_9;
491 ch = *++YYPOS;
492 if (ch != 'c') goto _yy_tunnel_9;
493 ch = *++YYPOS;
494 if (ch != 'a') goto _yy_tunnel_9;
495 ch = *++YYPOS;
496 if (ch != 'l') goto _yy_tunnel_9;
497 ch = *++YYPOS;
498 if (ch != 'l') goto _yy_tunnel_9;
499 ret = YY___FASTCALL;
500 goto _yy_state_390;
501 case 'r':
502 ch = *++YYPOS;
503 if (ch != 'e') goto _yy_tunnel_9;
504 ch = *++YYPOS;
505 if (ch != 's') goto _yy_tunnel_9;
506 ch = *++YYPOS;
507 if (ch != 't') goto _yy_tunnel_9;
508 ch = *++YYPOS;
509 if (ch == 'i') {
510 ch = *++YYPOS;
511 if (ch != 'c') goto _yy_tunnel_9;
512 ch = *++YYPOS;
513 if (ch != 't') goto _yy_tunnel_9;
514 ret = YY___RESTICT;
515 goto _yy_state_390;
516 } else if (ch == 'r') {
517 ch = *++YYPOS;
518 if (ch != 'i') goto _yy_tunnel_9;
519 ch = *++YYPOS;
520 if (ch != 'c') goto _yy_tunnel_9;
521 ch = *++YYPOS;
522 if (ch != 't') goto _yy_tunnel_9;
523 ch = *++YYPOS;
524 if (ch != '_') {ret = YY___RESTRICT; goto _yy_tunnel_390;}
525 ch = *++YYPOS;
526 if (ch != '_') goto _yy_tunnel_9;
527 ret = YY___RESTRICT__;
528 goto _yy_state_390;
529 } else {
530 goto _yy_tunnel_9;
531 }
532 case 's':
533 ch = *++YYPOS;
534 if (ch != 't') goto _yy_tunnel_9;
535 ch = *++YYPOS;
536 if (ch != 'd') goto _yy_tunnel_9;
537 ch = *++YYPOS;
538 if (ch != 'c') goto _yy_tunnel_9;
539 ch = *++YYPOS;
540 if (ch != 'a') goto _yy_tunnel_9;
541 ch = *++YYPOS;
542 if (ch != 'l') goto _yy_tunnel_9;
543 ch = *++YYPOS;
544 if (ch != 'l') goto _yy_tunnel_9;
545 ret = YY___STDCALL;
546 goto _yy_state_390;
547 case 't':
548 ch = *++YYPOS;
549 if (ch != 'h') goto _yy_tunnel_9;
550 ch = *++YYPOS;
551 if (ch != 'i') goto _yy_tunnel_9;
552 ch = *++YYPOS;
553 if (ch != 's') goto _yy_tunnel_9;
554 ch = *++YYPOS;
555 if (ch != 'c') goto _yy_tunnel_9;
556 ch = *++YYPOS;
557 if (ch != 'a') goto _yy_tunnel_9;
558 ch = *++YYPOS;
559 if (ch != 'l') goto _yy_tunnel_9;
560 ch = *++YYPOS;
561 if (ch != 'l') goto _yy_tunnel_9;
562 ret = YY___THISCALL;
563 goto _yy_state_390;
564 case 'v':
565 ch = *++YYPOS;
566 if (ch == 'e') {
567 ch = *++YYPOS;
568 if (ch != 'c') goto _yy_tunnel_9;
569 ch = *++YYPOS;
570 if (ch != 't') goto _yy_tunnel_9;
571 ch = *++YYPOS;
572 if (ch != 'o') goto _yy_tunnel_9;
573 ch = *++YYPOS;
574 if (ch != 'r') goto _yy_tunnel_9;
575 ch = *++YYPOS;
576 if (ch != 'c') goto _yy_tunnel_9;
577 ch = *++YYPOS;
578 if (ch != 'a') goto _yy_tunnel_9;
579 ch = *++YYPOS;
580 if (ch != 'l') goto _yy_tunnel_9;
581 ch = *++YYPOS;
582 if (ch != 'l') goto _yy_tunnel_9;
583 ret = YY___VECTORCALL;
584 goto _yy_state_390;
585 } else if (ch == 'o') {
586 ch = *++YYPOS;
587 if (ch != 'l') goto _yy_tunnel_9;
588 ch = *++YYPOS;
589 if (ch != 'a') goto _yy_tunnel_9;
590 ch = *++YYPOS;
591 if (ch != 't') goto _yy_tunnel_9;
592 ch = *++YYPOS;
593 if (ch != 'i') goto _yy_tunnel_9;
594 ch = *++YYPOS;
595 if (ch != 'l') goto _yy_tunnel_9;
596 ch = *++YYPOS;
597 if (ch != 'e') goto _yy_tunnel_9;
598 ch = *++YYPOS;
599 if (ch != '_') {ret = YY___VOLATILE; goto _yy_tunnel_390;}
600 ch = *++YYPOS;
601 if (ch != '_') goto _yy_tunnel_9;
602 ret = YY___VOLATILE__;
603 goto _yy_state_390;
604 } else {
605 goto _yy_tunnel_9;
606 }
607 default:
608 goto _yy_tunnel_9;
609 }
610 case 'N':
611 ch = *++YYPOS;
612 if (ch != 'o') goto _yy_tunnel_9;
613 ch = *++YYPOS;
614 if (ch != 'r') goto _yy_tunnel_9;
615 ch = *++YYPOS;
616 if (ch != 'e') goto _yy_tunnel_9;
617 ch = *++YYPOS;
618 if (ch != 't') goto _yy_tunnel_9;
619 ch = *++YYPOS;
620 if (ch != 'u') goto _yy_tunnel_9;
621 ch = *++YYPOS;
622 if (ch != 'r') goto _yy_tunnel_9;
623 ch = *++YYPOS;
624 if (ch != 'n') goto _yy_tunnel_9;
625 ret = YY__NORETURN;
626 goto _yy_state_390;
627 case 'A':
628 ch = *++YYPOS;
629 if (ch == 'l') {
630 ch = *++YYPOS;
631 if (ch != 'i') goto _yy_tunnel_9;
632 ch = *++YYPOS;
633 if (ch != 'g') goto _yy_tunnel_9;
634 ch = *++YYPOS;
635 if (ch != 'n') goto _yy_tunnel_9;
636 ch = *++YYPOS;
637 if (ch == 'a') {
638 ch = *++YYPOS;
639 if (ch != 's') goto _yy_tunnel_9;
640 ret = YY__ALIGNAS;
641 goto _yy_state_390;
642 } else if (ch == 'o') {
643 ch = *++YYPOS;
644 if (ch != 'f') goto _yy_tunnel_9;
645 ret = YY__ALIGNOF;
646 goto _yy_state_390;
647 } else {
648 goto _yy_tunnel_9;
649 }
650 } else if (ch == 't') {
651 ch = *++YYPOS;
652 if (ch != 'o') goto _yy_tunnel_9;
653 ch = *++YYPOS;
654 if (ch != 'm') goto _yy_tunnel_9;
655 ch = *++YYPOS;
656 if (ch != 'i') goto _yy_tunnel_9;
657 ch = *++YYPOS;
658 if (ch != 'c') goto _yy_tunnel_9;
659 ret = YY__ATOMIC;
660 goto _yy_state_390;
661 } else {
662 goto _yy_tunnel_9;
663 }
664 case 'B':
665 ch = *++YYPOS;
666 if (ch != 'o') goto _yy_tunnel_9;
667 ch = *++YYPOS;
668 if (ch != 'o') goto _yy_tunnel_9;
669 ch = *++YYPOS;
670 if (ch != 'l') goto _yy_tunnel_9;
671 ret = YY__BOOL;
672 goto _yy_state_390;
673 case 'C':
674 ch = *++YYPOS;
675 if (ch != 'o') goto _yy_tunnel_9;
676 ch = *++YYPOS;
677 if (ch != 'm') goto _yy_tunnel_9;
678 ch = *++YYPOS;
679 if (ch != 'p') goto _yy_tunnel_9;
680 ch = *++YYPOS;
681 if (ch != 'l') goto _yy_tunnel_9;
682 ch = *++YYPOS;
683 if (ch != 'e') goto _yy_tunnel_9;
684 ch = *++YYPOS;
685 if (ch != 'x') goto _yy_tunnel_9;
686 ret = YY__COMPLEX;
687 goto _yy_state_390;
688 default:
689 goto _yy_tunnel_9;
690 }
691 case 't':
692 ch = *++YYPOS;
693 if (ch != 'y') goto _yy_tunnel_9;
694 ch = *++YYPOS;
695 if (ch != 'p') goto _yy_tunnel_9;
696 ch = *++YYPOS;
697 if (ch != 'e') goto _yy_tunnel_9;
698 ch = *++YYPOS;
699 if (ch != 'd') goto _yy_tunnel_9;
700 ch = *++YYPOS;
701 if (ch != 'e') goto _yy_tunnel_9;
702 ch = *++YYPOS;
703 if (ch != 'f') goto _yy_tunnel_9;
704 ret = YY_TYPEDEF;
705 goto _yy_state_390;
706 case 'e':
707 ch = *++YYPOS;
708 if (ch == 'x') {
709 ch = *++YYPOS;
710 if (ch != 't') goto _yy_tunnel_9;
711 ch = *++YYPOS;
712 if (ch != 'e') goto _yy_tunnel_9;
713 ch = *++YYPOS;
714 if (ch != 'r') goto _yy_tunnel_9;
715 ch = *++YYPOS;
716 if (ch != 'n') goto _yy_tunnel_9;
717 ret = YY_EXTERN;
718 goto _yy_state_390;
719 } else if (ch == 'n') {
720 ch = *++YYPOS;
721 if (ch != 'u') goto _yy_tunnel_9;
722 ch = *++YYPOS;
723 if (ch != 'm') goto _yy_tunnel_9;
724 ret = YY_ENUM;
725 goto _yy_state_390;
726 } else {
727 goto _yy_tunnel_9;
728 }
729 case 's':
730 ch = *++YYPOS;
731 if (ch == 't') {
732 ch = *++YYPOS;
733 if (ch == 'a') {
734 ch = *++YYPOS;
735 if (ch != 't') goto _yy_tunnel_9;
736 ch = *++YYPOS;
737 if (ch != 'i') goto _yy_tunnel_9;
738 ch = *++YYPOS;
739 if (ch != 'c') goto _yy_tunnel_9;
740 ret = YY_STATIC;
741 goto _yy_state_390;
742 } else if (ch == 'r') {
743 ch = *++YYPOS;
744 if (ch != 'u') goto _yy_tunnel_9;
745 ch = *++YYPOS;
746 if (ch != 'c') goto _yy_tunnel_9;
747 ch = *++YYPOS;
748 if (ch != 't') goto _yy_tunnel_9;
749 ret = YY_STRUCT;
750 goto _yy_state_390;
751 } else {
752 goto _yy_tunnel_9;
753 }
754 } else if (ch == 'h') {
755 ch = *++YYPOS;
756 if (ch != 'o') goto _yy_tunnel_9;
757 ch = *++YYPOS;
758 if (ch != 'r') goto _yy_tunnel_9;
759 ch = *++YYPOS;
760 if (ch != 't') goto _yy_tunnel_9;
761 ret = YY_SHORT;
762 goto _yy_state_390;
763 } else if (ch == 'i') {
764 ch = *++YYPOS;
765 if (ch == 'g') {
766 ch = *++YYPOS;
767 if (ch != 'n') goto _yy_tunnel_9;
768 ch = *++YYPOS;
769 if (ch != 'e') goto _yy_tunnel_9;
770 ch = *++YYPOS;
771 if (ch != 'd') goto _yy_tunnel_9;
772 ret = YY_SIGNED;
773 goto _yy_state_390;
774 } else if (ch == 'z') {
775 ch = *++YYPOS;
776 if (ch != 'e') goto _yy_tunnel_9;
777 ch = *++YYPOS;
778 if (ch != 'o') goto _yy_tunnel_9;
779 ch = *++YYPOS;
780 if (ch != 'f') goto _yy_tunnel_9;
781 ret = YY_SIZEOF;
782 goto _yy_state_390;
783 } else {
784 goto _yy_tunnel_9;
785 }
786 } else {
787 goto _yy_tunnel_9;
788 }
789 case 'a':
790 ch = *++YYPOS;
791 if (ch != 'u') goto _yy_tunnel_9;
792 ch = *++YYPOS;
793 if (ch != 't') goto _yy_tunnel_9;
794 ch = *++YYPOS;
795 if (ch != 'o') goto _yy_tunnel_9;
796 ret = YY_AUTO;
797 goto _yy_state_390;
798 case 'r':
799 ch = *++YYPOS;
800 if (ch != 'e') goto _yy_tunnel_9;
801 ch = *++YYPOS;
802 if (ch == 'g') {
803 ch = *++YYPOS;
804 if (ch != 'i') goto _yy_tunnel_9;
805 ch = *++YYPOS;
806 if (ch != 's') goto _yy_tunnel_9;
807 ch = *++YYPOS;
808 if (ch != 't') goto _yy_tunnel_9;
809 ch = *++YYPOS;
810 if (ch != 'e') goto _yy_tunnel_9;
811 ch = *++YYPOS;
812 if (ch != 'r') goto _yy_tunnel_9;
813 ret = YY_REGISTER;
814 goto _yy_state_390;
815 } else if (ch == 's') {
816 ch = *++YYPOS;
817 if (ch != 't') goto _yy_tunnel_9;
818 ch = *++YYPOS;
819 if (ch != 'r') goto _yy_tunnel_9;
820 ch = *++YYPOS;
821 if (ch != 'i') goto _yy_tunnel_9;
822 ch = *++YYPOS;
823 if (ch != 'c') goto _yy_tunnel_9;
824 ch = *++YYPOS;
825 if (ch != 't') goto _yy_tunnel_9;
826 ret = YY_RESTRICT;
827 goto _yy_state_390;
828 } else {
829 goto _yy_tunnel_9;
830 }
831 case 'i':
832 ch = *++YYPOS;
833 if (ch != 'n') goto _yy_tunnel_9;
834 ch = *++YYPOS;
835 if (ch == 'l') {
836 ch = *++YYPOS;
837 if (ch != 'i') goto _yy_tunnel_9;
838 ch = *++YYPOS;
839 if (ch != 'n') goto _yy_tunnel_9;
840 ch = *++YYPOS;
841 if (ch != 'e') goto _yy_tunnel_9;
842 ret = YY_INLINE;
843 goto _yy_state_390;
844 } else if (ch == 't') {
845 ret = YY_INT;
846 goto _yy_state_390;
847 } else {
848 goto _yy_tunnel_9;
849 }
850 case '(':
851 YYPOS++;
852 ret = YY__LPAREN;
853 goto _yy_fin;
854 case 'A':
855 case 'B':
856 case 'C':
857 case 'D':
858 case 'E':
859 case 'F':
860 case 'G':
861 case 'H':
862 case 'I':
863 case 'J':
864 case 'K':
865 case 'M':
866 case 'N':
867 case 'O':
868 case 'P':
869 case 'Q':
870 case 'R':
871 case 'S':
872 case 'T':
873 case 'V':
874 case 'W':
875 case 'X':
876 case 'Y':
877 case 'Z':
878 case 'b':
879 case 'g':
880 case 'h':
881 case 'j':
882 case 'k':
883 case 'm':
884 case 'n':
885 case 'o':
886 case 'p':
887 case 'q':
888 case 'w':
889 case 'x':
890 case 'y':
891 case 'z':
892 goto _yy_state_9;
893 case 'L':
894 case 'U':
895 ch = *++YYPOS;
896 if (ch == '"') {
897 goto _yy_state_27;
898 } else if (ch == '\'') {
899 goto _yy_state_28;
900 } else {
901 goto _yy_tunnel_9;
902 }
903 case 'c':
904 ch = *++YYPOS;
905 if (ch == 'h') {
906 ch = *++YYPOS;
907 if (ch != 'a') goto _yy_tunnel_9;
908 ch = *++YYPOS;
909 if (ch != 'r') goto _yy_tunnel_9;
910 ret = YY_CHAR;
911 goto _yy_state_390;
912 } else if (ch == 'o') {
913 ch = *++YYPOS;
914 if (ch == 'm') {
915 ch = *++YYPOS;
916 if (ch != 'p') goto _yy_tunnel_9;
917 ch = *++YYPOS;
918 if (ch != 'l') goto _yy_tunnel_9;
919 ch = *++YYPOS;
920 if (ch != 'e') goto _yy_tunnel_9;
921 ch = *++YYPOS;
922 if (ch != 'x') goto _yy_tunnel_9;
923 ret = YY_COMPLEX;
924 goto _yy_state_390;
925 } else if (ch == 'n') {
926 ch = *++YYPOS;
927 if (ch != 's') goto _yy_tunnel_9;
928 ch = *++YYPOS;
929 if (ch != 't') goto _yy_tunnel_9;
930 ret = YY_CONST;
931 goto _yy_state_390;
932 } else {
933 goto _yy_tunnel_9;
934 }
935 } else {
936 goto _yy_tunnel_9;
937 }
938 case 'd':
939 ch = *++YYPOS;
940 if (ch != 'o') goto _yy_tunnel_9;
941 ch = *++YYPOS;
942 if (ch != 'u') goto _yy_tunnel_9;
943 ch = *++YYPOS;
944 if (ch != 'b') goto _yy_tunnel_9;
945 ch = *++YYPOS;
946 if (ch != 'l') goto _yy_tunnel_9;
947 ch = *++YYPOS;
948 if (ch != 'e') goto _yy_tunnel_9;
949 ret = YY_DOUBLE;
950 goto _yy_state_390;
951 case 'f':
952 ch = *++YYPOS;
953 if (ch != 'l') goto _yy_tunnel_9;
954 ch = *++YYPOS;
955 if (ch != 'o') goto _yy_tunnel_9;
956 ch = *++YYPOS;
957 if (ch != 'a') goto _yy_tunnel_9;
958 ch = *++YYPOS;
959 if (ch != 't') goto _yy_tunnel_9;
960 ret = YY_FLOAT;
961 goto _yy_state_390;
962 case 'l':
963 ch = *++YYPOS;
964 if (ch != 'o') goto _yy_tunnel_9;
965 ch = *++YYPOS;
966 if (ch != 'n') goto _yy_tunnel_9;
967 ch = *++YYPOS;
968 if (ch != 'g') goto _yy_tunnel_9;
969 ret = YY_LONG;
970 goto _yy_state_390;
971 case 'u':
972 ch = *++YYPOS;
973 if (ch == 'n') {
974 ch = *++YYPOS;
975 if (ch == 'i') {
976 ch = *++YYPOS;
977 if (ch != 'o') goto _yy_tunnel_9;
978 ch = *++YYPOS;
979 if (ch != 'n') goto _yy_tunnel_9;
980 ret = YY_UNION;
981 goto _yy_state_390;
982 } else if (ch == 's') {
983 ch = *++YYPOS;
984 if (ch != 'i') goto _yy_tunnel_9;
985 ch = *++YYPOS;
986 if (ch != 'g') goto _yy_tunnel_9;
987 ch = *++YYPOS;
988 if (ch != 'n') goto _yy_tunnel_9;
989 ch = *++YYPOS;
990 if (ch != 'e') goto _yy_tunnel_9;
991 ch = *++YYPOS;
992 if (ch != 'd') goto _yy_tunnel_9;
993 ret = YY_UNSIGNED;
994 goto _yy_state_390;
995 } else {
996 goto _yy_tunnel_9;
997 }
998 } else if (ch == '8') {
999 ch = *++YYPOS;
1000 if (ch != '"') goto _yy_tunnel_9;
1001 goto _yy_state_27;
1002 } else if (ch == '"') {
1003 goto _yy_state_27;
1004 } else if (ch == '\'') {
1005 goto _yy_state_28;
1006 } else {
1007 goto _yy_tunnel_9;
1008 }
1009 case 'v':
1010 ch = *++YYPOS;
1011 if (ch != 'o') goto _yy_tunnel_9;
1012 ch = *++YYPOS;
1013 if (ch == 'i') {
1014 ch = *++YYPOS;
1015 if (ch != 'd') goto _yy_tunnel_9;
1016 ret = YY_VOID;
1017 goto _yy_state_390;
1018 } else if (ch == 'l') {
1019 ch = *++YYPOS;
1020 if (ch != 'a') goto _yy_tunnel_9;
1021 ch = *++YYPOS;
1022 if (ch != 't') goto _yy_tunnel_9;
1023 ch = *++YYPOS;
1024 if (ch != 'i') goto _yy_tunnel_9;
1025 ch = *++YYPOS;
1026 if (ch != 'l') goto _yy_tunnel_9;
1027 ch = *++YYPOS;
1028 if (ch != 'e') goto _yy_tunnel_9;
1029 ret = YY_VOLATILE;
1030 goto _yy_state_390;
1031 } else {
1032 goto _yy_tunnel_9;
1033 }
1034 case ')':
1035 YYPOS++;
1036 ret = YY__RPAREN;
1037 goto _yy_fin;
1038 case '[':
1039 YYPOS++;
1040 ret = YY__LBRACK;
1041 goto _yy_fin;
1042 case ',':
1043 YYPOS++;
1044 ret = YY__COMMA;
1045 goto _yy_fin;
1046 case ']':
1047 YYPOS++;
1048 ret = YY__RBRACK;
1049 goto _yy_fin;
1050 case '.':
1051 ch = *++YYPOS;
1052 accept = YY__POINT;
1053 accept_pos = yy_pos;
1054 if ((ch >= '0' && ch <= '9')) {
1055 goto _yy_state_73;
1056 } else if (ch == '.') {
1057 ch = *++YYPOS;
1058 if (ch == '.') {
1059 YYPOS++;
1060 ret = YY__POINT_POINT_POINT;
1061 goto _yy_fin;
1062 } else {
1063 goto _yy_state_error;
1064 }
1065 } else {
1066 ret = YY__POINT;
1067 goto _yy_fin;
1068 }
1069 case '-':
1070 ch = *++YYPOS;
1071 if (ch == '>') {
1072 YYPOS++;
1073 ret = YY__MINUS_GREATER;
1074 goto _yy_fin;
1075 } else if (ch == '-') {
1076 YYPOS++;
1077 ret = YY__MINUS_MINUS;
1078 goto _yy_fin;
1079 } else {
1080 ret = YY__MINUS;
1081 goto _yy_fin;
1082 }
1083 case '+':
1084 ch = *++YYPOS;
1085 if (ch == '+') {
1086 YYPOS++;
1087 ret = YY__PLUS_PLUS;
1088 goto _yy_fin;
1089 } else {
1090 ret = YY__PLUS;
1091 goto _yy_fin;
1092 }
1093 case '0':
1094 ch = *++YYPOS;
1095 if (ch != 'X' && ch != 'x') goto _yy_tunnel_78;
1096 ch = *++YYPOS;
1097 if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) {
1098 goto _yy_state_156;
1099 } else {
1100 goto _yy_state_error;
1101 }
1102 case '1':
1103 case '2':
1104 case '3':
1105 case '4':
1106 case '5':
1107 case '6':
1108 case '7':
1109 case '8':
1110 case '9':
1111 goto _yy_state_26;
1112 case '"':
1113 goto _yy_state_27;
1114 case '\'':
1115 goto _yy_state_28;
1116 case '&':
1117 ch = *++YYPOS;
1118 if (ch == '&') {
1119 YYPOS++;
1120 ret = YY__AND_AND;
1121 goto _yy_fin;
1122 } else {
1123 ret = YY__AND;
1124 goto _yy_fin;
1125 }
1126 case '*':
1127 YYPOS++;
1128 ret = YY__STAR;
1129 goto _yy_fin;
1130 case '~':
1131 YYPOS++;
1132 ret = YY__TILDE;
1133 goto _yy_fin;
1134 case '!':
1135 ch = *++YYPOS;
1136 if (ch == '=') {
1137 YYPOS++;
1138 ret = YY__BANG_EQUAL;
1139 goto _yy_fin;
1140 } else {
1141 ret = YY__BANG;
1142 goto _yy_fin;
1143 }
1144 case '/':
1145 ch = *++YYPOS;
1146 accept = YY__SLASH;
1147 accept_pos = yy_pos;
1148 if (ch == '*') {
1149 goto _yy_state_99;
1150 } else if (ch == '/') {
1151 goto _yy_state_48;
1152 } else {
1153 ret = YY__SLASH;
1154 goto _yy_fin;
1155 }
1156 case '%':
1157 YYPOS++;
1158 ret = YY__PERCENT;
1159 goto _yy_fin;
1160 case '<':
1161 ch = *++YYPOS;
1162 if (ch == '<') {
1163 YYPOS++;
1164 ret = YY__LESS_LESS;
1165 goto _yy_fin;
1166 } else if (ch == '=') {
1167 YYPOS++;
1168 ret = YY__LESS_EQUAL;
1169 goto _yy_fin;
1170 } else {
1171 ret = YY__LESS;
1172 goto _yy_fin;
1173 }
1174 case '>':
1175 ch = *++YYPOS;
1176 if (ch == '>') {
1177 YYPOS++;
1178 ret = YY__GREATER_GREATER;
1179 goto _yy_fin;
1180 } else if (ch == '=') {
1181 YYPOS++;
1182 ret = YY__GREATER_EQUAL;
1183 goto _yy_fin;
1184 } else {
1185 ret = YY__GREATER;
1186 goto _yy_fin;
1187 }
1188 case '=':
1189 ch = *++YYPOS;
1190 if (ch == '=') {
1191 YYPOS++;
1192 ret = YY__EQUAL_EQUAL;
1193 goto _yy_fin;
1194 } else {
1195 ret = YY__EQUAL;
1196 goto _yy_fin;
1197 }
1198 case '^':
1199 YYPOS++;
1200 ret = YY__UPARROW;
1201 goto _yy_fin;
1202 case '|':
1203 ch = *++YYPOS;
1204 if (ch == '|') {
1205 YYPOS++;
1206 ret = YY__BAR_BAR;
1207 goto _yy_fin;
1208 } else {
1209 ret = YY__BAR;
1210 goto _yy_fin;
1211 }
1212 case '?':
1213 YYPOS++;
1214 ret = YY__QUERY;
1215 goto _yy_fin;
1216 case ':':
1217 YYPOS++;
1218 ret = YY__COLON;
1219 goto _yy_fin;
1220 case '{':
1221 YYPOS++;
1222 ret = YY__LBRACE;
1223 goto _yy_fin;
1224 case ';':
1225 YYPOS++;
1226 ret = YY__SEMICOLON;
1227 goto _yy_fin;
1228 case '}':
1229 YYPOS++;
1230 ret = YY__RBRACE;
1231 goto _yy_fin;
1232 case '\r':
1233 ch = *++YYPOS;
1234 if (ch == '\n') {
1235 yy_line++;
1236 YYPOS++;
1237 ret = YY_EOL;
1238 goto _yy_fin;
1239 } else {
1240 ret = YY_EOL;
1241 goto _yy_fin;
1242 }
1243 case '\n':
1244 yy_line++;
1245 YYPOS++;
1246 ret = YY_EOL;
1247 goto _yy_fin;
1248 case ' ':
1249 case '\t':
1250 case '\f':
1251 case '\v':
1252 goto _yy_state_47;
1253 case '#':
1254 goto _yy_state_48;
1255 case '\0':
1256 if (ch == 0 && YYPOS < YYEND) goto _yy_state_error;
1257 YYPOS++;
1258 ret = YY_EOF;
1259 goto _yy_fin;
1260 default:
1261 goto _yy_state_error;
1262 }
1263 _yy_state_9:
1264 ch = *++YYPOS;
1265 _yy_tunnel_9:
1266 if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || ch == '_' || (ch >= 'a' && ch <= 'z')) {
1267 goto _yy_state_9;
1268 } else {
1269 ret = YY_ID;
1270 goto _yy_fin;
1271 }
1272 _yy_state_26:
1273 ch = *++YYPOS;
1274 accept = YY_DECNUMBER;
1275 accept_pos = yy_pos;
1276 switch (ch) {
1277 case 'U':
1278 case 'u':
1279 ch = *++YYPOS;
1280 if (ch == 'L') {
1281 ch = *++YYPOS;
1282 if (ch == 'L') {
1283 YYPOS++;
1284 ret = YY_DECNUMBER;
1285 goto _yy_fin;
1286 } else {
1287 ret = YY_DECNUMBER;
1288 goto _yy_fin;
1289 }
1290 } else if (ch == 'l') {
1291 YYPOS++;
1292 ret = YY_DECNUMBER;
1293 goto _yy_fin;
1294 } else {
1295 ret = YY_DECNUMBER;
1296 goto _yy_fin;
1297 }
1298 case 'L':
1299 ch = *++YYPOS;
1300 accept = YY_DECNUMBER;
1301 accept_pos = yy_pos;
1302 if (ch == 'L') {
1303 goto _yy_state_163;
1304 } else if (ch == 'U' || ch == 'u') {
1305 YYPOS++;
1306 ret = YY_DECNUMBER;
1307 goto _yy_fin;
1308 } else {
1309 ret = YY_DECNUMBER;
1310 goto _yy_fin;
1311 }
1312 case 'l':
1313 ch = *++YYPOS;
1314 accept = YY_DECNUMBER;
1315 accept_pos = yy_pos;
1316 if (ch == 'U' || ch == 'u') {
1317 YYPOS++;
1318 ret = YY_DECNUMBER;
1319 goto _yy_fin;
1320 } else if (ch == 'l') {
1321 goto _yy_state_163;
1322 } else {
1323 ret = YY_DECNUMBER;
1324 goto _yy_fin;
1325 }
1326 case 'E':
1327 case 'e':
1328 goto _yy_state_85;
1329 case '0':
1330 case '1':
1331 case '2':
1332 case '3':
1333 case '4':
1334 case '5':
1335 case '6':
1336 case '7':
1337 case '8':
1338 case '9':
1339 goto _yy_state_26;
1340 case '.':
1341 goto _yy_state_73;
1342 default:
1343 ret = YY_DECNUMBER;
1344 goto _yy_fin;
1345 }
1346 _yy_state_27:
1347 ch = *++YYPOS;
1348 if (ch == '\\') {
1349 ch = *++YYPOS;
1350 if (YYPOS < YYEND) {
1351 if (ch == '\n') {
1352 yy_line++;
1353 }
1354 goto _yy_state_27;
1355 } else {
1356 goto _yy_state_error;
1357 }
1358 } else if (ch == '"') {
1359 YYPOS++;
1360 ret = YY_STRING;
1361 goto _yy_fin;
1362 } else if (YYPOS < YYEND && (ch <= '!' || (ch >= '#' && ch <= '[') || ch >= ']')) {
1363 if (ch == '\n') {
1364 yy_line++;
1365 }
1366 goto _yy_state_27;
1367 } else {
1368 goto _yy_state_error;
1369 }
1370 _yy_state_28:
1371 ch = *++YYPOS;
1372 if (ch == '\\') {
1373 ch = *++YYPOS;
1374 if (YYPOS < YYEND) {
1375 if (ch == '\n') {
1376 yy_line++;
1377 }
1378 goto _yy_state_28;
1379 } else {
1380 goto _yy_state_error;
1381 }
1382 } else if (ch == '\'') {
1383 YYPOS++;
1384 ret = YY_CHARACTER;
1385 goto _yy_fin;
1386 } else if (YYPOS < YYEND && (ch <= '&' || (ch >= '(' && ch <= '[') || ch >= ']')) {
1387 if (ch == '\n') {
1388 yy_line++;
1389 }
1390 goto _yy_state_28;
1391 } else {
1392 goto _yy_state_error;
1393 }
1394 _yy_state_47:
1395 ch = *++YYPOS;
1396 if (ch == '\t' || ch == '\v' || ch == '\f' || ch == ' ') {
1397 goto _yy_state_47;
1398 } else {
1399 ret = YY_WS;
1400 goto _yy_fin;
1401 }
1402 _yy_state_48:
1403 ch = *++YYPOS;
1404 if (ch == '\r') {
1405 ch = *++YYPOS;
1406 if (ch == '\n') {
1407 yy_line++;
1408 YYPOS++;
1409 ret = YY_ONE_LINE_COMMENT;
1410 goto _yy_fin;
1411 } else {
1412 ret = YY_ONE_LINE_COMMENT;
1413 goto _yy_fin;
1414 }
1415 } else if (ch == '\n') {
1416 yy_line++;
1417 YYPOS++;
1418 ret = YY_ONE_LINE_COMMENT;
1419 goto _yy_fin;
1420 } else if (YYPOS < YYEND && (ch <= '\t' || ch == '\v' || ch == '\f' || ch >= '\016')) {
1421 goto _yy_state_48;
1422 } else {
1423 goto _yy_state_error;
1424 }
1425 _yy_state_73:
1426 ch = *++YYPOS;
1427 accept = YY_FLOATNUMBER;
1428 accept_pos = yy_pos;
1429 if ((ch >= '0' && ch <= '9')) {
1430 goto _yy_state_73;
1431 } else if (ch == 'F' || ch == 'L' || ch == 'f' || ch == 'l') {
1432 YYPOS++;
1433 ret = YY_FLOATNUMBER;
1434 goto _yy_fin;
1435 } else if (ch == 'E' || ch == 'e') {
1436 goto _yy_state_85;
1437 } else {
1438 ret = YY_FLOATNUMBER;
1439 goto _yy_fin;
1440 }
1441 _yy_state_78:
1442 ch = *++YYPOS;
1443 _yy_tunnel_78:
1444 accept = YY_OCTNUMBER;
1445 accept_pos = yy_pos;
1446 switch (ch) {
1447 case '0':
1448 case '1':
1449 case '2':
1450 case '3':
1451 case '4':
1452 case '5':
1453 case '6':
1454 case '7':
1455 goto _yy_state_78;
1456 case 'U':
1457 case 'u':
1458 ch = *++YYPOS;
1459 if (ch == 'L') {
1460 ch = *++YYPOS;
1461 if (ch == 'L') {
1462 YYPOS++;
1463 ret = YY_OCTNUMBER;
1464 goto _yy_fin;
1465 } else {
1466 ret = YY_OCTNUMBER;
1467 goto _yy_fin;
1468 }
1469 } else if (ch == 'l') {
1470 YYPOS++;
1471 ret = YY_OCTNUMBER;
1472 goto _yy_fin;
1473 } else {
1474 ret = YY_OCTNUMBER;
1475 goto _yy_fin;
1476 }
1477 case 'L':
1478 ch = *++YYPOS;
1479 accept = YY_OCTNUMBER;
1480 accept_pos = yy_pos;
1481 if (ch == 'L') {
1482 goto _yy_state_154;
1483 } else if (ch == 'U' || ch == 'u') {
1484 YYPOS++;
1485 ret = YY_OCTNUMBER;
1486 goto _yy_fin;
1487 } else {
1488 ret = YY_OCTNUMBER;
1489 goto _yy_fin;
1490 }
1491 case 'l':
1492 ch = *++YYPOS;
1493 accept = YY_OCTNUMBER;
1494 accept_pos = yy_pos;
1495 if (ch == 'l') {
1496 goto _yy_state_154;
1497 } else if (ch == 'U' || ch == 'u') {
1498 YYPOS++;
1499 ret = YY_OCTNUMBER;
1500 goto _yy_fin;
1501 } else {
1502 ret = YY_OCTNUMBER;
1503 goto _yy_fin;
1504 }
1505 case '8':
1506 case '9':
1507 goto _yy_state_83;
1508 case 'E':
1509 case 'e':
1510 goto _yy_state_85;
1511 case '.':
1512 goto _yy_state_73;
1513 default:
1514 ret = YY_OCTNUMBER;
1515 goto _yy_fin;
1516 }
1517 _yy_state_83:
1518 ch = *++YYPOS;
1519 if ((ch >= '0' && ch <= '9')) {
1520 goto _yy_state_83;
1521 } else if (ch == 'E' || ch == 'e') {
1522 goto _yy_state_85;
1523 } else if (ch == '.') {
1524 goto _yy_state_73;
1525 } else {
1526 goto _yy_state_error;
1527 }
1528 _yy_state_85:
1529 ch = *++YYPOS;
1530 if (ch == '+' || ch == '-') {
1531 ch = *++YYPOS;
1532 if ((ch >= '0' && ch <= '9')) {
1533 goto _yy_state_159;
1534 } else {
1535 goto _yy_state_error;
1536 }
1537 } else if ((ch >= '0' && ch <= '9')) {
1538 goto _yy_state_159;
1539 } else {
1540 goto _yy_state_error;
1541 }
1542 _yy_state_99:
1543 ch = *++YYPOS;
1544 _yy_tunnel_99:
1545 if (ch == '*') {
1546 ch = *++YYPOS;
1547 if (ch != '/') goto _yy_tunnel_99;
1548 YYPOS++;
1549 ret = YY_COMMENT;
1550 goto _yy_fin;
1551 } else if (YYPOS < YYEND && (ch <= ')' || ch >= '+')) {
1552 if (ch == '\n') {
1553 yy_line++;
1554 }
1555 goto _yy_state_99;
1556 } else {
1557 goto _yy_state_error;
1558 }
1559 _yy_state_154:
1560 ch = *++YYPOS;
1561 if (ch == 'U' || ch == 'u') {
1562 YYPOS++;
1563 ret = YY_OCTNUMBER;
1564 goto _yy_fin;
1565 } else {
1566 goto _yy_state_error;
1567 }
1568 _yy_state_156:
1569 ch = *++YYPOS;
1570 if (ch == 'U' || ch == 'u') {
1571 ch = *++YYPOS;
1572 if (ch == 'L') {
1573 ch = *++YYPOS;
1574 if (ch == 'L') {
1575 YYPOS++;
1576 ret = YY_HEXNUMBER;
1577 goto _yy_fin;
1578 } else {
1579 ret = YY_HEXNUMBER;
1580 goto _yy_fin;
1581 }
1582 } else if (ch == 'l') {
1583 YYPOS++;
1584 ret = YY_HEXNUMBER;
1585 goto _yy_fin;
1586 } else {
1587 ret = YY_HEXNUMBER;
1588 goto _yy_fin;
1589 }
1590 } else if (ch == 'L') {
1591 ch = *++YYPOS;
1592 accept = YY_HEXNUMBER;
1593 accept_pos = yy_pos;
1594 if (ch == 'L') {
1595 goto _yy_state_265;
1596 } else if (ch == 'U' || ch == 'u') {
1597 YYPOS++;
1598 ret = YY_HEXNUMBER;
1599 goto _yy_fin;
1600 } else {
1601 ret = YY_HEXNUMBER;
1602 goto _yy_fin;
1603 }
1604 } else if (ch == 'l') {
1605 ch = *++YYPOS;
1606 accept = YY_HEXNUMBER;
1607 accept_pos = yy_pos;
1608 if (ch == 'U' || ch == 'u') {
1609 YYPOS++;
1610 ret = YY_HEXNUMBER;
1611 goto _yy_fin;
1612 } else if (ch == 'l') {
1613 goto _yy_state_265;
1614 } else {
1615 ret = YY_HEXNUMBER;
1616 goto _yy_fin;
1617 }
1618 } else if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) {
1619 goto _yy_state_156;
1620 } else {
1621 ret = YY_HEXNUMBER;
1622 goto _yy_fin;
1623 }
1624 _yy_state_159:
1625 ch = *++YYPOS;
1626 if ((ch >= '0' && ch <= '9')) {
1627 goto _yy_state_159;
1628 } else if (ch == 'F' || ch == 'L' || ch == 'f' || ch == 'l') {
1629 YYPOS++;
1630 ret = YY_FLOATNUMBER;
1631 goto _yy_fin;
1632 } else {
1633 ret = YY_FLOATNUMBER;
1634 goto _yy_fin;
1635 }
1636 _yy_state_163:
1637 ch = *++YYPOS;
1638 if (ch == 'U' || ch == 'u') {
1639 YYPOS++;
1640 ret = YY_DECNUMBER;
1641 goto _yy_fin;
1642 } else {
1643 goto _yy_state_error;
1644 }
1645 _yy_state_265:
1646 ch = *++YYPOS;
1647 if (ch == 'U' || ch == 'u') {
1648 YYPOS++;
1649 ret = YY_HEXNUMBER;
1650 goto _yy_fin;
1651 } else {
1652 goto _yy_state_error;
1653 }
1654 _yy_state_390:
1655 ch = *++YYPOS;
1656 _yy_tunnel_390:
1657 if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || ch == '_' || (ch >= 'a' && ch <= 'z')) {
1658 goto _yy_state_9;
1659 } else {
1660 goto _yy_fin;
1661 }
1662 _yy_state_error:
1663 if (accept >= 0) {
1664 yy_pos = accept_pos;
1665 return accept;
1666 }
1667 if (YYPOS >= YYEND) {
1668 yy_error("unexpected <EOF>");
1669 } else if (YYPOS == yy_text) {
1670 yy_error("unexpected character 'escape_char(ch)'");
1671 } else {
1672 yy_error("unexpected sequence 'escape_string(yy_text, 1 + YYPOS - yy_text))'");
1673 }
1674 YYPOS++;
1675 goto _yy_state_start;
1676 _yy_fin:
1677 yy_pos = YYPOS;
1678 return ret;
1679 }
1680
skip_EOL(int sym)1681 static int skip_EOL(int sym) {
1682 if (sym != YY_EOL) {
1683 yy_error_sym("<EOL> expected, got", sym);
1684 }
1685 sym = get_skip_sym();
1686 return sym;
1687 }
1688
skip_WS(int sym)1689 static int skip_WS(int sym) {
1690 if (sym != YY_WS) {
1691 yy_error_sym("<WS> expected, got", sym);
1692 }
1693 sym = get_skip_sym();
1694 return sym;
1695 }
1696
skip_ONE_LINE_COMMENT(int sym)1697 static int skip_ONE_LINE_COMMENT(int sym) {
1698 if (sym != YY_ONE_LINE_COMMENT) {
1699 yy_error_sym("<ONE_LINE_COMMENT> expected, got", sym);
1700 }
1701 sym = get_skip_sym();
1702 return sym;
1703 }
1704
skip_COMMENT(int sym)1705 static int skip_COMMENT(int sym) {
1706 if (sym != YY_COMMENT) {
1707 yy_error_sym("<COMMENT> expected, got", sym);
1708 }
1709 sym = get_skip_sym();
1710 return sym;
1711 }
1712
get_sym(void)1713 static int get_sym(void) {
1714 int sym;
1715 sym = get_skip_sym();
1716 while (sym == YY_EOL || sym == YY_WS || sym == YY_ONE_LINE_COMMENT || sym == YY_COMMENT) {
1717 if (sym == YY_EOL) {
1718 sym = skip_EOL(sym);
1719 } else if (sym == YY_WS) {
1720 sym = skip_WS(sym);
1721 } else if (sym == YY_ONE_LINE_COMMENT) {
1722 sym = skip_ONE_LINE_COMMENT(sym);
1723 } else {
1724 sym = skip_COMMENT(sym);
1725 }
1726 }
1727 return sym;
1728 }
1729
check_nested_declarator_start(int sym)1730 static int check_nested_declarator_start(int sym) {
1731 if (sym != YY__LPAREN) {
1732 return -1;
1733 }
1734 sym = get_sym();
1735 if ((sym == YY_ID) && (!zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text))) {
1736 sym = check_ID(sym);
1737 if (sym == -1) {
1738 return -1;
1739 }
1740 } else {
1741 switch (sym) {
1742 case YY___ATTRIBUTE:
1743 sym = get_sym();
1744 break;
1745 case YY___ATTRIBUTE__:
1746 sym = get_sym();
1747 break;
1748 case YY___DECLSPEC:
1749 sym = get_sym();
1750 break;
1751 case YY__STAR:
1752 sym = get_sym();
1753 break;
1754 case YY__LPAREN:
1755 sym = get_sym();
1756 break;
1757 case YY__LBRACK:
1758 sym = get_sym();
1759 break;
1760 default:
1761 return -1;
1762 }
1763 }
1764 return sym;
1765 }
1766
check_type_name_start(int sym)1767 static int check_type_name_start(int sym) {
1768 if ((sym == YY_ID) && (zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text))) {
1769 sym = check_ID(sym);
1770 if (sym == -1) {
1771 return -1;
1772 }
1773 } else {
1774 switch (sym) {
1775 case YY_VOID:
1776 sym = get_sym();
1777 break;
1778 case YY_CHAR:
1779 sym = get_sym();
1780 break;
1781 case YY_SHORT:
1782 sym = get_sym();
1783 break;
1784 case YY_INT:
1785 sym = get_sym();
1786 break;
1787 case YY_LONG:
1788 sym = get_sym();
1789 break;
1790 case YY_FLOAT:
1791 sym = get_sym();
1792 break;
1793 case YY_DOUBLE:
1794 sym = get_sym();
1795 break;
1796 case YY_SIGNED:
1797 sym = get_sym();
1798 break;
1799 case YY_UNSIGNED:
1800 sym = get_sym();
1801 break;
1802 case YY__BOOL:
1803 sym = get_sym();
1804 break;
1805 case YY__COMPLEX:
1806 sym = get_sym();
1807 break;
1808 case YY_COMPLEX:
1809 sym = get_sym();
1810 break;
1811 case YY___COMPLEX:
1812 sym = get_sym();
1813 break;
1814 case YY___COMPLEX__:
1815 sym = get_sym();
1816 break;
1817 case YY_STRUCT:
1818 sym = get_sym();
1819 break;
1820 case YY_UNION:
1821 sym = get_sym();
1822 break;
1823 case YY_ENUM:
1824 sym = get_sym();
1825 break;
1826 case YY_CONST:
1827 sym = get_sym();
1828 break;
1829 case YY___CONST:
1830 sym = get_sym();
1831 break;
1832 case YY___CONST__:
1833 sym = get_sym();
1834 break;
1835 case YY_RESTRICT:
1836 sym = get_sym();
1837 break;
1838 case YY___RESTICT:
1839 sym = get_sym();
1840 break;
1841 case YY___RESTRICT__:
1842 sym = get_sym();
1843 break;
1844 case YY_VOLATILE:
1845 sym = get_sym();
1846 break;
1847 case YY___VOLATILE:
1848 sym = get_sym();
1849 break;
1850 case YY___VOLATILE__:
1851 sym = get_sym();
1852 break;
1853 case YY__ATOMIC:
1854 sym = get_sym();
1855 break;
1856 case YY___ATTRIBUTE:
1857 sym = get_sym();
1858 break;
1859 case YY___ATTRIBUTE__:
1860 sym = get_sym();
1861 break;
1862 case YY___DECLSPEC:
1863 sym = get_sym();
1864 break;
1865 default:
1866 return -1;
1867 }
1868 }
1869 return sym;
1870 }
1871
check_ID(int sym)1872 static int check_ID(int sym) {
1873 if (sym != YY_ID) {
1874 return -1;
1875 }
1876 sym = get_sym();
1877 return sym;
1878 }
1879
synpred_1(int sym)1880 static int synpred_1(int sym) {
1881 int ret;
1882 const unsigned char *save_pos;
1883 const unsigned char *save_text;
1884 int save_line;
1885
1886 save_pos = yy_pos;
1887 save_text = yy_text;
1888 save_line = yy_line;
1889 ret = check_type_name_start(sym) != -1;
1890 yy_pos = save_pos;
1891 yy_text = save_text;
1892 yy_line = save_line;
1893 return ret;
1894 }
1895
synpred_2(int sym)1896 static int synpred_2(int sym) {
1897 int ret;
1898 const unsigned char *save_pos;
1899 const unsigned char *save_text;
1900 int save_line;
1901
1902 save_pos = yy_pos;
1903 save_text = yy_text;
1904 save_line = yy_line;
1905 ret = check_nested_declarator_start(sym) != -1;
1906 yy_pos = save_pos;
1907 yy_text = save_text;
1908 yy_line = save_line;
1909 return ret;
1910 }
1911
synpred_3(int sym)1912 static int synpred_3(int sym) {
1913 int ret;
1914 const unsigned char *save_pos;
1915 const unsigned char *save_text;
1916 int save_line;
1917
1918 save_pos = yy_pos;
1919 save_text = yy_text;
1920 save_line = yy_line;
1921 ret = check_nested_declarator_start(sym) != -1;
1922 yy_pos = save_pos;
1923 yy_text = save_text;
1924 yy_line = save_line;
1925 return ret;
1926 }
1927
_synpred_4(int sym)1928 static int _synpred_4(int sym) {
1929 if (sym != YY__LPAREN) {
1930 return -1;
1931 }
1932 sym = get_sym();
1933 sym = check_type_name_start(sym);
1934 if (sym == -1) {
1935 return -1;
1936 }
1937 return sym;
1938 }
1939
synpred_4(int sym)1940 static int synpred_4(int sym) {
1941 int ret;
1942 const unsigned char *save_pos;
1943 const unsigned char *save_text;
1944 int save_line;
1945
1946 save_pos = yy_pos;
1947 save_text = yy_text;
1948 save_line = yy_line;
1949 ret = _synpred_4(sym) != -1;
1950 yy_pos = save_pos;
1951 yy_text = save_text;
1952 yy_line = save_line;
1953 return ret;
1954 }
1955
_synpred_5(int sym)1956 static int _synpred_5(int sym) {
1957 if (sym != YY__LPAREN) {
1958 return -1;
1959 }
1960 sym = get_sym();
1961 sym = check_type_name_start(sym);
1962 if (sym == -1) {
1963 return -1;
1964 }
1965 return sym;
1966 }
1967
synpred_5(int sym)1968 static int synpred_5(int sym) {
1969 int ret;
1970 const unsigned char *save_pos;
1971 const unsigned char *save_text;
1972 int save_line;
1973
1974 save_pos = yy_pos;
1975 save_text = yy_text;
1976 save_line = yy_line;
1977 ret = _synpred_5(sym) != -1;
1978 yy_pos = save_pos;
1979 yy_text = save_text;
1980 yy_line = save_line;
1981 return ret;
1982 }
1983
_synpred_6(int sym)1984 static int _synpred_6(int sym) {
1985 if (sym != YY__LPAREN) {
1986 return -1;
1987 }
1988 sym = get_sym();
1989 sym = check_type_name_start(sym);
1990 if (sym == -1) {
1991 return -1;
1992 }
1993 return sym;
1994 }
1995
synpred_6(int sym)1996 static int synpred_6(int sym) {
1997 int ret;
1998 const unsigned char *save_pos;
1999 const unsigned char *save_text;
2000 int save_line;
2001
2002 save_pos = yy_pos;
2003 save_text = yy_text;
2004 save_line = yy_line;
2005 ret = _synpred_6(sym) != -1;
2006 yy_pos = save_pos;
2007 yy_text = save_text;
2008 yy_line = save_line;
2009 return ret;
2010 }
2011
parse_declarations(int sym)2012 static int parse_declarations(int sym) {
2013 while (YY_IN_SET(sym, (YY___EXTENSION__,YY_TYPEDEF,YY_EXTERN,YY_STATIC,YY_AUTO,YY_REGISTER,YY_INLINE,YY___INLINE,YY___INLINE__,YY__NORETURN,YY__ALIGNAS,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID), "\202\377\377\377\377\107\360\017\000\000\000\002\000")) {
2014 zend_ffi_dcl common_dcl = ZEND_FFI_ATTR_INIT;
2015 if (sym == YY___EXTENSION__) {
2016 sym = get_sym();
2017 }
2018 sym = parse_declaration_specifiers(sym, &common_dcl);
2019 if (sym == YY__STAR || sym == YY_ID || sym == YY__LPAREN) {
2020 const char *name;
2021 size_t name_len;
2022 zend_ffi_dcl dcl;
2023 dcl = common_dcl;
2024 sym = parse_declarator(sym, &dcl, &name, &name_len);
2025 if (sym == YY___ASM__) {
2026 zend_ffi_val asm_str;
2027 sym = get_sym();
2028 if (sym != YY__LPAREN) {
2029 yy_error_sym("'(' expected, got", sym);
2030 }
2031 sym = get_sym();
2032 do {
2033 sym = parse_STRING(sym, &asm_str);
2034 } while (sym == YY_STRING);
2035 if (sym != YY__RPAREN) {
2036 yy_error_sym("')' expected, got", sym);
2037 }
2038 sym = get_sym();
2039 }
2040 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2041 sym = parse_attributes(sym, &dcl);
2042 }
2043 if (sym == YY__EQUAL) {
2044 sym = parse_initializer(sym);
2045 }
2046 zend_ffi_declare(name, name_len, &dcl);
2047 while (sym == YY__COMMA) {
2048 sym = get_sym();
2049 dcl = common_dcl;
2050 sym = parse_declarator(sym, &dcl, &name, &name_len);
2051 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2052 sym = parse_attributes(sym, &dcl);
2053 }
2054 if (sym == YY__EQUAL) {
2055 sym = parse_initializer(sym);
2056 }
2057 zend_ffi_declare(name, name_len, &dcl);
2058 }
2059 }
2060 if (sym != YY__SEMICOLON) {
2061 yy_error_sym("';' expected, got", sym);
2062 }
2063 sym = get_sym();
2064 }
2065 return sym;
2066 }
2067
parse_declaration_specifiers(int sym,zend_ffi_dcl * dcl)2068 static int parse_declaration_specifiers(int sym, zend_ffi_dcl *dcl) {
2069 do {
2070 switch (sym) {
2071 case YY_TYPEDEF:
2072 if (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) yy_error_sym("unexpected", sym);
2073 sym = get_sym();
2074 dcl->flags |= ZEND_FFI_DCL_TYPEDEF;
2075 break;
2076 case YY_EXTERN:
2077 if (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) yy_error_sym("unexpected", sym);
2078 sym = get_sym();
2079 dcl->flags |= ZEND_FFI_DCL_EXTERN;
2080 break;
2081 case YY_STATIC:
2082 if (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) yy_error_sym("unexpected", sym);
2083 sym = get_sym();
2084 dcl->flags |= ZEND_FFI_DCL_STATIC;
2085 break;
2086 case YY_AUTO:
2087 if (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) yy_error_sym("unexpected", sym);
2088 sym = get_sym();
2089 dcl->flags |= ZEND_FFI_DCL_AUTO;
2090 break;
2091 case YY_REGISTER:
2092 if (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) yy_error_sym("unexpected", sym);
2093 sym = get_sym();
2094 dcl->flags |= ZEND_FFI_DCL_REGISTER;
2095 break;
2096 case YY_INLINE:
2097 case YY___INLINE:
2098 case YY___INLINE__:
2099 sym = get_sym();
2100 dcl->flags |= ZEND_FFI_DCL_INLINE;
2101 break;
2102 case YY__NORETURN:
2103 sym = get_sym();
2104 dcl->flags |= ZEND_FFI_DCL_NO_RETURN;
2105 break;
2106 case YY__ALIGNAS:
2107 sym = get_sym();
2108 if (sym != YY__LPAREN) {
2109 yy_error_sym("'(' expected, got", sym);
2110 }
2111 sym = get_sym();
2112 if ((YY_IN_SET(sym, (YY___EXTENSION__,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\002\000\376\377\377\107\360\017\000\000\000\002\000")) && synpred_1(sym)) {
2113 zend_ffi_dcl align_dcl = ZEND_FFI_ATTR_INIT;
2114 sym = parse_type_name(sym, &align_dcl);
2115 zend_ffi_align_as_type(dcl, &align_dcl);
2116 } else if (YY_IN_SET(sym, (YY__LPAREN,YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__STAR,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__), "\010\000\000\000\000\000\001\000\004\030\377\376\000")) {
2117 zend_ffi_val align_val;
2118 sym = parse_constant_expression(sym, &align_val);
2119 zend_ffi_align_as_val(dcl, &align_val);
2120 } else {
2121 yy_error_sym("unexpected", sym);
2122 }
2123 if (sym != YY__RPAREN) {
2124 yy_error_sym("')' expected, got", sym);
2125 }
2126 sym = get_sym();
2127 break;
2128 case YY___ATTRIBUTE:
2129 case YY___ATTRIBUTE__:
2130 case YY___DECLSPEC:
2131 case YY___CDECL:
2132 case YY___STDCALL:
2133 case YY___FASTCALL:
2134 case YY___THISCALL:
2135 case YY___VECTORCALL:
2136 sym = parse_attributes(sym, dcl);
2137 break;
2138 case YY_CONST:
2139 case YY___CONST:
2140 case YY___CONST__:
2141 case YY_RESTRICT:
2142 case YY___RESTRICT:
2143 case YY___RESTRICT__:
2144 case YY_VOLATILE:
2145 case YY___VOLATILE:
2146 case YY___VOLATILE__:
2147 case YY__ATOMIC:
2148 sym = parse_type_qualifier(sym, dcl);
2149 break;
2150 case YY_VOID:
2151 case YY_CHAR:
2152 case YY_SHORT:
2153 case YY_INT:
2154 case YY_LONG:
2155 case YY_FLOAT:
2156 case YY_DOUBLE:
2157 case YY_SIGNED:
2158 case YY_UNSIGNED:
2159 case YY__BOOL:
2160 case YY__COMPLEX:
2161 case YY_COMPLEX:
2162 case YY___COMPLEX:
2163 case YY___COMPLEX__:
2164 case YY_STRUCT:
2165 case YY_UNION:
2166 case YY_ENUM:
2167 case YY_ID:
2168 sym = parse_type_specifier(sym, dcl);
2169 break;
2170 default:
2171 yy_error_sym("unexpected", sym);
2172 }
2173 } while ((YY_IN_SET(sym, (YY_TYPEDEF,YY_EXTERN,YY_STATIC,YY_AUTO,YY_REGISTER,YY_INLINE,YY___INLINE,YY___INLINE__,YY__NORETURN,YY__ALIGNAS,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID), "\200\377\377\377\377\107\360\017\000\000\000\002\000")) && (sym != YY_ID || !(dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS)));
2174 return sym;
2175 }
2176
parse_specifier_qualifier_list(int sym,zend_ffi_dcl * dcl)2177 static int parse_specifier_qualifier_list(int sym, zend_ffi_dcl *dcl) {
2178 if (sym == YY___EXTENSION__) {
2179 sym = get_sym();
2180 }
2181 do {
2182 if (YY_IN_SET(sym, (YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID), "\000\000\000\370\377\107\000\000\000\000\000\002\000")) {
2183 sym = parse_type_specifier(sym, dcl);
2184 } else if (YY_IN_SET(sym, (YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC), "\000\000\376\007\000\000\000\000\000\000\000\000\000")) {
2185 sym = parse_type_qualifier(sym, dcl);
2186 } else if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2187 sym = parse_attributes(sym, dcl);
2188 } else {
2189 yy_error_sym("unexpected", sym);
2190 }
2191 } while ((YY_IN_SET(sym, (YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\377\377\107\360\017\000\000\000\002\000")) && (sym != YY_ID || zend_ffi_is_typedef_name((const char*)yy_text, yy_pos - yy_text) || (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) == 0));
2192 return sym;
2193 }
2194
parse_type_qualifier_list(int sym,zend_ffi_dcl * dcl)2195 static int parse_type_qualifier_list(int sym, zend_ffi_dcl *dcl) {
2196 do {
2197 if (YY_IN_SET(sym, (YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC), "\000\000\376\007\000\000\000\000\000\000\000\000\000")) {
2198 sym = parse_type_qualifier(sym, dcl);
2199 } else if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2200 sym = parse_attributes(sym, dcl);
2201 } else {
2202 yy_error_sym("unexpected", sym);
2203 }
2204 } while (YY_IN_SET(sym, (YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\007\000\000\360\017\000\000\000\000\000"));
2205 return sym;
2206 }
2207
parse_type_qualifier(int sym,zend_ffi_dcl * dcl)2208 static int parse_type_qualifier(int sym, zend_ffi_dcl *dcl) {
2209 if (sym == YY_CONST || sym == YY___CONST || sym == YY___CONST__) {
2210 sym = get_sym();
2211 dcl->flags |= ZEND_FFI_DCL_CONST;
2212 dcl->attr |= ZEND_FFI_ATTR_CONST;
2213 } else if (sym == YY_RESTRICT || sym == YY___RESTRICT || sym == YY___RESTRICT__) {
2214 sym = get_sym();
2215 dcl->flags |= ZEND_FFI_DCL_RESTRICT;
2216 } else if (sym == YY_VOLATILE || sym == YY___VOLATILE || sym == YY___VOLATILE__) {
2217 sym = get_sym();
2218 dcl->flags |= ZEND_FFI_DCL_VOLATILE;
2219 } else if (sym == YY__ATOMIC) {
2220 sym = get_sym();
2221 dcl->flags |= ZEND_FFI_DCL_ATOMIC;
2222 } else {
2223 yy_error_sym("unexpected", sym);
2224 }
2225 return sym;
2226 }
2227
parse_type_specifier(int sym,zend_ffi_dcl * dcl)2228 static int parse_type_specifier(int sym, zend_ffi_dcl *dcl) {
2229 const char *name;
2230 size_t name_len;
2231 switch (sym) {
2232 case YY_VOID:
2233 if (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) yy_error_sym("unexpected", sym);
2234 sym = get_sym();
2235 dcl->flags |= ZEND_FFI_DCL_VOID;
2236 break;
2237 case YY_CHAR:
2238 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_SIGNED|ZEND_FFI_DCL_UNSIGNED))) yy_error_sym("unexpected", sym);
2239 sym = get_sym();
2240 dcl->flags |= ZEND_FFI_DCL_CHAR;
2241 break;
2242 case YY_SHORT:
2243 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_SIGNED|ZEND_FFI_DCL_UNSIGNED|ZEND_FFI_DCL_INT))) yy_error_sym("unexpected", sym);
2244 sym = get_sym();
2245 dcl->flags |= ZEND_FFI_DCL_SHORT;
2246 break;
2247 case YY_INT:
2248 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_SIGNED|ZEND_FFI_DCL_UNSIGNED|ZEND_FFI_DCL_SHORT|ZEND_FFI_DCL_LONG|ZEND_FFI_DCL_LONG_LONG))) yy_error_sym("unexpected", sym);
2249 sym = get_sym();
2250 dcl->flags |= ZEND_FFI_DCL_INT;
2251 break;
2252 case YY_LONG:
2253 if (dcl->flags & ZEND_FFI_DCL_LONG) {
2254 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_LONG|ZEND_FFI_DCL_SIGNED|ZEND_FFI_DCL_UNSIGNED|ZEND_FFI_DCL_INT))) yy_error_sym("unexpected", sym);
2255 dcl->flags |= ZEND_FFI_DCL_LONG_LONG;
2256 } else {
2257 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_LONG|ZEND_FFI_DCL_SIGNED|ZEND_FFI_DCL_UNSIGNED|ZEND_FFI_DCL_INT|ZEND_FFI_DCL_DOUBLE|ZEND_FFI_DCL_COMPLEX))) yy_error_sym("unexpected", sym);
2258 dcl->flags |= ZEND_FFI_DCL_LONG;
2259 }
2260 sym = get_sym();
2261 break;
2262 case YY_FLOAT:
2263 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_COMPLEX))) yy_error_sym("unexpected", sym);
2264 sym = get_sym();
2265 dcl->flags |= ZEND_FFI_DCL_FLOAT;
2266 break;
2267 case YY_DOUBLE:
2268 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_LONG|ZEND_FFI_DCL_COMPLEX))) yy_error_sym("unexpected", sym);
2269 sym = get_sym();
2270 dcl->flags |= ZEND_FFI_DCL_DOUBLE;
2271 break;
2272 case YY_SIGNED:
2273 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_CHAR|ZEND_FFI_DCL_SHORT|ZEND_FFI_DCL_LONG|ZEND_FFI_DCL_LONG_LONG|ZEND_FFI_DCL_INT))) yy_error_sym("unexpected", sym);
2274 sym = get_sym();
2275 dcl->flags |= ZEND_FFI_DCL_SIGNED;
2276 break;
2277 case YY_UNSIGNED:
2278 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_CHAR|ZEND_FFI_DCL_SHORT|ZEND_FFI_DCL_LONG|ZEND_FFI_DCL_LONG_LONG|ZEND_FFI_DCL_INT))) yy_error_sym("unexpected", sym);
2279 sym = get_sym();
2280 dcl->flags |= ZEND_FFI_DCL_UNSIGNED;
2281 break;
2282 case YY__BOOL:
2283 if (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) yy_error_sym("unexpected", sym);
2284 sym = get_sym();
2285 dcl->flags |= ZEND_FFI_DCL_BOOL;
2286 break;
2287 case YY__COMPLEX:
2288 case YY_COMPLEX:
2289 case YY___COMPLEX:
2290 case YY___COMPLEX__:
2291 if (dcl->flags & (ZEND_FFI_DCL_TYPE_SPECIFIERS-(ZEND_FFI_DCL_FLOAT|ZEND_FFI_DCL_DOUBLE|ZEND_FFI_DCL_LONG))) yy_error_sym("unexpected", sym);
2292 sym = get_sym();
2293 dcl->flags |= ZEND_FFI_DCL_COMPLEX;
2294 break;
2295 case YY_STRUCT:
2296 case YY_UNION:
2297 if (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) yy_error_sym("unexpected", sym);
2298 sym = parse_struct_or_union_specifier(sym, dcl);
2299 break;
2300 case YY_ENUM:
2301 if (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) yy_error_sym("unexpected", sym);
2302 sym = parse_enum_specifier(sym, dcl);
2303 break;
2304 case YY_ID:
2305 if (dcl->flags & ZEND_FFI_DCL_TYPE_SPECIFIERS) yy_error_sym("unexpected", sym);
2306 /*redeclaration of '%.*s' ??? */
2307 sym = parse_ID(sym, &name, &name_len);
2308 dcl->flags |= ZEND_FFI_DCL_TYPEDEF_NAME;
2309 zend_ffi_resolve_typedef(name, name_len, dcl);
2310 break;
2311 default:
2312 yy_error_sym("unexpected", sym);
2313 }
2314 return sym;
2315 }
2316
parse_struct_or_union_specifier(int sym,zend_ffi_dcl * dcl)2317 static int parse_struct_or_union_specifier(int sym, zend_ffi_dcl *dcl) {
2318 if (sym == YY_STRUCT) {
2319 sym = get_sym();
2320 dcl->flags |= ZEND_FFI_DCL_STRUCT;
2321 } else if (sym == YY_UNION) {
2322 sym = get_sym();
2323 dcl->flags |= ZEND_FFI_DCL_UNION;
2324 } else {
2325 yy_error_sym("unexpected", sym);
2326 }
2327 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2328 sym = parse_attributes(sym, dcl);
2329 }
2330 if (sym == YY_ID) {
2331 const char *name;
2332 size_t name_len;
2333 sym = parse_ID(sym, &name, &name_len);
2334 zend_ffi_declare_tag(name, name_len, dcl, 1);
2335 if (sym == YY__LBRACE) {
2336 sym = parse_struct_contents(sym, dcl);
2337 zend_ffi_declare_tag(name, name_len, dcl, 0);
2338 }
2339 } else if (sym == YY__LBRACE) {
2340 zend_ffi_make_struct_type(dcl);
2341 sym = parse_struct_contents(sym, dcl);
2342 } else {
2343 yy_error_sym("unexpected", sym);
2344 }
2345 return sym;
2346 }
2347
parse_struct_contents(int sym,zend_ffi_dcl * dcl)2348 static int parse_struct_contents(int sym, zend_ffi_dcl *dcl) {
2349 int sym2;
2350 const unsigned char *save_pos;
2351 const unsigned char *save_text;
2352 int save_line;
2353 int alt2;
2354 if (sym != YY__LBRACE) {
2355 yy_error_sym("'{' expected, got", sym);
2356 }
2357 sym = get_sym();
2358 if (YY_IN_SET(sym, (YY___EXTENSION__,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\002\000\376\377\377\107\360\017\000\000\000\002\000")) {
2359 sym = parse_struct_declaration(sym, dcl);
2360 while (1) {
2361 save_pos = yy_pos;
2362 save_text = yy_text;
2363 save_line = yy_line;
2364 alt2 = -2;
2365 sym2 = sym;
2366 if (sym2 == YY__SEMICOLON) {
2367 sym2 = get_sym();
2368 goto _yy_state_2_1;
2369 } else if (sym2 == YY__RBRACE) {
2370 alt2 = 6;
2371 goto _yy_state_2;
2372 } else {
2373 yy_error_sym("unexpected", sym2);
2374 }
2375 _yy_state_2_1:
2376 if (YY_IN_SET(sym2, (YY___EXTENSION__,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\002\000\376\377\377\107\360\017\000\000\000\002\000")) {
2377 alt2 = 3;
2378 goto _yy_state_2;
2379 } else if (sym2 == YY__RBRACE) {
2380 alt2 = 5;
2381 goto _yy_state_2;
2382 } else {
2383 yy_error_sym("unexpected", sym2);
2384 }
2385 _yy_state_2:
2386 yy_pos = save_pos;
2387 yy_text = save_text;
2388 yy_line = save_line;
2389 if (alt2 != 3) {
2390 break;
2391 }
2392 sym = get_sym();
2393 sym = parse_struct_declaration(sym, dcl);
2394 }
2395 if (alt2 == 5) {
2396 sym = get_sym();
2397 }
2398 }
2399 if (sym != YY__RBRACE) {
2400 yy_error_sym("'}' expected, got", sym);
2401 }
2402 sym = get_sym();
2403 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2404 sym = parse_attributes(sym, dcl);
2405 }
2406 zend_ffi_adjust_struct_size(dcl);
2407 return sym;
2408 }
2409
parse_struct_declaration(int sym,zend_ffi_dcl * struct_dcl)2410 static int parse_struct_declaration(int sym, zend_ffi_dcl *struct_dcl) {
2411 zend_ffi_dcl common_field_dcl = ZEND_FFI_ATTR_INIT;
2412 sym = parse_specifier_qualifier_list(sym, &common_field_dcl);
2413 if (sym == YY__SEMICOLON || sym == YY__RBRACE) {
2414 zend_ffi_add_anonymous_field(struct_dcl, &common_field_dcl);
2415 } else if (sym == YY__STAR || sym == YY_ID || sym == YY__LPAREN || sym == YY__COLON) {
2416 sym = parse_struct_declarator(sym, struct_dcl, &common_field_dcl);
2417 while (sym == YY__COMMA) {
2418 sym = get_sym();
2419 zend_ffi_dcl field_dcl = common_field_dcl;
2420 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2421 sym = parse_attributes(sym, &field_dcl);
2422 }
2423 sym = parse_struct_declarator(sym, struct_dcl, &field_dcl);
2424 }
2425 } else {
2426 yy_error_sym("unexpected", sym);
2427 }
2428 return sym;
2429 }
2430
parse_struct_declarator(int sym,zend_ffi_dcl * struct_dcl,zend_ffi_dcl * field_dcl)2431 static int parse_struct_declarator(int sym, zend_ffi_dcl *struct_dcl, zend_ffi_dcl *field_dcl) {
2432 const char *name = NULL;
2433 size_t name_len = 0;
2434 zend_ffi_val bits;
2435 if (sym == YY__STAR || sym == YY_ID || sym == YY__LPAREN) {
2436 sym = parse_declarator(sym, field_dcl, &name, &name_len);
2437 if (sym == YY__COLON) {
2438 sym = get_sym();
2439 sym = parse_constant_expression(sym, &bits);
2440 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2441 sym = parse_attributes(sym, field_dcl);
2442 }
2443 zend_ffi_add_bit_field(struct_dcl, name, name_len, field_dcl, &bits);
2444 } else if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL,YY__COMMA,YY__SEMICOLON,YY__RBRACE), "\140\000\000\000\000\020\360\017\000\000\000\000\000")) {
2445 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2446 sym = parse_attributes(sym, field_dcl);
2447 }
2448 zend_ffi_add_field(struct_dcl, name, name_len, field_dcl);
2449 } else {
2450 yy_error_sym("unexpected", sym);
2451 }
2452 } else if (sym == YY__COLON) {
2453 sym = get_sym();
2454 sym = parse_constant_expression(sym, &bits);
2455 zend_ffi_add_bit_field(struct_dcl, NULL, 0, field_dcl, &bits);
2456 } else {
2457 yy_error_sym("unexpected", sym);
2458 }
2459 return sym;
2460 }
2461
parse_enum_specifier(int sym,zend_ffi_dcl * dcl)2462 static int parse_enum_specifier(int sym, zend_ffi_dcl *dcl) {
2463 if (sym != YY_ENUM) {
2464 yy_error_sym("'enum' expected, got", sym);
2465 }
2466 sym = get_sym();
2467 dcl->flags |= ZEND_FFI_DCL_ENUM;
2468 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2469 sym = parse_attributes(sym, dcl);
2470 }
2471 if (sym == YY_ID) {
2472 const char *name;
2473 size_t name_len;
2474 sym = parse_ID(sym, &name, &name_len);
2475 if (sym == YY__LBRACE) {
2476 zend_ffi_declare_tag(name, name_len, dcl, 0);
2477 sym = get_sym();
2478 sym = parse_enumerator_list(sym, dcl);
2479 if (sym != YY__RBRACE) {
2480 yy_error_sym("'}' expected, got", sym);
2481 }
2482 sym = get_sym();
2483 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2484 sym = parse_attributes(sym, dcl);
2485 }
2486 } else if (YY_IN_SET(sym, (YY_TYPEDEF,YY_EXTERN,YY_STATIC,YY_AUTO,YY_REGISTER,YY_INLINE,YY___INLINE,YY___INLINE__,YY__NORETURN,YY__ALIGNAS,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY__STAR,YY__LPAREN,YY__SEMICOLON,YY__COLON,YY__LBRACK,YY__RBRACE,YY__COMMA,YY__RPAREN,YY_EOF), "\371\377\377\377\377\167\363\017\000\000\000\002\000")) {
2487 zend_ffi_declare_tag(name, name_len, dcl, 1);
2488 } else {
2489 yy_error_sym("unexpected", sym);
2490 }
2491 } else if (sym == YY__LBRACE) {
2492 sym = get_sym();
2493 zend_ffi_make_enum_type(dcl);
2494 sym = parse_enumerator_list(sym, dcl);
2495 if (sym != YY__RBRACE) {
2496 yy_error_sym("'}' expected, got", sym);
2497 }
2498 sym = get_sym();
2499 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2500 sym = parse_attributes(sym, dcl);
2501 }
2502 } else {
2503 yy_error_sym("unexpected", sym);
2504 }
2505 return sym;
2506 }
2507
parse_enumerator_list(int sym,zend_ffi_dcl * enum_dcl)2508 static int parse_enumerator_list(int sym, zend_ffi_dcl *enum_dcl) {
2509 int sym2;
2510 const unsigned char *save_pos;
2511 const unsigned char *save_text;
2512 int save_line;
2513 int alt250;
2514 int64_t min = 0, max = 0, last = -1;
2515 sym = parse_enumerator(sym, enum_dcl, &min, &max, &last);
2516 while (1) {
2517 save_pos = yy_pos;
2518 save_text = yy_text;
2519 save_line = yy_line;
2520 alt250 = -2;
2521 sym2 = sym;
2522 if (sym2 == YY__COMMA) {
2523 sym2 = get_sym();
2524 goto _yy_state_250_1;
2525 } else if (sym2 == YY__RBRACE) {
2526 alt250 = -1;
2527 goto _yy_state_250;
2528 } else {
2529 yy_error_sym("unexpected", sym2);
2530 }
2531 _yy_state_250_1:
2532 if (sym2 == YY_ID) {
2533 alt250 = 251;
2534 goto _yy_state_250;
2535 } else if (sym2 == YY__RBRACE) {
2536 alt250 = 253;
2537 goto _yy_state_250;
2538 } else {
2539 yy_error_sym("unexpected", sym2);
2540 }
2541 _yy_state_250:
2542 yy_pos = save_pos;
2543 yy_text = save_text;
2544 yy_line = save_line;
2545 if (alt250 != 251) {
2546 break;
2547 }
2548 sym = get_sym();
2549 sym = parse_enumerator(sym, enum_dcl, &min, &max, &last);
2550 }
2551 if (alt250 == 253) {
2552 sym = get_sym();
2553 }
2554 return sym;
2555 }
2556
parse_enumerator(int sym,zend_ffi_dcl * enum_dcl,int64_t * min,int64_t * max,int64_t * last)2557 static int parse_enumerator(int sym, zend_ffi_dcl *enum_dcl, int64_t *min, int64_t *max, int64_t *last) {
2558 const char *name;
2559 size_t name_len;
2560 zend_ffi_val val = {.kind = ZEND_FFI_VAL_EMPTY};
2561 sym = parse_ID(sym, &name, &name_len);
2562 if (sym == YY__EQUAL) {
2563 sym = get_sym();
2564 sym = parse_constant_expression(sym, &val);
2565 }
2566 zend_ffi_add_enum_val(enum_dcl, name, name_len, &val, min, max, last);
2567 return sym;
2568 }
2569
parse_declarator(int sym,zend_ffi_dcl * dcl,const char ** name,size_t * name_len)2570 static int parse_declarator(int sym, zend_ffi_dcl *dcl, const char **name, size_t *name_len) {
2571 zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};
2572 zend_bool nested = 0;
2573 if (sym == YY__STAR) {
2574 sym = parse_pointer(sym, dcl);
2575 }
2576 if (sym == YY_ID) {
2577 sym = parse_ID(sym, name, name_len);
2578 } else if (sym == YY__LPAREN) {
2579 sym = get_sym();
2580 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2581 sym = parse_attributes(sym, &nested_dcl);
2582 }
2583 sym = parse_declarator(sym, &nested_dcl, name, name_len);
2584 if (sym != YY__RPAREN) {
2585 yy_error_sym("')' expected, got", sym);
2586 }
2587 sym = get_sym();
2588 nested = 1;
2589 } else {
2590 yy_error_sym("unexpected", sym);
2591 }
2592 if (sym == YY__LBRACK || sym == YY__LPAREN) {
2593 sym = parse_array_or_function_declarators(sym, dcl, &nested_dcl);
2594 }
2595 if (nested) zend_ffi_nested_declaration(dcl, &nested_dcl);
2596 return sym;
2597 }
2598
parse_abstract_declarator(int sym,zend_ffi_dcl * dcl)2599 static int parse_abstract_declarator(int sym, zend_ffi_dcl *dcl) {
2600 zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};
2601 zend_bool nested = 0;
2602 if (sym == YY__STAR) {
2603 sym = parse_pointer(sym, dcl);
2604 }
2605 if ((sym == YY__LPAREN) && synpred_2(sym)) {
2606 sym = get_sym();
2607 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2608 sym = parse_attributes(sym, &nested_dcl);
2609 }
2610 sym = parse_abstract_declarator(sym, &nested_dcl);
2611 if (sym != YY__RPAREN) {
2612 yy_error_sym("')' expected, got", sym);
2613 }
2614 sym = get_sym();
2615 nested = 1;
2616 }
2617 if (sym == YY__LBRACK || sym == YY__LPAREN) {
2618 sym = parse_array_or_function_declarators(sym, dcl, &nested_dcl);
2619 }
2620 if (nested) zend_ffi_nested_declaration(dcl, &nested_dcl);
2621 return sym;
2622 }
2623
parse_parameter_declarator(int sym,zend_ffi_dcl * dcl,const char ** name,size_t * name_len)2624 static int parse_parameter_declarator(int sym, zend_ffi_dcl *dcl, const char **name, size_t *name_len) {
2625 zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};
2626 zend_bool nested = 0;
2627 if (sym == YY__STAR) {
2628 sym = parse_pointer(sym, dcl);
2629 }
2630 if ((sym == YY__LPAREN) && synpred_3(sym)) {
2631 sym = get_sym();
2632 if (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000")) {
2633 sym = parse_attributes(sym, &nested_dcl);
2634 }
2635 sym = parse_parameter_declarator(sym, &nested_dcl, name, name_len);
2636 if (sym != YY__RPAREN) {
2637 yy_error_sym("')' expected, got", sym);
2638 }
2639 sym = get_sym();
2640 nested = 1;
2641 } else if (sym == YY_ID) {
2642 sym = parse_ID(sym, name, name_len);
2643 } else if (sym == YY__LBRACK || sym == YY__LPAREN || sym == YY__RPAREN || sym == YY__COMMA) {
2644 } else {
2645 yy_error_sym("unexpected", sym);
2646 }
2647 if (sym == YY__LBRACK || sym == YY__LPAREN) {
2648 sym = parse_array_or_function_declarators(sym, dcl, &nested_dcl);
2649 }
2650 if (nested) zend_ffi_nested_declaration(dcl, &nested_dcl);
2651 return sym;
2652 }
2653
parse_pointer(int sym,zend_ffi_dcl * dcl)2654 static int parse_pointer(int sym, zend_ffi_dcl *dcl) {
2655 if (sym != YY__STAR) {
2656 yy_error_sym("'*' expected, got", sym);
2657 }
2658 do {
2659 sym = get_sym();
2660 zend_ffi_make_pointer_type(dcl);
2661 if (YY_IN_SET(sym, (YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\007\000\000\360\017\000\000\000\000\000")) {
2662 sym = parse_type_qualifier_list(sym, dcl);
2663 }
2664 } while (sym == YY__STAR);
2665 return sym;
2666 }
2667
parse_array_or_function_declarators(int sym,zend_ffi_dcl * dcl,zend_ffi_dcl * nested_dcl)2668 static int parse_array_or_function_declarators(int sym, zend_ffi_dcl *dcl, zend_ffi_dcl *nested_dcl) {
2669 int sym2;
2670 const unsigned char *save_pos;
2671 const unsigned char *save_text;
2672 int save_line;
2673 int alt109;
2674 int alt105;
2675 int alt119;
2676 zend_ffi_dcl dummy = ZEND_FFI_ATTR_INIT;
2677 zend_ffi_val len = {.kind = ZEND_FFI_VAL_EMPTY};
2678 HashTable *args = NULL;
2679 uint32_t attr = 0;
2680 if (sym == YY__LBRACK) {
2681 sym = get_sym();
2682 save_pos = yy_pos;
2683 save_text = yy_text;
2684 save_line = yy_line;
2685 alt105 = -2;
2686 sym2 = sym;
2687 if (sym2 == YY_STATIC) {
2688 alt105 = 106;
2689 goto _yy_state_105;
2690 } else if (YY_IN_SET(sym2, (YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\007\000\000\360\017\000\000\000\000\000")) {
2691 alt105 = 109;
2692 goto _yy_state_105;
2693 } else if (sym2 == YY__STAR) {
2694 sym2 = get_sym();
2695 goto _yy_state_105_20;
2696 } else if (YY_IN_SET(sym2, (YY__LPAREN,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__,YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER), "\010\000\000\000\000\000\000\000\004\030\377\376\000")) {
2697 alt105 = 115;
2698 goto _yy_state_105;
2699 } else if (sym2 == YY__RBRACK) {
2700 alt105 = 116;
2701 goto _yy_state_105;
2702 } else {
2703 yy_error_sym("unexpected", sym2);
2704 }
2705 _yy_state_105_20:
2706 if (sym2 == YY__RBRACK) {
2707 alt105 = 114;
2708 goto _yy_state_105;
2709 } else if (YY_IN_SET(sym2, (YY__LPAREN,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__,YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER,YY__STAR), "\010\000\000\000\000\000\001\000\004\030\377\376\000")) {
2710 alt105 = 115;
2711 goto _yy_state_105;
2712 } else {
2713 yy_error_sym("unexpected", sym2);
2714 }
2715 _yy_state_105:
2716 yy_pos = save_pos;
2717 yy_text = save_text;
2718 yy_line = save_line;
2719 if (alt105 == 106) {
2720 sym = get_sym();
2721 if (YY_IN_SET(sym, (YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\376\007\000\000\360\017\000\000\000\000\000")) {
2722 sym = parse_type_qualifier_list(sym, &dummy);
2723 }
2724 sym = parse_assignment_expression(sym, &len);
2725 } else if (alt105 == 109) {
2726 sym = parse_type_qualifier_list(sym, &dummy);
2727 save_pos = yy_pos;
2728 save_text = yy_text;
2729 save_line = yy_line;
2730 alt109 = -2;
2731 sym2 = sym;
2732 if (sym2 == YY_STATIC) {
2733 alt109 = 110;
2734 goto _yy_state_109;
2735 } else if (sym2 == YY__STAR) {
2736 sym2 = get_sym();
2737 goto _yy_state_109_2;
2738 } else if (YY_IN_SET(sym2, (YY__LPAREN,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__,YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER), "\010\000\000\000\000\000\000\000\004\030\377\376\000")) {
2739 alt109 = 113;
2740 goto _yy_state_109;
2741 } else if (sym2 == YY__RBRACK) {
2742 alt109 = 116;
2743 goto _yy_state_109;
2744 } else {
2745 yy_error_sym("unexpected", sym2);
2746 }
2747 _yy_state_109_2:
2748 if (sym2 == YY__RBRACK) {
2749 alt109 = 112;
2750 goto _yy_state_109;
2751 } else if (YY_IN_SET(sym2, (YY__LPAREN,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__,YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER,YY__STAR), "\010\000\000\000\000\000\001\000\004\030\377\376\000")) {
2752 alt109 = 113;
2753 goto _yy_state_109;
2754 } else {
2755 yy_error_sym("unexpected", sym2);
2756 }
2757 _yy_state_109:
2758 yy_pos = save_pos;
2759 yy_text = save_text;
2760 yy_line = save_line;
2761 if (alt109 == 110) {
2762 sym = get_sym();
2763 sym = parse_assignment_expression(sym, &len);
2764 } else if (alt109 == 116) {
2765 attr |= ZEND_FFI_ATTR_INCOMPLETE_ARRAY;
2766 } else if (alt109 == 112) {
2767 sym = get_sym();
2768 attr |= ZEND_FFI_ATTR_VLA;
2769 } else if (alt109 == 113) {
2770 sym = parse_assignment_expression(sym, &len);
2771 } else {
2772 yy_error_sym("unexpected", sym);
2773 }
2774 } else if (alt105 == 116 || alt105 == 114 || alt105 == 115) {
2775 if (alt105 == 116) {
2776 attr |= ZEND_FFI_ATTR_INCOMPLETE_ARRAY;
2777 } else if (alt105 == 114) {
2778 sym = get_sym();
2779 attr |= ZEND_FFI_ATTR_VLA;
2780 } else {
2781 sym = parse_assignment_expression(sym, &len);
2782 }
2783 } else {
2784 yy_error_sym("unexpected", sym);
2785 }
2786 if (sym != YY__RBRACK) {
2787 yy_error_sym("']' expected, got", sym);
2788 }
2789 sym = get_sym();
2790 if (sym == YY__LBRACK || sym == YY__LPAREN) {
2791 sym = parse_array_or_function_declarators(sym, dcl, nested_dcl);
2792 }
2793 dcl->attr |= attr;
2794 zend_ffi_make_array_type(dcl, &len);
2795 } else if (sym == YY__LPAREN) {
2796 sym = get_sym();
2797 if (YY_IN_SET(sym, (YY___EXTENSION__,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL,YY__POINT_POINT_POINT), "\002\000\376\377\377\107\370\017\000\000\000\002\000")) {
2798 if (YY_IN_SET(sym, (YY___EXTENSION__,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\002\000\376\377\377\107\360\017\000\000\000\002\000")) {
2799 sym = parse_parameter_declaration(sym, &args);
2800 while (1) {
2801 save_pos = yy_pos;
2802 save_text = yy_text;
2803 save_line = yy_line;
2804 alt119 = -2;
2805 sym2 = sym;
2806 if (sym2 == YY__COMMA) {
2807 sym2 = get_sym();
2808 goto _yy_state_119_1;
2809 } else if (sym2 == YY__RPAREN) {
2810 alt119 = 125;
2811 goto _yy_state_119;
2812 } else {
2813 yy_error_sym("unexpected", sym2);
2814 }
2815 _yy_state_119_1:
2816 if (YY_IN_SET(sym2, (YY___EXTENSION__,YY_VOID,YY_CHAR,YY_SHORT,YY_INT,YY_LONG,YY_FLOAT,YY_DOUBLE,YY_SIGNED,YY_UNSIGNED,YY__BOOL,YY__COMPLEX,YY_COMPLEX,YY___COMPLEX,YY___COMPLEX__,YY_STRUCT,YY_UNION,YY_ENUM,YY_ID,YY_CONST,YY___CONST,YY___CONST__,YY_RESTRICT,YY___RESTRICT,YY___RESTRICT__,YY_VOLATILE,YY___VOLATILE,YY___VOLATILE__,YY__ATOMIC,YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\002\000\376\377\377\107\360\017\000\000\000\002\000")) {
2817 alt119 = 120;
2818 goto _yy_state_119;
2819 } else if (sym2 == YY__POINT_POINT_POINT) {
2820 alt119 = 122;
2821 goto _yy_state_119;
2822 } else {
2823 yy_error_sym("unexpected", sym2);
2824 }
2825 _yy_state_119:
2826 yy_pos = save_pos;
2827 yy_text = save_text;
2828 yy_line = save_line;
2829 if (alt119 != 120) {
2830 break;
2831 }
2832 sym = get_sym();
2833 sym = parse_parameter_declaration(sym, &args);
2834 }
2835 if (alt119 == 122) {
2836 sym = get_sym();
2837 if (sym != YY__POINT_POINT_POINT) {
2838 yy_error_sym("'...' expected, got", sym);
2839 }
2840 sym = get_sym();
2841 attr |= ZEND_FFI_ATTR_VARIADIC;
2842 }
2843 } else {
2844 sym = get_sym();
2845 attr |= ZEND_FFI_ATTR_VARIADIC;
2846 }
2847 }
2848 if (sym != YY__RPAREN) {
2849 yy_error_sym("')' expected, got", sym);
2850 }
2851 sym = get_sym();
2852 if (sym == YY__LBRACK || sym == YY__LPAREN) {
2853 sym = parse_array_or_function_declarators(sym, dcl, nested_dcl);
2854 }
2855 dcl->attr |= attr;
2856 zend_ffi_make_func_type(dcl, args, nested_dcl);
2857 } else {
2858 yy_error_sym("unexpected", sym);
2859 }
2860 return sym;
2861 }
2862
parse_parameter_declaration(int sym,HashTable ** args)2863 static int parse_parameter_declaration(int sym, HashTable **args) {
2864 const char *name = NULL;
2865 size_t name_len = 0;
2866 zend_bool old_allow_vla = FFI_G(allow_vla);
2867 FFI_G(allow_vla) = 1;
2868 zend_ffi_dcl param_dcl = ZEND_FFI_ATTR_INIT;
2869 sym = parse_specifier_qualifier_list(sym, ¶m_dcl);
2870 sym = parse_parameter_declarator(sym, ¶m_dcl, &name, &name_len);
2871 zend_ffi_add_arg(args, name, name_len, ¶m_dcl);
2872 FFI_G(allow_vla) = old_allow_vla;
2873 return sym;
2874 }
2875
parse_type_name(int sym,zend_ffi_dcl * dcl)2876 static int parse_type_name(int sym, zend_ffi_dcl *dcl) {
2877 sym = parse_specifier_qualifier_list(sym, dcl);
2878 sym = parse_abstract_declarator(sym, dcl);
2879 return sym;
2880 }
2881
parse_attributes(int sym,zend_ffi_dcl * dcl)2882 static int parse_attributes(int sym, zend_ffi_dcl *dcl) {
2883 const char *name;
2884 size_t name_len;
2885 zend_ffi_val val;
2886 do {
2887 switch (sym) {
2888 case YY___ATTRIBUTE:
2889 case YY___ATTRIBUTE__:
2890 sym = get_sym();
2891 if (sym != YY__LPAREN) {
2892 yy_error_sym("'(' expected, got", sym);
2893 }
2894 sym = get_sym();
2895 if (sym != YY__LPAREN) {
2896 yy_error_sym("'(' expected, got", sym);
2897 }
2898 sym = get_sym();
2899 sym = parse_attrib(sym, dcl);
2900 while (sym == YY__COMMA) {
2901 sym = get_sym();
2902 sym = parse_attrib(sym, dcl);
2903 }
2904 if (sym != YY__RPAREN) {
2905 yy_error_sym("')' expected, got", sym);
2906 }
2907 sym = get_sym();
2908 if (sym != YY__RPAREN) {
2909 yy_error_sym("')' expected, got", sym);
2910 }
2911 sym = get_sym();
2912 break;
2913 case YY___DECLSPEC:
2914 sym = get_sym();
2915 if (sym != YY__LPAREN) {
2916 yy_error_sym("'(' expected, got", sym);
2917 }
2918 sym = get_sym();
2919 do {
2920 sym = parse_ID(sym, &name, &name_len);
2921 if (sym == YY__LPAREN) {
2922 sym = get_sym();
2923 sym = parse_assignment_expression(sym, &val);
2924 zend_ffi_add_msvc_attribute_value(dcl, name, name_len, &val);
2925 if (sym != YY__RPAREN) {
2926 yy_error_sym("')' expected, got", sym);
2927 }
2928 sym = get_sym();
2929 }
2930 } while (sym == YY_ID);
2931 if (sym != YY__RPAREN) {
2932 yy_error_sym("')' expected, got", sym);
2933 }
2934 sym = get_sym();
2935 break;
2936 case YY___CDECL:
2937 sym = get_sym();
2938 zend_ffi_set_abi(dcl, ZEND_FFI_ABI_CDECL);
2939 break;
2940 case YY___STDCALL:
2941 sym = get_sym();
2942 zend_ffi_set_abi(dcl, ZEND_FFI_ABI_STDCALL);
2943 break;
2944 case YY___FASTCALL:
2945 sym = get_sym();
2946 zend_ffi_set_abi(dcl, ZEND_FFI_ABI_FASTCALL);
2947 break;
2948 case YY___THISCALL:
2949 sym = get_sym();
2950 zend_ffi_set_abi(dcl, ZEND_FFI_ABI_THISCALL);
2951 break;
2952 case YY___VECTORCALL:
2953 sym = get_sym();
2954 zend_ffi_set_abi(dcl, ZEND_FFI_ABI_VECTORCALL);
2955 break;
2956 default:
2957 yy_error_sym("unexpected", sym);
2958 }
2959 } while (YY_IN_SET(sym, (YY___ATTRIBUTE,YY___ATTRIBUTE__,YY___DECLSPEC,YY___CDECL,YY___STDCALL,YY___FASTCALL,YY___THISCALL,YY___VECTORCALL), "\000\000\000\000\000\000\360\017\000\000\000\000\000"));
2960 return sym;
2961 }
2962
parse_attrib(int sym,zend_ffi_dcl * dcl)2963 static int parse_attrib(int sym, zend_ffi_dcl *dcl) {
2964 const char *name;
2965 size_t name_len;
2966 int n;
2967 zend_ffi_val val;
2968 zend_bool orig_attribute_parsing;
2969 if (sym == YY_ID || sym == YY_CONST || sym == YY___CONST || sym == YY___CONST__) {
2970 if (sym == YY_ID) {
2971 sym = parse_ID(sym, &name, &name_len);
2972 if (sym == YY__COMMA || sym == YY__RPAREN) {
2973 zend_ffi_add_attribute(dcl, name, name_len);
2974 } else if (sym == YY__LPAREN) {
2975 sym = get_sym();
2976 orig_attribute_parsing = FFI_G(attribute_parsing);
2977 FFI_G(attribute_parsing) = 1;
2978 sym = parse_assignment_expression(sym, &val);
2979 zend_ffi_add_attribute_value(dcl, name, name_len, 0, &val);
2980 n = 0;
2981 while (sym == YY__COMMA) {
2982 sym = get_sym();
2983 sym = parse_assignment_expression(sym, &val);
2984 zend_ffi_add_attribute_value(dcl, name, name_len, ++n, &val);
2985 }
2986 FFI_G(attribute_parsing) = orig_attribute_parsing;
2987 if (sym != YY__RPAREN) {
2988 yy_error_sym("')' expected, got", sym);
2989 }
2990 sym = get_sym();
2991 } else {
2992 yy_error_sym("unexpected", sym);
2993 }
2994 } else if (sym == YY_CONST) {
2995 sym = get_sym();
2996 } else if (sym == YY___CONST) {
2997 sym = get_sym();
2998 } else {
2999 sym = get_sym();
3000 }
3001 }
3002 return sym;
3003 }
3004
parse_initializer(int sym)3005 static int parse_initializer(int sym) {
3006 int sym2;
3007 const unsigned char *save_pos;
3008 const unsigned char *save_text;
3009 int save_line;
3010 int alt343;
3011 zend_ffi_val dummy;
3012 if (sym != YY__EQUAL) {
3013 yy_error_sym("'=' expected, got", sym);
3014 }
3015 sym = get_sym();
3016 if (YY_IN_SET(sym, (YY__LPAREN,YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__STAR,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__), "\010\000\000\000\000\000\001\000\004\030\377\376\000")) {
3017 sym = parse_assignment_expression(sym, &dummy);
3018 } else if (sym == YY__LBRACE) {
3019 sym = get_sym();
3020 if (sym == YY__LBRACK || sym == YY__POINT) {
3021 sym = parse_designation(sym);
3022 }
3023 sym = parse_initializer(sym);
3024 while (1) {
3025 save_pos = yy_pos;
3026 save_text = yy_text;
3027 save_line = yy_line;
3028 alt343 = -2;
3029 sym2 = sym;
3030 if (sym2 == YY__COMMA) {
3031 sym2 = get_sym();
3032 goto _yy_state_343_1;
3033 } else if (sym2 == YY__RBRACE) {
3034 alt343 = 348;
3035 goto _yy_state_343;
3036 } else {
3037 yy_error_sym("unexpected", sym2);
3038 }
3039 _yy_state_343_1:
3040 if (sym2 == YY__LBRACK || sym2 == YY__POINT || sym2 == YY__EQUAL) {
3041 alt343 = 344;
3042 goto _yy_state_343;
3043 } else if (sym2 == YY__RBRACE) {
3044 alt343 = 347;
3045 goto _yy_state_343;
3046 } else {
3047 yy_error_sym("unexpected", sym2);
3048 }
3049 _yy_state_343:
3050 yy_pos = save_pos;
3051 yy_text = save_text;
3052 yy_line = save_line;
3053 if (alt343 != 344) {
3054 break;
3055 }
3056 sym = get_sym();
3057 if (sym == YY__LBRACK || sym == YY__POINT) {
3058 sym = parse_designation(sym);
3059 }
3060 sym = parse_initializer(sym);
3061 }
3062 if (alt343 == 347) {
3063 sym = get_sym();
3064 }
3065 if (sym != YY__RBRACE) {
3066 yy_error_sym("'}' expected, got", sym);
3067 }
3068 sym = get_sym();
3069 } else {
3070 yy_error_sym("unexpected", sym);
3071 }
3072 return sym;
3073 }
3074
parse_designation(int sym)3075 static int parse_designation(int sym) {
3076 const char *name;
3077 size_t name_len;
3078 zend_ffi_val dummy;
3079 do {
3080 if (sym == YY__LBRACK) {
3081 sym = get_sym();
3082 sym = parse_constant_expression(sym, &dummy);
3083 if (sym != YY__RBRACK) {
3084 yy_error_sym("']' expected, got", sym);
3085 }
3086 sym = get_sym();
3087 } else if (sym == YY__POINT) {
3088 sym = get_sym();
3089 sym = parse_ID(sym, &name, &name_len);
3090 } else {
3091 yy_error_sym("unexpected", sym);
3092 }
3093 } while (sym == YY__LBRACK || sym == YY__POINT);
3094 if (sym != YY__EQUAL) {
3095 yy_error_sym("'=' expected, got", sym);
3096 }
3097 sym = get_sym();
3098 return sym;
3099 }
3100
parse_expr_list(int sym)3101 static int parse_expr_list(int sym) {
3102 zend_ffi_val dummy;
3103 sym = parse_assignment_expression(sym, &dummy);
3104 while (sym == YY__COMMA) {
3105 sym = get_sym();
3106 sym = parse_assignment_expression(sym, &dummy);
3107 }
3108 return sym;
3109 }
3110
parse_expression(int sym,zend_ffi_val * val)3111 static int parse_expression(int sym, zend_ffi_val *val) {
3112 sym = parse_assignment_expression(sym, val);
3113 while (sym == YY__COMMA) {
3114 sym = get_sym();
3115 sym = parse_assignment_expression(sym, val);
3116 }
3117 return sym;
3118 }
3119
parse_assignment_expression(int sym,zend_ffi_val * val)3120 static int parse_assignment_expression(int sym, zend_ffi_val *val) {
3121 sym = parse_conditional_expression(sym, val);
3122 return sym;
3123 }
3124
parse_constant_expression(int sym,zend_ffi_val * val)3125 static int parse_constant_expression(int sym, zend_ffi_val *val) {
3126 sym = parse_conditional_expression(sym, val);
3127 return sym;
3128 }
3129
parse_conditional_expression(int sym,zend_ffi_val * val)3130 static int parse_conditional_expression(int sym, zend_ffi_val *val) {
3131 zend_ffi_val op2, op3;
3132 sym = parse_logical_or_expression(sym, val);
3133 if (sym == YY__QUERY) {
3134 sym = get_sym();
3135 sym = parse_expression(sym, &op2);
3136 if (sym != YY__COLON) {
3137 yy_error_sym("':' expected, got", sym);
3138 }
3139 sym = get_sym();
3140 sym = parse_conditional_expression(sym, &op3);
3141 zend_ffi_expr_conditional(val, &op2, &op3);
3142 }
3143 return sym;
3144 }
3145
parse_logical_or_expression(int sym,zend_ffi_val * val)3146 static int parse_logical_or_expression(int sym, zend_ffi_val *val) {
3147 zend_ffi_val op2;
3148 sym = parse_logical_and_expression(sym, val);
3149 while (sym == YY__BAR_BAR) {
3150 sym = get_sym();
3151 sym = parse_logical_and_expression(sym, &op2);
3152 zend_ffi_expr_bool_or(val, &op2);
3153 }
3154 return sym;
3155 }
3156
parse_logical_and_expression(int sym,zend_ffi_val * val)3157 static int parse_logical_and_expression(int sym, zend_ffi_val *val) {
3158 zend_ffi_val op2;
3159 sym = parse_inclusive_or_expression(sym, val);
3160 while (sym == YY__AND_AND) {
3161 sym = get_sym();
3162 sym = parse_inclusive_or_expression(sym, &op2);
3163 zend_ffi_expr_bool_and(val, &op2);
3164 }
3165 return sym;
3166 }
3167
parse_inclusive_or_expression(int sym,zend_ffi_val * val)3168 static int parse_inclusive_or_expression(int sym, zend_ffi_val *val) {
3169 zend_ffi_val op2;
3170 sym = parse_exclusive_or_expression(sym, val);
3171 while (sym == YY__BAR) {
3172 sym = get_sym();
3173 sym = parse_exclusive_or_expression(sym, &op2);
3174 zend_ffi_expr_bw_or(val, &op2);
3175 }
3176 return sym;
3177 }
3178
parse_exclusive_or_expression(int sym,zend_ffi_val * val)3179 static int parse_exclusive_or_expression(int sym, zend_ffi_val *val) {
3180 zend_ffi_val op2;
3181 sym = parse_and_expression(sym, val);
3182 while (sym == YY__UPARROW) {
3183 sym = get_sym();
3184 sym = parse_and_expression(sym, &op2);
3185 zend_ffi_expr_bw_xor(val, &op2);
3186 }
3187 return sym;
3188 }
3189
parse_and_expression(int sym,zend_ffi_val * val)3190 static int parse_and_expression(int sym, zend_ffi_val *val) {
3191 zend_ffi_val op2;
3192 sym = parse_equality_expression(sym, val);
3193 while (sym == YY__AND) {
3194 sym = get_sym();
3195 sym = parse_equality_expression(sym, &op2);
3196 zend_ffi_expr_bw_and(val, &op2);
3197 }
3198 return sym;
3199 }
3200
parse_equality_expression(int sym,zend_ffi_val * val)3201 static int parse_equality_expression(int sym, zend_ffi_val *val) {
3202 zend_ffi_val op2;
3203 sym = parse_relational_expression(sym, val);
3204 while (sym == YY__EQUAL_EQUAL || sym == YY__BANG_EQUAL) {
3205 if (sym == YY__EQUAL_EQUAL) {
3206 sym = get_sym();
3207 sym = parse_relational_expression(sym, &op2);
3208 zend_ffi_expr_is_equal(val, &op2);
3209 } else {
3210 sym = get_sym();
3211 sym = parse_relational_expression(sym, &op2);
3212 zend_ffi_expr_is_not_equal(val, &op2);
3213 }
3214 }
3215 return sym;
3216 }
3217
parse_relational_expression(int sym,zend_ffi_val * val)3218 static int parse_relational_expression(int sym, zend_ffi_val *val) {
3219 zend_ffi_val op2;
3220 sym = parse_shift_expression(sym, val);
3221 while (sym == YY__LESS || sym == YY__GREATER || sym == YY__LESS_EQUAL || sym == YY__GREATER_EQUAL) {
3222 if (sym == YY__LESS) {
3223 sym = get_sym();
3224 sym = parse_shift_expression(sym, &op2);
3225 zend_ffi_expr_is_less(val, &op2);
3226 } else if (sym == YY__GREATER) {
3227 sym = get_sym();
3228 sym = parse_shift_expression(sym, &op2);
3229 zend_ffi_expr_is_greater(val, &op2);
3230 } else if (sym == YY__LESS_EQUAL) {
3231 sym = get_sym();
3232 sym = parse_shift_expression(sym, &op2);
3233 zend_ffi_expr_is_less_or_equal(val, &op2);
3234 } else {
3235 sym = get_sym();
3236 sym = parse_shift_expression(sym, &op2);
3237 zend_ffi_expr_is_greater_or_equal(val, &op2);
3238 }
3239 }
3240 return sym;
3241 }
3242
parse_shift_expression(int sym,zend_ffi_val * val)3243 static int parse_shift_expression(int sym, zend_ffi_val *val) {
3244 zend_ffi_val op2;
3245 sym = parse_additive_expression(sym, val);
3246 while (sym == YY__LESS_LESS || sym == YY__GREATER_GREATER) {
3247 if (sym == YY__LESS_LESS) {
3248 sym = get_sym();
3249 sym = parse_additive_expression(sym, &op2);
3250 zend_ffi_expr_shift_left(val, &op2);
3251 } else {
3252 sym = get_sym();
3253 sym = parse_additive_expression(sym, &op2);
3254 zend_ffi_expr_shift_right(val, &op2);
3255 }
3256 }
3257 return sym;
3258 }
3259
parse_additive_expression(int sym,zend_ffi_val * val)3260 static int parse_additive_expression(int sym, zend_ffi_val *val) {
3261 zend_ffi_val op2;
3262 sym = parse_multiplicative_expression(sym, val);
3263 while (sym == YY__PLUS || sym == YY__MINUS) {
3264 if (sym == YY__PLUS) {
3265 sym = get_sym();
3266 sym = parse_multiplicative_expression(sym, &op2);
3267 zend_ffi_expr_add(val, &op2);
3268 } else {
3269 sym = get_sym();
3270 sym = parse_multiplicative_expression(sym, &op2);
3271 zend_ffi_expr_sub(val, &op2);
3272 }
3273 }
3274 return sym;
3275 }
3276
parse_multiplicative_expression(int sym,zend_ffi_val * val)3277 static int parse_multiplicative_expression(int sym, zend_ffi_val *val) {
3278 zend_ffi_val op2;
3279 sym = parse_cast_expression(sym, val);
3280 while (sym == YY__STAR || sym == YY__SLASH || sym == YY__PERCENT) {
3281 if (sym == YY__STAR) {
3282 sym = get_sym();
3283 sym = parse_cast_expression(sym, &op2);
3284 zend_ffi_expr_mul(val, &op2);
3285 } else if (sym == YY__SLASH) {
3286 sym = get_sym();
3287 sym = parse_cast_expression(sym, &op2);
3288 zend_ffi_expr_div(val, &op2);
3289 } else {
3290 sym = get_sym();
3291 sym = parse_cast_expression(sym, &op2);
3292 zend_ffi_expr_mod(val, &op2);
3293 }
3294 }
3295 return sym;
3296 }
3297
parse_cast_expression(int sym,zend_ffi_val * val)3298 static int parse_cast_expression(int sym, zend_ffi_val *val) {
3299 int do_cast = 0;
3300 zend_ffi_dcl dcl = ZEND_FFI_ATTR_INIT;
3301 if ((sym == YY__LPAREN) && synpred_4(sym)) {
3302 sym = get_sym();
3303 sym = parse_type_name(sym, &dcl);
3304 if (sym != YY__RPAREN) {
3305 yy_error_sym("')' expected, got", sym);
3306 }
3307 sym = get_sym();
3308 do_cast = 1;
3309 }
3310 sym = parse_unary_expression(sym, val);
3311 if (do_cast) zend_ffi_expr_cast(val, &dcl);
3312 return sym;
3313 }
3314
parse_unary_expression(int sym,zend_ffi_val * val)3315 static int parse_unary_expression(int sym, zend_ffi_val *val) {
3316 const char *name;
3317 size_t name_len;
3318 zend_ffi_dcl dcl = ZEND_FFI_ATTR_INIT;
3319 switch (sym) {
3320 case YY_ID:
3321 sym = parse_ID(sym, &name, &name_len);
3322 zend_ffi_resolve_const(name, name_len, val);
3323 while (YY_IN_SET(sym, (YY__LBRACK,YY__LPAREN,YY__POINT,YY__MINUS_GREATER,YY__PLUS_PLUS,YY__MINUS_MINUS), "\010\000\000\000\000\000\002\020\000\200\003\000\000")) {
3324 switch (sym) {
3325 case YY__LBRACK:
3326 sym = get_sym();
3327 sym = parse_expr_list(sym);
3328 if (sym != YY__RBRACK) {
3329 yy_error_sym("']' expected, got", sym);
3330 }
3331 sym = get_sym();
3332 break;
3333 case YY__LPAREN:
3334 sym = get_sym();
3335 if (YY_IN_SET(sym, (YY__LPAREN,YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__STAR,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__), "\010\000\000\000\000\000\001\000\004\030\377\376\000")) {
3336 sym = parse_expr_list(sym);
3337 }
3338 if (sym != YY__RPAREN) {
3339 yy_error_sym("')' expected, got", sym);
3340 }
3341 sym = get_sym();
3342 break;
3343 case YY__POINT:
3344 sym = get_sym();
3345 sym = parse_ID(sym, &name, &name_len);
3346 break;
3347 case YY__MINUS_GREATER:
3348 sym = get_sym();
3349 sym = parse_ID(sym, &name, &name_len);
3350 break;
3351 case YY__PLUS_PLUS:
3352 sym = get_sym();
3353 break;
3354 default:
3355 sym = get_sym();
3356 break;
3357 }
3358 zend_ffi_val_error(val);
3359 }
3360 break;
3361 case YY_OCTNUMBER:
3362 sym = parse_OCTNUMBER(sym, val);
3363 break;
3364 case YY_DECNUMBER:
3365 sym = parse_DECNUMBER(sym, val);
3366 break;
3367 case YY_HEXNUMBER:
3368 sym = parse_HEXNUMBER(sym, val);
3369 break;
3370 case YY_FLOATNUMBER:
3371 sym = parse_FLOATNUMBER(sym, val);
3372 break;
3373 case YY_STRING:
3374 sym = parse_STRING(sym, val);
3375 break;
3376 case YY_CHARACTER:
3377 sym = parse_CHARACTER(sym, val);
3378 break;
3379 case YY__LPAREN:
3380 sym = get_sym();
3381 sym = parse_expression(sym, val);
3382 if (sym != YY__RPAREN) {
3383 yy_error_sym("')' expected, got", sym);
3384 }
3385 sym = get_sym();
3386 break;
3387 case YY__PLUS_PLUS:
3388 sym = get_sym();
3389 sym = parse_unary_expression(sym, val);
3390 zend_ffi_val_error(val);
3391 break;
3392 case YY__MINUS_MINUS:
3393 sym = get_sym();
3394 sym = parse_unary_expression(sym, val);
3395 zend_ffi_val_error(val);
3396 break;
3397 case YY__AND:
3398 sym = get_sym();
3399 sym = parse_cast_expression(sym, val);
3400 zend_ffi_val_error(val);
3401 break;
3402 case YY__STAR:
3403 sym = get_sym();
3404 sym = parse_cast_expression(sym, val);
3405 zend_ffi_val_error(val);
3406 break;
3407 case YY__PLUS:
3408 sym = get_sym();
3409 sym = parse_cast_expression(sym, val);
3410 zend_ffi_expr_plus(val);
3411 break;
3412 case YY__MINUS:
3413 sym = get_sym();
3414 sym = parse_cast_expression(sym, val);
3415 zend_ffi_expr_neg(val);
3416 break;
3417 case YY__TILDE:
3418 sym = get_sym();
3419 sym = parse_cast_expression(sym, val);
3420 zend_ffi_expr_bw_not(val);
3421 break;
3422 case YY__BANG:
3423 sym = get_sym();
3424 sym = parse_cast_expression(sym, val);
3425 zend_ffi_expr_bool_not(val);
3426 break;
3427 case YY_SIZEOF:
3428 sym = get_sym();
3429 if ((sym == YY__LPAREN) && synpred_5(sym)) {
3430 sym = get_sym();
3431 sym = parse_type_name(sym, &dcl);
3432 if (sym != YY__RPAREN) {
3433 yy_error_sym("')' expected, got", sym);
3434 }
3435 sym = get_sym();
3436 zend_ffi_expr_sizeof_type(val, &dcl);
3437 } else if (YY_IN_SET(sym, (YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER,YY__LPAREN,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__STAR,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__), "\010\000\000\000\000\000\001\000\004\030\377\376\000")) {
3438 sym = parse_unary_expression(sym, val);
3439 zend_ffi_expr_sizeof_val(val);
3440 } else {
3441 yy_error_sym("unexpected", sym);
3442 }
3443 break;
3444 case YY__ALIGNOF:
3445 sym = get_sym();
3446 if (sym != YY__LPAREN) {
3447 yy_error_sym("'(' expected, got", sym);
3448 }
3449 sym = get_sym();
3450 sym = parse_type_name(sym, &dcl);
3451 if (sym != YY__RPAREN) {
3452 yy_error_sym("')' expected, got", sym);
3453 }
3454 sym = get_sym();
3455 zend_ffi_expr_alignof_type(val, &dcl);
3456 break;
3457 case YY___ALIGNOF:
3458 case YY___ALIGNOF__:
3459 sym = get_sym();
3460 if ((sym == YY__LPAREN) && synpred_6(sym)) {
3461 sym = get_sym();
3462 sym = parse_type_name(sym, &dcl);
3463 if (sym != YY__RPAREN) {
3464 yy_error_sym("')' expected, got", sym);
3465 }
3466 sym = get_sym();
3467 zend_ffi_expr_alignof_type(val, &dcl);
3468 } else if (YY_IN_SET(sym, (YY_ID,YY_OCTNUMBER,YY_DECNUMBER,YY_HEXNUMBER,YY_FLOATNUMBER,YY_STRING,YY_CHARACTER,YY__LPAREN,YY__PLUS_PLUS,YY__MINUS_MINUS,YY__AND,YY__STAR,YY__PLUS,YY__MINUS,YY__TILDE,YY__BANG,YY_SIZEOF,YY__ALIGNOF,YY___ALIGNOF,YY___ALIGNOF__), "\010\000\000\000\000\000\001\000\004\030\377\376\000")) {
3469 sym = parse_unary_expression(sym, val);
3470 zend_ffi_expr_alignof_val(val);
3471 } else {
3472 yy_error_sym("unexpected", sym);
3473 }
3474 break;
3475 default:
3476 yy_error_sym("unexpected", sym);
3477 }
3478 return sym;
3479 }
3480
parse_ID(int sym,const char ** name,size_t * name_len)3481 static int parse_ID(int sym, const char **name, size_t *name_len) {
3482 if (sym != YY_ID) {
3483 yy_error_sym("<ID> expected, got", sym);
3484 }
3485 *name = (const char*)yy_text; *name_len = yy_pos - yy_text;
3486 sym = get_sym();
3487 return sym;
3488 }
3489
parse_OCTNUMBER(int sym,zend_ffi_val * val)3490 static int parse_OCTNUMBER(int sym, zend_ffi_val *val) {
3491 if (sym != YY_OCTNUMBER) {
3492 yy_error_sym("<OCTNUMBER> expected, got", sym);
3493 }
3494 zend_ffi_val_number(val, 8, (const char*)yy_text, yy_pos - yy_text);
3495 sym = get_sym();
3496 return sym;
3497 }
3498
parse_DECNUMBER(int sym,zend_ffi_val * val)3499 static int parse_DECNUMBER(int sym, zend_ffi_val *val) {
3500 if (sym != YY_DECNUMBER) {
3501 yy_error_sym("<DECNUMBER> expected, got", sym);
3502 }
3503 zend_ffi_val_number(val, 10, (const char*)yy_text, yy_pos - yy_text);
3504 sym = get_sym();
3505 return sym;
3506 }
3507
parse_HEXNUMBER(int sym,zend_ffi_val * val)3508 static int parse_HEXNUMBER(int sym, zend_ffi_val *val) {
3509 if (sym != YY_HEXNUMBER) {
3510 yy_error_sym("<HEXNUMBER> expected, got", sym);
3511 }
3512 zend_ffi_val_number(val, 16, (const char*)yy_text + 2, yy_pos - yy_text - 2);
3513 sym = get_sym();
3514 return sym;
3515 }
3516
parse_FLOATNUMBER(int sym,zend_ffi_val * val)3517 static int parse_FLOATNUMBER(int sym, zend_ffi_val *val) {
3518 if (sym != YY_FLOATNUMBER) {
3519 yy_error_sym("<FLOATNUMBER> expected, got", sym);
3520 }
3521 zend_ffi_val_float_number(val, (const char*)yy_text, yy_pos - yy_text);
3522 sym = get_sym();
3523 return sym;
3524 }
3525
parse_STRING(int sym,zend_ffi_val * val)3526 static int parse_STRING(int sym, zend_ffi_val *val) {
3527 if (sym != YY_STRING) {
3528 yy_error_sym("<STRING> expected, got", sym);
3529 }
3530 zend_ffi_val_string(val, (const char*)yy_text, yy_pos - yy_text);
3531 sym = get_sym();
3532 return sym;
3533 }
3534
parse_CHARACTER(int sym,zend_ffi_val * val)3535 static int parse_CHARACTER(int sym, zend_ffi_val *val) {
3536 if (sym != YY_CHARACTER) {
3537 yy_error_sym("<CHARACTER> expected, got", sym);
3538 }
3539 zend_ffi_val_character(val, (const char*)yy_text, yy_pos - yy_text);
3540 sym = get_sym();
3541 return sym;
3542 }
3543
parse(void)3544 static void parse(void) {
3545 int sym;
3546
3547 yy_pos = yy_text = yy_buf;
3548 yy_line = 1;
3549 sym = parse_declarations(get_sym());
3550 if (sym != YY_EOF) {
3551 yy_error_sym("<EOF> expected, got", sym);
3552 }
3553 }
3554
zend_ffi_parse_decl(const char * str,size_t len)3555 int zend_ffi_parse_decl(const char *str, size_t len) {
3556 if (SETJMP(FFI_G(bailout))==0) {
3557 FFI_G(allow_vla) = 0;
3558 FFI_G(attribute_parsing) = 0;
3559 yy_buf = (unsigned char*)str;
3560 yy_end = yy_buf + len;
3561 parse();
3562 return SUCCESS;
3563 } else {
3564 return FAILURE;
3565 }
3566 }
3567
zend_ffi_parse_type(const char * str,size_t len,zend_ffi_dcl * dcl)3568 int zend_ffi_parse_type(const char *str, size_t len, zend_ffi_dcl *dcl) {
3569 int sym;
3570
3571 if (SETJMP(FFI_G(bailout))==0) {
3572 FFI_G(allow_vla) = 0;
3573 FFI_G(attribute_parsing) = 0;
3574 yy_pos = yy_text = yy_buf = (unsigned char*)str;
3575 yy_end = yy_buf + len;
3576 yy_line = 1;
3577 sym = parse_type_name(get_sym(), dcl);
3578 if (sym != YY_EOF) {
3579 yy_error_sym("<EOF> expected, got", sym);
3580 }
3581 zend_ffi_validate_type_name(dcl);
3582 return SUCCESS;
3583 } else {
3584 return FAILURE;
3585 };
3586 }
3587
yy_error(const char * msg)3588 static void yy_error(const char *msg) {
3589 zend_ffi_parser_error("%s at line %d", msg, yy_line);
3590 }
3591
yy_error_sym(const char * msg,int sym)3592 static void yy_error_sym(const char *msg, int sym) {
3593 zend_ffi_parser_error("%s '%s' at line %d", msg, sym_name[sym], yy_line);
3594 }
3595