diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index b3d67264664..5d8d89d338e 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -26,7 +26,7 @@ reactos/tools/wpp # Synced to Wine-20081105 (~Wine-1.1.7) reactos/tools/winebuild # Synced to Wine-20081105 (~Wine-1.1.7) reactos/tools/wmc # Synced to Wine-20081105 (~Wine-1.1.7) reactos/tools/wrc # Synced to Wine-20081105 (~Wine-1.1.7) -reactos/tools/widl # Synced to Wine-0_9_59 +reactos/tools/widl # Synced to Wine-0_9_60 The following libraries are shared with Wine. diff --git a/reactos/tools/widl/client.c b/reactos/tools/widl/client.c index a30371d3695..51dfa1073f0 100644 --- a/reactos/tools/widl/client.c +++ b/reactos/tools/widl/client.c @@ -102,6 +102,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) const var_t* explicit_generic_handle_var = NULL; const var_t* context_handle_var = NULL; int has_full_pointer = is_full_pointer_function(func); + const char *callconv = get_attrp(def->type->attrs, ATTR_CALLCONV); /* check for a defined binding handle */ explicit_handle_var = get_explicit_handle_var(func); @@ -131,6 +132,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) write_type_decl_left(client, get_func_return_type(func)); if (needs_space_after(get_func_return_type(func))) fprintf(client, " "); + if (callconv) fprintf(client, "%s ", callconv); write_prefix_name(client, prefix_client, def); fprintf(client, "(\n"); indent++; @@ -184,6 +186,16 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) indent--; fprintf(client, "\n"); + if (is_attr(def->attrs, ATTR_IDEMPOTENT) || is_attr(def->attrs, ATTR_BROADCAST)) + { + print_client("_RpcMessage.RpcFlags = ( RPC_NCA_FLAGS_DEFAULT "); + if (is_attr(def->attrs, ATTR_IDEMPOTENT)) + fprintf(client, "| RPC_NCA_FLAGS_IDEMPOTENT "); + if (is_attr(def->attrs, ATTR_BROADCAST)) + fprintf(client, "| RPC_NCA_FLAGS_BROADCAST "); + fprintf(client, ");\n\n"); + } + if (implicit_handle) { print_client("_Handle = %s;\n", implicit_handle); diff --git a/reactos/tools/widl/header.c b/reactos/tools/widl/header.c index d3a31e6c5bf..612572d844a 100644 --- a/reactos/tools/widl/header.c +++ b/reactos/tools/widl/header.c @@ -737,10 +737,12 @@ static void write_cpp_method_def(const type_t *iface) { var_t *def = cur->def; if (!is_callas(def->attrs)) { + const char *callconv = get_attrp(def->type->attrs, ATTR_CALLCONV); + if (!callconv) callconv = ""; indent(header, 0); fprintf(header, "virtual "); write_type_decl_left(header, get_func_return_type(cur)); - fprintf(header, " STDMETHODCALLTYPE "); + fprintf(header, " %s ", callconv); write_name(header, def); fprintf(header, "(\n"); write_args(header, cur->args, iface->name, 2, TRUE); @@ -763,9 +765,11 @@ static void do_write_c_method_def(const type_t *iface, const char *name) { const var_t *def = cur->def; if (!is_callas(def->attrs)) { + const char *callconv = get_attrp(def->type->attrs, ATTR_CALLCONV); + if (!callconv) callconv = ""; indent(header, 0); write_type_decl_left(header, get_func_return_type(cur)); - fprintf(header, " (STDMETHODCALLTYPE *"); + fprintf(header, " (%s *", callconv); write_name(header, def); fprintf(header, ")(\n"); write_args(header, cur->args, name, 1, TRUE); @@ -795,9 +799,11 @@ static void write_method_proto(const type_t *iface) const var_t *def = cur->def; if (!is_local(def->attrs)) { + const char *callconv = get_attrp(def->type->attrs, ATTR_CALLCONV); + if (!callconv) callconv = ""; /* proxy prototype */ write_type_decl_left(header, get_func_return_type(cur)); - fprintf(header, " CALLBACK %s_", iface->name); + fprintf(header, " %s %s_", callconv, iface->name); write_name(header, def); fprintf(header, "_Proxy(\n"); write_args(header, cur->args, iface->name, 1, TRUE); @@ -881,10 +887,12 @@ void write_locals(FILE *fp, const type_t *iface, int body) static void write_function_proto(const type_t *iface, const func_t *fun, const char *prefix) { var_t *def = fun->def; + const char *callconv = get_attrp(def->type->attrs, ATTR_CALLCONV); /* FIXME: do we need to handle call_as? */ write_type_decl_left(header, get_func_return_type(fun)); fprintf(header, " "); + if (callconv) fprintf(header, "%s ", callconv); write_prefix_name(header, prefix, def); fprintf(header, "(\n"); if (fun->args) diff --git a/reactos/tools/widl/parser.tab.c b/reactos/tools/widl/parser.tab.c index 8c86e263635..20b4648515b 100644 --- a/reactos/tools/widl/parser.tab.c +++ b/reactos/tools/widl/parser.tab.c @@ -414,6 +414,8 @@ unsigned char pointer_default = RPC_FC_UP; static int is_object_interface = FALSE; +/* are we inside a library block? */ +static int is_inside_library = FALSE; typedef struct list typelist_t; struct typenode { @@ -476,7 +478,17 @@ static int compute_method_indexes(type_t *iface); static char *gen_name(void); static void process_typedefs(var_list_t *names); static void check_arg(var_t *arg); +static void check_functions(const type_t *iface); static void check_all_user_types(ifref_list_t *ifaces); +static const attr_list_t *check_iface_attrs(const char *name, const attr_list_t *attrs); +static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs); +static attr_list_t *check_typedef_attrs(attr_list_t *attrs); +static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs); +static const attr_list_t *check_library_attrs(const char *name, const attr_list_t *attrs); +static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs); +static const attr_list_t *check_module_attrs(const char *name, const attr_list_t *attrs); +static const attr_list_t *check_coclass_attrs(const char *name, const attr_list_t *attrs); +const char *get_attr_display_name(enum attr_type type); #define tsENUM 1 #define tsSTRUCT 2 @@ -503,7 +515,7 @@ static void check_all_user_types(ifref_list_t *ifaces); #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 139 "parser.y" +#line 151 "parser.y" typedef union YYSTYPE { attr_t *attr; attr_list_t *attr_list; @@ -527,7 +539,7 @@ typedef union YYSTYPE { interface_info_t ifinfo; } YYSTYPE; /* Line 196 of yacc.c. */ -#line 531 "parser.tab.c" +#line 543 "parser.tab.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -539,7 +551,7 @@ typedef union YYSTYPE { /* Line 219 of yacc.c. */ -#line 543 "parser.tab.c" +#line 555 "parser.tab.c" #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ @@ -690,16 +702,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1044 +#define YYLAST 1042 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 158 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 78 /* YYNRULES -- Number of rules. */ -#define YYNRULES 277 +#define YYNRULES 278 /* YYNRULES -- Number of states. */ -#define YYNSTATES 506 +#define YYNSTATES 507 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -764,28 +776,28 @@ static const unsigned short int yyprhs[] = 78, 81, 84, 87, 92, 96, 100, 106, 109, 113, 118, 119, 121, 123, 125, 129, 131, 136, 140, 141, 145, 149, 151, 155, 160, 161, 163, 167, 169, 173, - 178, 180, 184, 185, 187, 189, 191, 193, 195, 200, - 205, 207, 209, 211, 213, 215, 217, 222, 227, 229, - 231, 236, 238, 243, 248, 253, 255, 257, 262, 267, - 272, 277, 282, 284, 289, 291, 296, 298, 304, 306, - 308, 313, 315, 317, 319, 321, 323, 325, 327, 329, - 331, 336, 338, 340, 342, 344, 351, 353, 355, 357, - 359, 364, 366, 368, 370, 375, 380, 385, 390, 392, - 394, 399, 404, 406, 408, 410, 412, 414, 416, 418, - 419, 422, 427, 431, 437, 438, 441, 443, 445, 449, - 453, 455, 461, 463, 467, 468, 470, 472, 474, 476, - 478, 480, 482, 488, 492, 496, 500, 504, 508, 512, - 516, 520, 523, 526, 529, 532, 537, 542, 546, 548, - 552, 554, 559, 560, 563, 566, 570, 573, 575, 580, - 584, 585, 587, 588, 590, 592, 594, 596, 598, 600, - 602, 605, 608, 610, 612, 614, 616, 618, 620, 622, - 623, 625, 627, 630, 632, 635, 638, 640, 642, 645, - 648, 651, 657, 658, 661, 664, 667, 670, 673, 676, - 680, 683, 687, 693, 699, 700, 703, 706, 709, 712, - 719, 728, 731, 734, 737, 740, 743, 746, 752, 755, - 758, 761, 763, 768, 770, 774, 776, 778, 782, 784, - 786, 788, 794, 796, 798, 800, 803, 805, 808, 810, - 813, 815, 818, 823, 828, 834, 845, 847 + 178, 180, 184, 185, 187, 189, 191, 193, 195, 197, + 202, 207, 209, 211, 213, 215, 217, 219, 224, 229, + 231, 233, 238, 240, 245, 250, 255, 257, 259, 264, + 269, 274, 279, 284, 286, 291, 293, 298, 300, 306, + 308, 310, 315, 317, 319, 321, 323, 325, 327, 329, + 331, 333, 338, 340, 342, 344, 346, 353, 355, 357, + 359, 361, 366, 368, 370, 372, 377, 382, 387, 392, + 394, 396, 401, 406, 408, 410, 412, 414, 416, 418, + 420, 421, 424, 429, 433, 439, 440, 443, 445, 447, + 451, 455, 457, 463, 465, 469, 470, 472, 474, 476, + 478, 480, 482, 484, 490, 494, 498, 502, 506, 510, + 514, 518, 522, 525, 528, 531, 534, 539, 544, 548, + 550, 554, 556, 561, 562, 565, 568, 572, 575, 577, + 582, 586, 587, 589, 590, 592, 594, 596, 598, 600, + 602, 604, 607, 610, 612, 614, 616, 618, 620, 622, + 624, 625, 627, 629, 632, 634, 637, 640, 642, 644, + 647, 650, 653, 659, 660, 663, 666, 669, 672, 675, + 678, 682, 685, 689, 695, 701, 702, 705, 708, 711, + 714, 721, 730, 733, 736, 739, 742, 745, 748, 754, + 757, 760, 763, 765, 770, 772, 776, 778, 780, 784, + 786, 788, 790, 796, 798, 800, 802, 805, 807, 810, + 812, 815, 817, 820, 825, 830, 836, 847, 849 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ @@ -810,106 +822,106 @@ static const short int yyrhs[] = -1, 179, -1, 154, 180, 155, -1, 182, -1, 180, 135, 182, -1, 180, 155, 154, 182, -1, 8, -1, 181, 135, 8, -1, -1, 13, -1, 15, -1, 16, - -1, 18, -1, 19, -1, 24, 150, 204, 151, -1, - 26, 150, 195, 151, -1, 33, -1, 34, -1, 35, - -1, 36, -1, 38, -1, 39, -1, 40, 150, 196, - 151, -1, 40, 150, 8, 151, -1, 41, -1, 42, - -1, 44, 150, 8, 151, -1, 46, -1, 47, 150, - 181, 151, -1, 48, 150, 8, 151, -1, 48, 150, - 196, 151, -1, 51, -1, 56, -1, 58, 150, 196, - 151, -1, 59, 150, 8, 151, -1, 60, 150, 8, - 151, -1, 61, 150, 196, 151, -1, 62, 150, 8, - 151, -1, 63, -1, 65, 150, 196, 151, -1, 66, - -1, 67, 150, 194, 151, -1, 68, -1, 69, 150, - 57, 3, 151, -1, 72, -1, 74, -1, 79, 150, - 192, 151, -1, 81, -1, 85, -1, 86, -1, 87, - -1, 88, -1, 89, -1, 90, -1, 91, -1, 92, - -1, 94, 150, 230, 151, -1, 96, -1, 97, -1, - 98, -1, 100, -1, 101, 150, 196, 135, 196, 151, - -1, 102, -1, 104, -1, 105, -1, 106, -1, 111, - 150, 192, 151, -1, 114, -1, 116, -1, 117, -1, - 120, 150, 194, 151, -1, 121, 150, 232, 151, -1, - 122, 150, 232, 151, -1, 128, 150, 183, 151, -1, - 129, -1, 130, -1, 131, 150, 235, 151, -1, 134, - 150, 232, 151, -1, 230, -1, 9, -1, 8, -1, - 27, -1, 54, -1, 93, -1, 115, -1, -1, 185, - 186, -1, 26, 194, 137, 199, -1, 38, 137, 199, - -1, 32, 232, 204, 156, 196, -1, -1, 189, 135, - -1, 189, -1, 190, -1, 189, 135, 190, -1, 204, - 156, 196, -1, 204, -1, 49, 203, 152, 188, 153, - -1, 193, -1, 192, 135, 193, -1, -1, 194, -1, - 5, -1, 6, -1, 7, -1, 53, -1, 123, -1, - 3, -1, 194, 136, 194, 137, 194, -1, 194, 138, - 194, -1, 194, 139, 194, -1, 194, 141, 194, -1, - 194, 140, 194, -1, 194, 142, 194, -1, 194, 143, - 194, -1, 194, 11, 194, -1, 194, 12, 194, -1, - 144, 194, -1, 140, 194, -1, 139, 194, -1, 142, - 194, -1, 150, 232, 151, 194, -1, 112, 150, 232, - 151, -1, 150, 194, 151, -1, 196, -1, 195, 135, - 196, -1, 194, -1, 52, 32, 232, 204, -1, -1, - 198, 199, -1, 200, 149, -1, 178, 234, 149, -1, - 179, 149, -1, 149, -1, 178, 232, 226, 176, -1, - 178, 232, 226, -1, -1, 204, -1, -1, 3, -1, - 4, -1, 3, -1, 4, -1, 22, -1, 133, -1, - 207, -1, 109, 207, -1, 127, 207, -1, 127, -1, - 55, -1, 110, -1, 45, -1, 20, -1, 50, -1, - 57, -1, -1, 75, -1, 75, -1, 108, 206, -1, - 113, -1, 82, 206, -1, 64, 206, -1, 76, -1, - 28, -1, 29, 3, -1, 29, 4, -1, 179, 208, - -1, 209, 152, 211, 153, 163, -1, -1, 211, 212, - -1, 178, 222, -1, 43, 3, -1, 43, 4, -1, - 179, 213, -1, 95, 137, -1, 215, 200, 149, -1, - 83, 137, -1, 216, 201, 149, -1, 214, 152, 215, - 216, 153, -1, 214, 152, 219, 149, 153, -1, -1, - 137, 4, -1, 77, 3, -1, 77, 4, -1, 179, - 219, -1, 220, 218, 152, 162, 153, 163, -1, 220, - 137, 3, 152, 167, 162, 153, 163, -1, 217, 163, - -1, 219, 149, -1, 213, 149, -1, 84, 3, -1, - 84, 4, -1, 179, 223, -1, 224, 152, 162, 153, - 163, -1, 142, 226, -1, 32, 226, -1, 184, 226, - -1, 228, -1, 228, 150, 172, 151, -1, 204, -1, - 150, 226, 151, -1, 227, -1, 226, -1, 229, 135, - 226, -1, 103, -1, 126, -1, 99, -1, 118, 203, - 152, 198, 153, -1, 132, -1, 4, -1, 205, -1, - 32, 232, -1, 191, -1, 49, 3, -1, 231, -1, - 118, 3, -1, 234, -1, 125, 3, -1, 107, 150, - 232, 151, -1, 124, 178, 232, 229, -1, 125, 203, - 152, 198, 153, -1, 125, 203, 119, 150, 200, 151, - 202, 152, 185, 153, -1, 5, -1, 5, 157, 5, - -1 + -1, 18, -1, 19, -1, 21, -1, 24, 150, 204, + 151, -1, 26, 150, 195, 151, -1, 33, -1, 34, + -1, 35, -1, 36, -1, 38, -1, 39, -1, 40, + 150, 196, 151, -1, 40, 150, 8, 151, -1, 41, + -1, 42, -1, 44, 150, 8, 151, -1, 46, -1, + 47, 150, 181, 151, -1, 48, 150, 8, 151, -1, + 48, 150, 196, 151, -1, 51, -1, 56, -1, 58, + 150, 196, 151, -1, 59, 150, 8, 151, -1, 60, + 150, 8, 151, -1, 61, 150, 196, 151, -1, 62, + 150, 8, 151, -1, 63, -1, 65, 150, 196, 151, + -1, 66, -1, 67, 150, 194, 151, -1, 68, -1, + 69, 150, 57, 3, 151, -1, 72, -1, 74, -1, + 79, 150, 192, 151, -1, 81, -1, 85, -1, 86, + -1, 87, -1, 88, -1, 89, -1, 90, -1, 91, + -1, 92, -1, 94, 150, 230, 151, -1, 96, -1, + 97, -1, 98, -1, 100, -1, 101, 150, 196, 135, + 196, 151, -1, 102, -1, 104, -1, 105, -1, 106, + -1, 111, 150, 192, 151, -1, 114, -1, 116, -1, + 117, -1, 120, 150, 194, 151, -1, 121, 150, 232, + 151, -1, 122, 150, 232, 151, -1, 128, 150, 183, + 151, -1, 129, -1, 130, -1, 131, 150, 235, 151, + -1, 134, 150, 232, 151, -1, 230, -1, 9, -1, + 8, -1, 27, -1, 54, -1, 93, -1, 115, -1, + -1, 185, 186, -1, 26, 194, 137, 199, -1, 38, + 137, 199, -1, 32, 232, 204, 156, 196, -1, -1, + 189, 135, -1, 189, -1, 190, -1, 189, 135, 190, + -1, 204, 156, 196, -1, 204, -1, 49, 203, 152, + 188, 153, -1, 193, -1, 192, 135, 193, -1, -1, + 194, -1, 5, -1, 6, -1, 7, -1, 53, -1, + 123, -1, 3, -1, 194, 136, 194, 137, 194, -1, + 194, 138, 194, -1, 194, 139, 194, -1, 194, 141, + 194, -1, 194, 140, 194, -1, 194, 142, 194, -1, + 194, 143, 194, -1, 194, 11, 194, -1, 194, 12, + 194, -1, 144, 194, -1, 140, 194, -1, 139, 194, + -1, 142, 194, -1, 150, 232, 151, 194, -1, 112, + 150, 232, 151, -1, 150, 194, 151, -1, 196, -1, + 195, 135, 196, -1, 194, -1, 52, 32, 232, 204, + -1, -1, 198, 199, -1, 200, 149, -1, 178, 234, + 149, -1, 179, 149, -1, 149, -1, 178, 232, 226, + 176, -1, 178, 232, 226, -1, -1, 204, -1, -1, + 3, -1, 4, -1, 3, -1, 4, -1, 22, -1, + 133, -1, 207, -1, 109, 207, -1, 127, 207, -1, + 127, -1, 55, -1, 110, -1, 45, -1, 20, -1, + 50, -1, 57, -1, -1, 75, -1, 75, -1, 108, + 206, -1, 113, -1, 82, 206, -1, 64, 206, -1, + 76, -1, 28, -1, 29, 3, -1, 29, 4, -1, + 179, 208, -1, 209, 152, 211, 153, 163, -1, -1, + 211, 212, -1, 178, 222, -1, 43, 3, -1, 43, + 4, -1, 179, 213, -1, 95, 137, -1, 215, 200, + 149, -1, 83, 137, -1, 216, 201, 149, -1, 214, + 152, 215, 216, 153, -1, 214, 152, 219, 149, 153, + -1, -1, 137, 4, -1, 77, 3, -1, 77, 4, + -1, 179, 219, -1, 220, 218, 152, 162, 153, 163, + -1, 220, 137, 3, 152, 167, 162, 153, 163, -1, + 217, 163, -1, 219, 149, -1, 213, 149, -1, 84, + 3, -1, 84, 4, -1, 179, 223, -1, 224, 152, + 162, 153, 163, -1, 142, 226, -1, 32, 226, -1, + 184, 226, -1, 228, -1, 228, 150, 172, 151, -1, + 204, -1, 150, 226, 151, -1, 227, -1, 226, -1, + 229, 135, 226, -1, 103, -1, 126, -1, 99, -1, + 118, 203, 152, 198, 153, -1, 132, -1, 4, -1, + 205, -1, 32, 232, -1, 191, -1, 49, 3, -1, + 231, -1, 118, 3, -1, 234, -1, 125, 3, -1, + 107, 150, 232, 151, -1, 124, 178, 232, 229, -1, + 125, 203, 152, 198, 153, -1, 125, 203, 119, 150, + 200, 151, 202, 152, 185, 153, -1, 5, -1, 5, + 157, 5, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 292, 292, 301, 302, 303, 304, 308, 313, 314, - 315, 318, 319, 320, 321, 322, 326, 327, 328, 329, - 332, 333, 334, 337, 338, 341, 342, 343, 348, 349, - 350, 355, 356, 363, 365, 371, 375, 379, 381, 386, - 390, 391, 394, 397, 398, 399, 403, 408, 414, 415, - 416, 419, 420, 421, 424, 425, 429, 435, 436, 437, - 440, 441, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, - 514, 515, 516, 520, 521, 526, 527, 528, 529, 532, - 533, 536, 540, 546, 552, 553, 554, 557, 561, 570, - 574, 579, 588, 589, 602, 603, 606, 607, 608, 609, - 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, - 620, 621, 622, 623, 624, 625, 626, 627, 630, 631, - 634, 640, 645, 646, 649, 650, 651, 652, 655, 663, - 675, 676, 679, 680, 681, 684, 686, 689, 690, 691, - 692, 693, 709, 710, 711, 712, 713, 714, 715, 718, - 719, 722, 723, 724, 725, 726, 727, 728, 731, 732, - 738, 747, 754, 755, 759, 762, 763, 766, 779, 780, - 783, 784, 787, 796, 805, 806, 809, 810, 813, 825, - 837, 849, 853, 854, 857, 858, 861, 866, 873, 874, - 875, 879, 882, 889, 890, 891, 898, 899, 903, 904, - 905, 908, 919, 920, 921, 922, 923, 924, 925, 926, - 927, 928, 929, 932, 937, 942, 959, 960 + 0, 304, 304, 313, 314, 315, 316, 320, 325, 326, + 327, 330, 331, 332, 333, 334, 338, 339, 340, 341, + 344, 345, 346, 349, 350, 353, 354, 355, 360, 361, + 362, 367, 368, 375, 377, 383, 387, 391, 393, 400, + 404, 405, 408, 411, 412, 413, 417, 422, 428, 429, + 430, 433, 434, 435, 438, 439, 443, 449, 450, 451, + 454, 455, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 535, 536, 541, 542, 543, 544, + 547, 548, 551, 555, 561, 567, 568, 569, 572, 576, + 585, 589, 594, 603, 604, 617, 618, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 645, + 646, 649, 655, 660, 661, 664, 665, 666, 667, 670, + 678, 687, 688, 691, 692, 693, 696, 698, 701, 702, + 703, 704, 705, 721, 722, 723, 724, 725, 726, 727, + 730, 731, 734, 735, 736, 737, 738, 739, 740, 743, + 744, 750, 759, 766, 767, 771, 774, 775, 778, 791, + 792, 795, 796, 799, 808, 817, 818, 821, 822, 825, + 837, 850, 862, 866, 867, 870, 871, 874, 879, 886, + 887, 888, 892, 895, 902, 903, 904, 911, 912, 916, + 917, 918, 921, 932, 933, 934, 935, 936, 937, 938, + 939, 940, 941, 942, 945, 950, 955, 972, 973 }; #endif @@ -1004,21 +1016,21 @@ static const unsigned char yyr1[] = 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 182, 182, 182, 183, 183, 184, 184, 184, 184, 185, - 185, 186, 186, 187, 188, 188, 188, 189, 189, 190, - 190, 191, 192, 192, 193, 193, 194, 194, 194, 194, + 182, 182, 182, 182, 183, 183, 184, 184, 184, 184, + 185, 185, 186, 186, 187, 188, 188, 188, 189, 189, + 190, 190, 191, 192, 192, 193, 193, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, 195, 195, - 196, 197, 198, 198, 199, 199, 199, 199, 200, 201, - 202, 202, 203, 203, 203, 204, 204, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 206, - 206, 207, 207, 207, 207, 207, 207, 207, 208, 208, - 209, 210, 211, 211, 212, 213, 213, 214, 215, 215, - 216, 216, 217, 217, 218, 218, 219, 219, 220, 221, - 221, 221, 222, 222, 223, 223, 224, 225, 226, 226, - 226, 226, 227, 228, 228, 228, 229, 229, 230, 230, - 230, 231, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 233, 234, 234, 235, 235 + 194, 194, 194, 194, 194, 194, 194, 194, 194, 195, + 195, 196, 197, 198, 198, 199, 199, 199, 199, 200, + 201, 202, 202, 203, 203, 203, 204, 204, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 206, 206, 207, 207, 207, 207, 207, 207, 207, 208, + 208, 209, 210, 211, 211, 212, 213, 213, 214, 215, + 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, + 221, 221, 221, 222, 222, 223, 223, 224, 225, 226, + 226, 226, 226, 227, 228, 228, 228, 229, 229, 230, + 230, 230, 231, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 233, 234, 234, 235, 235 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1030,28 +1042,28 @@ static const unsigned char yyr2[] = 2, 2, 2, 4, 3, 3, 5, 2, 3, 4, 0, 1, 1, 1, 3, 1, 4, 3, 0, 3, 3, 1, 3, 4, 0, 1, 3, 1, 3, 4, - 1, 3, 0, 1, 1, 1, 1, 1, 4, 4, - 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, - 4, 1, 4, 4, 4, 1, 1, 4, 4, 4, - 4, 4, 1, 4, 1, 4, 1, 5, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 1, 6, 1, 1, 1, 1, - 4, 1, 1, 1, 4, 4, 4, 4, 1, 1, - 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, - 2, 4, 3, 5, 0, 2, 1, 1, 3, 3, - 1, 5, 1, 3, 0, 1, 1, 1, 1, 1, - 1, 1, 5, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 2, 2, 4, 4, 3, 1, 3, - 1, 4, 0, 2, 2, 3, 2, 1, 4, 3, - 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 2, 1, 2, 2, 1, 1, 2, 2, - 2, 5, 0, 2, 2, 2, 2, 2, 2, 3, - 2, 3, 5, 5, 0, 2, 2, 2, 2, 6, - 8, 2, 2, 2, 2, 2, 2, 5, 2, 2, - 2, 1, 4, 1, 3, 1, 1, 3, 1, 1, - 1, 5, 1, 1, 1, 2, 1, 2, 1, 2, - 1, 2, 4, 4, 5, 10, 1, 3 + 1, 3, 0, 1, 1, 1, 1, 1, 1, 4, + 4, 1, 1, 1, 1, 1, 1, 4, 4, 1, + 1, 4, 1, 4, 4, 4, 1, 1, 4, 4, + 4, 4, 4, 1, 4, 1, 4, 1, 5, 1, + 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 1, 1, 1, 1, 6, 1, 1, 1, + 1, 4, 1, 1, 1, 4, 4, 4, 4, 1, + 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 4, 3, 5, 0, 2, 1, 1, 3, + 3, 1, 5, 1, 3, 0, 1, 1, 1, 1, + 1, 1, 1, 5, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 2, 2, 2, 4, 4, 3, 1, + 3, 1, 4, 0, 2, 2, 3, 2, 1, 4, + 3, 0, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 2, 1, 2, 2, 1, 1, 2, + 2, 2, 5, 0, 2, 2, 2, 2, 2, 2, + 3, 2, 3, 5, 5, 0, 2, 2, 2, 2, + 6, 8, 2, 2, 2, 2, 2, 2, 5, 2, + 2, 2, 1, 4, 1, 3, 1, 1, 3, 1, + 1, 1, 5, 1, 1, 1, 2, 1, 2, 1, + 2, 1, 2, 4, 4, 5, 10, 1, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -1059,364 +1071,364 @@ static const unsigned char yyr2[] = means the default is an error. */ static const unsigned short int yydefact[] = { - 3, 0, 2, 1, 0, 0, 0, 0, 192, 0, - 0, 0, 192, 54, 192, 62, 10, 26, 11, 29, + 3, 0, 2, 1, 0, 0, 0, 0, 193, 0, + 0, 0, 193, 54, 193, 62, 10, 26, 11, 29, 11, 9, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 23, 0, 234, 5, 4, 0, 8, 0, 0, - 0, 218, 219, 263, 206, 197, 217, 0, 205, 192, - 207, 203, 208, 209, 211, 216, 209, 0, 209, 0, - 204, 213, 192, 192, 202, 262, 198, 266, 264, 199, - 268, 0, 270, 0, 225, 226, 193, 194, 0, 0, - 0, 236, 237, 0, 0, 55, 0, 63, 64, 65, - 66, 67, 0, 0, 70, 71, 72, 73, 74, 75, - 0, 78, 79, 0, 81, 0, 0, 85, 86, 0, - 0, 0, 0, 0, 92, 0, 94, 0, 96, 0, - 98, 99, 0, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 0, 111, 112, 113, 260, 114, 0, 116, - 258, 117, 118, 119, 0, 121, 122, 123, 0, 0, - 0, 259, 0, 128, 129, 0, 0, 0, 57, 132, - 0, 0, 0, 0, 0, 220, 227, 238, 246, 25, - 27, 28, 6, 222, 243, 0, 24, 241, 242, 0, - 0, 20, 30, 31, 32, 265, 267, 210, 215, 214, - 0, 212, 200, 269, 271, 201, 195, 196, 0, 0, - 144, 0, 34, 182, 0, 0, 182, 0, 0, 0, + 0, 23, 0, 235, 5, 4, 0, 8, 0, 0, + 0, 219, 220, 264, 207, 198, 218, 0, 206, 193, + 208, 204, 209, 210, 212, 217, 210, 0, 210, 0, + 205, 214, 193, 193, 203, 263, 199, 267, 265, 200, + 269, 0, 271, 0, 226, 227, 194, 195, 0, 0, + 0, 237, 238, 0, 0, 55, 0, 63, 64, 65, + 66, 67, 68, 0, 0, 71, 72, 73, 74, 75, + 76, 0, 79, 80, 0, 82, 0, 0, 86, 87, + 0, 0, 0, 0, 0, 93, 0, 95, 0, 97, + 0, 99, 100, 0, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 0, 112, 113, 114, 261, 115, 0, + 117, 259, 118, 119, 120, 0, 122, 123, 124, 0, + 0, 0, 260, 0, 129, 130, 0, 0, 0, 57, + 133, 0, 0, 0, 0, 0, 221, 228, 239, 247, + 25, 27, 28, 6, 223, 244, 0, 24, 242, 243, + 0, 0, 20, 30, 31, 32, 266, 268, 211, 216, + 215, 0, 213, 201, 270, 272, 202, 196, 197, 0, + 0, 145, 0, 34, 183, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 154, 0, 0, 154, 0, 0, 0, 0, 0, - 0, 62, 56, 35, 0, 17, 18, 19, 0, 15, - 13, 12, 16, 23, 37, 244, 245, 38, 54, 0, - 54, 0, 0, 235, 20, 54, 0, 0, 33, 0, - 146, 147, 150, 181, 54, 135, 0, 136, 137, 138, - 0, 0, 0, 253, 256, 255, 251, 273, 54, 54, - 0, 161, 156, 157, 158, 159, 0, 160, 0, 0, - 0, 0, 0, 180, 0, 178, 0, 0, 0, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 152, 155, 0, 0, 0, 0, 0, 0, - 134, 133, 0, 276, 0, 0, 58, 62, 0, 14, - 39, 23, 0, 223, 228, 0, 0, 0, 54, 0, - 0, 54, 23, 22, 0, 0, 272, 143, 151, 145, - 0, 187, 261, 0, 55, 183, 0, 249, 248, 0, - 250, 40, 0, 0, 274, 68, 0, 173, 172, 174, - 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 69, 77, 76, 80, 0, 82, 83, - 84, 87, 88, 89, 90, 91, 93, 95, 0, 154, - 100, 110, 0, 120, 124, 125, 126, 127, 0, 130, - 131, 59, 0, 221, 224, 230, 0, 229, 232, 0, - 233, 20, 23, 247, 0, 21, 148, 149, 270, 186, - 184, 254, 262, 0, 45, 41, 43, 0, 0, 257, - 190, 0, 177, 0, 169, 170, 0, 163, 164, 166, - 165, 167, 168, 179, 61, 97, 153, 0, 277, 23, - 48, 231, 54, 239, 189, 185, 252, 0, 0, 48, - 0, 191, 176, 175, 0, 115, 36, 154, 188, 23, - 44, 48, 47, 139, 162, 0, 0, 51, 240, 46, - 0, 50, 0, 49, 0, 0, 275, 140, 52, 0, - 0, 54, 53, 54, 142, 141 + 0, 0, 155, 0, 0, 155, 0, 0, 0, 0, + 0, 0, 62, 56, 35, 0, 17, 18, 19, 0, + 15, 13, 12, 16, 23, 37, 245, 246, 38, 54, + 0, 54, 0, 0, 236, 20, 54, 0, 0, 33, + 0, 147, 148, 151, 182, 54, 136, 0, 137, 138, + 139, 0, 0, 0, 254, 257, 256, 252, 274, 54, + 54, 0, 162, 157, 158, 159, 160, 0, 161, 0, + 0, 0, 0, 0, 181, 0, 179, 0, 0, 0, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 153, 156, 0, 0, 0, 0, 0, + 0, 135, 134, 0, 277, 0, 0, 58, 62, 0, + 14, 39, 23, 0, 224, 229, 0, 0, 0, 54, + 0, 0, 54, 23, 22, 0, 0, 273, 144, 152, + 146, 0, 188, 262, 0, 55, 184, 0, 250, 249, + 0, 251, 40, 0, 0, 275, 69, 0, 174, 173, + 175, 172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70, 78, 77, 81, 0, 83, + 84, 85, 88, 89, 90, 91, 92, 94, 96, 0, + 155, 101, 111, 0, 121, 125, 126, 127, 128, 0, + 131, 132, 59, 0, 222, 225, 231, 0, 230, 233, + 0, 234, 20, 23, 248, 0, 21, 149, 150, 271, + 187, 185, 255, 263, 0, 45, 41, 43, 0, 0, + 258, 191, 0, 178, 0, 170, 171, 0, 164, 165, + 167, 166, 168, 169, 180, 61, 98, 154, 0, 278, + 23, 48, 232, 54, 240, 190, 186, 253, 0, 0, + 48, 0, 192, 177, 176, 0, 116, 36, 155, 189, + 23, 44, 48, 47, 140, 163, 0, 0, 51, 241, + 46, 0, 50, 0, 49, 0, 0, 276, 141, 52, + 0, 0, 54, 53, 54, 143, 142 }; /* YYDEFGOTO[NTERM-NUM]. */ static const short int yydefgoto[] = { - -1, 1, 2, 160, 255, 177, 343, 17, 18, 19, - 236, 164, 20, 237, 433, 434, 435, 436, 478, 486, - 344, 85, 157, 300, 158, 322, 272, 490, 497, 23, - 259, 260, 261, 67, 311, 312, 293, 294, 295, 25, - 264, 355, 356, 345, 470, 78, 273, 68, 188, 69, - 238, 27, 239, 248, 333, 29, 30, 250, 338, 31, - 180, 32, 33, 240, 241, 168, 36, 242, 274, 275, - 276, 277, 159, 70, 416, 39, 72, 324 + -1, 1, 2, 161, 256, 178, 344, 17, 18, 19, + 237, 165, 20, 238, 434, 435, 436, 437, 479, 487, + 345, 85, 158, 301, 159, 323, 273, 491, 498, 23, + 260, 261, 262, 67, 312, 313, 294, 295, 296, 25, + 265, 356, 357, 346, 471, 78, 274, 68, 189, 69, + 239, 27, 240, 249, 334, 29, 30, 251, 339, 31, + 181, 32, 33, 241, 242, 169, 36, 243, 275, 276, + 277, 278, 160, 70, 417, 39, 72, 325 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -463 +#define YYPACT_NINF -455 static const short int yypact[] = { - -463, 30, 766, -463, 128, 732, -86, 132, 134, 36, - 71, 140, 134, -61, 134, 910, -463, -463, -463, -463, - -463, -463, 23, -47, -43, -36, -33, -13, -463, -30, - 16, -20, 2, 48, -463, -463, 61, -463, 73, 77, - 79, -463, -463, -463, -463, -463, -463, 732, -463, 151, - -463, -463, -463, 146, -463, -463, 146, 81, 146, 532, - -463, -463, 153, 188, 532, -463, -463, -463, -463, -463, - -463, 190, -463, 221, -463, -463, -463, -463, 80, 732, - 85, -463, -463, 88, 732, -463, -93, -463, -463, -463, - -463, -463, 87, 92, -463, -463, -463, -463, -463, -463, - 93, -463, -463, 94, -463, 96, 97, -463, -463, 98, - 99, 103, 104, 105, -463, 107, -463, 108, -463, 110, - -463, -463, 113, -463, -463, -463, -463, -463, -463, -463, - -463, -463, 115, -463, -463, -463, -463, -463, 118, -463, - -463, -463, -463, -463, 119, -463, -463, -463, 121, 122, - 124, -463, 125, -463, -463, 126, 129, -112, -463, -463, - 28, 742, 275, 193, 131, -463, -463, -463, -463, -463, - -463, -463, -463, -463, -463, -23, -463, -463, -463, 195, - 133, -463, -463, -463, -463, -463, 135, -463, -463, -463, - 732, -463, -463, 135, -90, -463, -463, -463, 130, 141, - 190, 190, -463, -463, 91, 143, -463, 190, 536, 291, - 272, 276, 303, 536, 283, 292, 536, 293, 536, 536, - 245, 536, -68, 536, 536, 536, 732, 732, 199, 298, - 732, 910, 150, -463, 155, -463, -463, -463, 158, -463, - -463, -463, -463, -20, -463, -463, -463, -463, 56, 175, - -58, 164, 163, -463, -463, 352, 171, 536, -463, 172, - 189, -463, 170, -463, -39, -463, 91, -463, -463, -463, - 91, 91, 91, -463, -463, -463, 177, 196, -61, -28, - 179, -463, -463, -463, -463, -463, 182, -463, 536, 536, - 536, 536, 524, 599, -111, -463, 185, 186, 187, -463, - -98, 192, 197, 198, 201, 206, 209, 214, 216, 178, - 325, -60, -463, 599, 217, 204, -34, 239, 218, 220, - -463, -463, 225, 176, 232, 234, -463, 910, 332, -463, - -463, -20, -27, -463, -463, 235, 732, 237, 58, 240, - 318, 768, -20, -463, 732, 246, -463, -463, -463, 190, - 536, -463, -463, 732, 247, -463, 249, -463, -463, 243, - -463, 342, 91, 251, -463, -463, 732, -463, -463, -463, - -463, 575, 254, 536, 536, 536, 536, 536, 536, 536, - 536, 536, 536, -463, -463, -463, -463, 392, -463, -463, - -463, -463, -463, -463, -463, -463, -463, -463, 256, 536, - -463, -463, 536, -463, -463, -463, -463, -463, 403, -463, - -463, -463, 258, -463, -463, -463, 91, -463, -463, 261, - -463, -463, -20, -463, 91, -463, -463, -463, 262, -463, - -463, -463, -31, 265, -463, 277, -463, 732, 91, -463, - 190, 268, -463, 536, -463, -463, 481, 62, 7, -1, - -1, 208, 208, -463, -463, -463, -463, 269, -463, -20, - 259, -463, 779, -463, -463, -463, -463, 458, 91, 259, - 271, -463, -463, -463, 536, -463, -463, 548, -463, -20, - -463, 259, -463, -463, 599, 211, -88, -463, -463, -463, - 10, -463, 536, 267, 536, 288, -463, -463, 599, 536, - 591, -71, 599, -71, -463, -463 + -455, 47, 733, -455, 135, 699, -87, 145, 151, 35, + 101, 153, 151, -53, 151, 908, -455, -455, -455, -455, + -455, -455, 16, -42, -31, -27, -16, -25, -455, 9, + 12, 20, 41, 13, -455, -455, 43, -455, 50, 53, + 57, -455, -455, -455, -455, -455, -455, 699, -455, 190, + -455, -455, -455, 71, -455, -455, 71, 2, 71, 15, + -455, -455, 194, 201, 15, -455, -455, -455, -455, -455, + -455, 226, -455, 203, -455, -455, -455, -455, 61, 699, + 60, -455, -455, 63, 699, -455, -110, -455, -455, -455, + -455, -455, -455, 11, 70, -455, -455, -455, -455, -455, + -455, 72, -455, -455, 76, -455, 88, 92, -455, -455, + 102, 106, 108, 109, 125, -455, 126, -455, 127, -455, + 130, -455, -455, 131, -455, -455, -455, -455, -455, -455, + -455, -455, -455, 134, -455, -455, -455, -455, -455, 136, + -455, -455, -455, -455, -455, 137, -455, -455, -455, 138, + 142, 143, -455, 144, -455, -455, 148, 149, -98, -455, + -455, 362, 709, 258, 247, 114, -455, -455, -455, -455, + -455, -455, -455, -455, -455, -455, -39, -455, -455, -455, + 251, 133, -455, -455, -455, -455, -455, 150, -455, -455, + -455, 699, -455, -455, 150, -88, -455, -455, -455, 156, + 154, 226, 226, -455, -455, 99, 163, -455, 226, 68, + 303, 292, 293, 452, 68, 296, 306, 68, 307, 68, + 68, 259, 68, -48, 68, 68, 68, 699, 699, 31, + 312, 699, 908, 164, -455, 169, -455, -455, -455, 172, + -455, -455, -455, -455, 20, -455, -455, -455, -455, 111, + 185, -55, 174, 175, -455, -455, 735, 177, 68, -455, + 173, 196, -455, 178, -455, -17, -455, 99, -455, -455, + -455, 99, 99, 99, -455, -455, -455, 179, 198, -53, + -9, 184, -455, -455, -455, -455, -455, 187, -455, 68, + 68, 68, 68, 491, 594, -86, -455, 189, 193, 202, + -455, -83, 207, 210, 211, 212, 214, 215, 216, 217, + 531, 335, -82, -455, 594, 218, 206, -37, 545, 219, + 220, -455, -455, 222, 188, 224, 225, -455, 908, 339, + -455, -455, 20, -7, -455, -455, 240, 699, 200, 116, + 199, 284, 746, 20, -455, 699, 229, -455, -455, -455, + 226, 68, -455, -455, 699, 230, -455, 231, -455, -455, + 235, -455, 275, 99, 236, -455, -455, 699, -455, -455, + -455, -455, 559, 238, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, -455, -455, -455, -455, 373, -455, + -455, -455, -455, -455, -455, -455, -455, -455, -455, 239, + 68, -455, -455, 68, -455, -455, -455, -455, -455, 387, + -455, -455, -455, 244, -455, -455, -455, 99, -455, -455, + 248, -455, -455, 20, -455, 99, -455, -455, -455, 249, + -455, -455, -455, -22, 245, -455, 266, -455, 699, 99, + -455, 226, 253, -455, 68, -455, -455, 440, 105, 93, + 0, 0, 261, 261, -455, -455, -455, -455, 255, -455, + 20, 256, -455, 786, -455, -455, -455, -455, 399, 99, + 256, 257, -455, -455, -455, 68, -455, -455, 515, -455, + 20, -455, 256, -455, -455, 594, 77, -94, -455, -455, + -455, -6, -455, 68, 262, 68, 276, -455, -455, 594, + 68, 575, -77, 594, -77, -455, -455 }; /* YYPGOTO[NTERM-NUM]. */ static const short int yypgoto[] = { - -463, -463, -463, 407, -242, -234, 20, -463, -463, 89, - -463, -463, -463, 426, -463, -463, -463, -35, -399, -463, - -12, -2, -463, -463, -218, -463, -463, -463, -463, -463, - -463, -463, 90, 4, 212, -385, -204, -463, -167, -463, - 231, -462, -223, 100, -463, 49, -67, -463, 72, 63, - 67, -463, 438, -463, -463, 422, -463, -463, -463, -463, - -463, -15, -463, 444, 3, -463, -463, 446, -238, -463, - -463, -463, 236, 6, -3, -463, 1, -463 + -455, -455, -455, 392, -240, -237, 23, -455, -455, 79, + -455, -455, -455, 415, -455, -455, -455, -50, -358, -455, + -12, -2, -455, -455, -209, -455, -455, -455, -455, -455, + -455, -455, 73, 4, 197, -370, -204, -455, -200, -455, + 221, -454, -225, 85, -455, 48, -67, -455, 36, 56, + 44, -455, 423, -455, -455, 408, -455, -455, -455, -455, + -455, 5, -455, 432, 3, -455, -455, 434, -238, -455, + -455, -455, 223, 6, -3, -455, 1, -455 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -194 +#define YYTABLE_NINF -195 static const short int yytable[] = { - 22, 84, 71, 40, 198, 35, 24, 167, 38, 330, - 373, 374, 341, 326, 456, 309, 7, 313, 373, 374, - 313, 317, 16, 231, 382, 335, 205, 337, 357, -193, - 3, 136, 358, 359, 360, 140, 494, 387, 233, 504, - 383, 505, 297, 232, 185, 302, 303, 492, 495, 306, - 11, 308, 4, 388, 11, 363, 315, 4, 151, 206, - 5, 83, -193, 86, 73, 6, 7, 493, 79, 26, - 482, 7, 249, 373, 374, 399, 201, 8, 351, 80, - 9, 204, 489, 15, 367, 368, 369, 370, 371, 165, - 347, 400, 487, 15, 196, 197, 15, 413, 10, 234, - 11, 399, 169, 162, -42, 11, 170, 163, 423, 411, - 351, 83, 86, 171, 352, 15, 172, 403, 265, 174, - -42, 351, 192, 266, 439, 364, 15, 195, 189, 176, - 191, 41, 42, 262, 263, 74, 75, 76, 77, 173, - 280, 380, 381, 81, 82, 267, 12, 378, 379, 380, - 381, 178, 13, 14, 186, 77, 193, 77, 22, 22, - 251, 40, 40, 496, 24, 24, 38, 38, 175, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 460, 462, - 235, 235, 15, 427, 268, 179, 464, 256, 463, 373, - 374, 194, 77, 196, 197, 313, 245, 246, 252, 253, - 469, 377, 378, 379, 380, 381, 269, 320, 321, 331, - 15, 418, 15, 181, 281, 453, 282, 283, 284, 373, - 374, 187, 182, 318, 319, 476, 183, 325, 184, 199, - 481, 190, 200, 270, 202, 457, 332, 207, 336, 473, - 203, 271, 208, 209, 210, 488, 211, 212, 213, 214, - 373, 374, 353, 215, 216, 217, 40, 218, 219, 24, - 220, 38, 354, 221, 285, 222, 336, 353, 223, 224, - 484, 225, 226, 313, 227, 228, 229, 354, 244, 230, - 298, 369, 262, 247, 299, 254, 257, -193, 498, 372, - 500, 304, 258, 278, 281, 502, 282, 283, 284, 296, - 305, 307, 310, 323, 327, 328, 281, 329, 282, 283, - 284, 301, 334, 339, 375, 340, 376, 377, 378, 379, - 380, 381, 346, 286, 349, 348, 350, 361, 398, 397, - 365, 362, 366, 408, 287, 414, 384, 385, 386, 402, - 412, 424, 40, 389, 285, 24, 43, 38, 390, 391, - 288, 289, 392, 290, 428, 291, 285, 393, 438, 437, - 394, 292, 44, 441, 45, 395, 491, 396, 401, 405, - 46, 406, 415, 471, 47, 375, 407, 376, 377, 378, - 379, 380, 381, 409, 5, 410, 417, 48, 10, 6, - 404, 49, 50, 420, 431, 425, 429, 51, 430, 52, - 454, 8, 440, 286, 9, 443, 53, 455, 458, 459, - 461, 465, 467, 477, 287, 286, 466, 54, 55, 472, - 475, 499, 10, 483, 56, 501, 287, 161, 21, 421, - 288, 289, 480, 290, 468, 291, 316, 279, 419, 426, - 28, 292, 288, 289, 166, 290, 34, 291, 37, 57, - 58, 59, 60, 292, 0, 61, 0, 0, 314, 0, - 62, 0, 43, 40, 438, 437, 24, 63, 38, 64, - 12, 0, 0, 0, 432, 66, 13, 14, 44, 0, - 45, 0, 0, 0, 0, 0, 46, 0, 0, 353, - 47, 353, 373, 374, 0, 0, 15, 0, 0, 354, - 0, 354, 0, 48, 0, 342, 15, 49, 50, 0, - 0, 0, 0, 51, 0, 52, 0, 0, 0, 0, - 0, 0, 53, 0, 0, 0, 0, 281, 43, 282, - 283, 284, 0, 54, 55, 0, 0, 0, 0, 281, - 56, 282, 283, 284, 44, 0, 45, 0, 0, 0, - 0, 281, 46, 282, 283, 284, 47, 0, 0, 0, - 46, 0, 0, 0, 0, 57, 58, 59, 60, 48, - 0, 61, 0, 49, 50, 0, 62, 285, 0, 51, - 0, 52, 0, 63, 0, 64, 373, 374, 53, 285, - 65, 66, 0, 0, 0, 0, 53, 0, 0, 54, - 55, 285, 373, 374, 0, 0, 56, 54, 55, 0, - 373, 374, 15, 0, 56, 0, 0, 375, 474, 376, - 377, 378, 379, 380, 381, 0, 0, 0, 0, 0, - 0, 57, 58, 59, 60, 0, 286, 61, 0, 0, - 58, 0, 62, 0, 0, 61, 0, 287, 286, 63, - 0, 64, 0, 0, 0, 0, 65, 66, 0, 287, - 286, 0, 0, 288, 289, 0, 290, 0, 291, 0, - 0, 287, 0, 0, 292, 288, 289, 0, 290, 0, - 291, 0, 0, 0, 0, 0, 292, 288, 289, 0, - 485, 0, 291, 0, 0, 0, 0, 0, 292, 0, + 22, 84, 71, 40, 199, 35, 24, 331, 38, 206, + 298, 374, 375, 303, 304, 342, 310, 307, 314, 309, + 495, 314, 318, 327, 316, 16, 338, 168, 336, 358, + 457, -194, 496, 359, 360, 361, 7, 232, 11, 321, + 322, 493, 207, 46, 186, 4, 26, 3, 505, 383, + 506, 137, 388, 400, 364, 141, 250, 233, 348, 7, + 83, 494, 86, 73, -194, 384, 166, 79, 389, 401, + 11, 282, 352, 283, 284, 285, 202, 15, 152, 53, + 282, 205, 283, 284, 285, 368, 369, 370, 371, 372, + 54, 55, 190, 11, 192, 414, 163, 56, 400, 15, + 164, 15, 197, 198, 374, 375, 424, 170, 488, 80, + 83, 86, 483, -42, 404, 193, 374, 375, 171, 412, + 196, 286, 172, 58, 490, 440, 266, 174, 61, -42, + 286, 267, 352, 173, 263, 264, 353, 15, 41, 42, + 352, 281, 381, 382, 365, 15, 188, 497, 74, 75, + 180, 428, 191, 268, 76, 77, 81, 82, 175, 22, + 22, 208, 40, 40, 176, 24, 24, 38, 38, 177, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 461, + 287, 252, 463, 454, 236, 236, 464, 465, 257, 287, + 179, 288, 269, 187, 77, 182, 314, 194, 77, 183, + 288, 470, 184, 458, 195, 77, 185, 289, 290, 203, + 291, 200, 292, 201, 270, 204, 289, 290, 293, 291, + 209, 292, 210, 477, 319, 320, 211, 293, 326, 197, + 198, 482, 492, 379, 380, 381, 382, 333, 212, 337, + 474, 271, 213, 489, 378, 379, 380, 381, 382, 272, + 246, 247, 214, 354, 253, 254, 215, 40, 216, 217, + 24, 245, 38, 355, 332, 15, 248, 337, 354, 419, + 15, 485, 374, 375, 314, 218, 219, 220, 355, 43, + 221, 222, 370, 263, 223, 255, 224, 225, 226, 499, + 373, 501, 227, 228, 229, 44, 503, 45, 230, 231, + 299, 300, -194, 46, 305, 259, 282, 47, 283, 284, + 285, 297, 258, 279, 306, 308, 311, 324, 328, 329, + 48, 330, 335, 340, 49, 50, 349, 341, 347, 362, + 51, 350, 52, 363, 351, 366, 415, 367, 399, 53, + 385, 403, 425, 40, 386, 409, 24, 413, 38, 418, + 54, 55, 421, 387, 10, 429, 286, 56, 390, 439, + 438, 391, 392, 393, 442, 394, 395, 396, 397, 402, + 406, 407, 234, 408, 472, 410, 411, 416, 426, 430, + 431, 455, 57, 58, 59, 60, 432, 441, 61, 444, + 456, 4, 459, 62, 5, 460, 467, 462, 466, 6, + 63, 468, 64, 43, 473, 7, 476, 433, 66, 484, + 478, 8, 162, 502, 9, 287, 500, 21, 481, 44, + 422, 45, 317, 427, 420, 28, 288, 46, 280, 15, + 167, 47, 10, 235, 34, 469, 37, 0, 0, 11, + 0, 0, 289, 290, 48, 291, 315, 292, 49, 50, + 0, 374, 375, 293, 51, 282, 52, 283, 284, 285, + 302, 0, 0, 53, 40, 439, 438, 24, 0, 38, + 0, 0, 0, 0, 54, 55, 0, 0, 0, 0, + 12, 56, 0, 0, 0, 0, 13, 14, 0, 0, + 354, 0, 354, 0, 282, 43, 283, 284, 285, 0, + 355, 0, 355, 0, 0, 286, 57, 58, 59, 60, + 0, 44, 61, 45, 0, 0, 15, 62, 282, 46, + 283, 284, 285, 47, 63, 0, 64, 0, 0, 0, + 0, 65, 66, 0, 0, 0, 48, 0, 0, 0, + 49, 50, 374, 375, 286, 0, 51, 0, 52, 0, + 0, 0, 0, 15, 0, 53, 374, 375, 0, 0, + 0, 0, 0, 0, 287, 0, 54, 55, 286, 0, + 374, 375, 0, 56, 0, 288, 376, 475, 377, 378, + 379, 380, 381, 382, 0, 0, 374, 375, 0, 0, + 0, 289, 290, 0, 291, 0, 292, 0, 57, 58, + 59, 60, 293, 287, 61, 374, 375, 0, 0, 62, + 0, 0, 0, 0, 288, 0, 63, 0, 64, 0, + 0, 0, 0, 65, 66, 0, 0, 287, 0, 0, + 289, 290, 0, 291, 0, 292, 0, 0, 288, 0, + 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 289, 290, 0, 486, 0, 292, + 0, 0, 0, 0, 0, 293, 0, 376, 0, 377, + 378, 379, 380, 381, 382, 0, 0, 0, 0, 0, + 0, 376, 398, 377, 378, 379, 380, 381, 382, 0, + 0, 0, 0, 0, 0, 376, 405, 377, 378, 379, + 380, 381, 382, 43, 0, 0, 0, 0, 0, 0, + 443, 376, 504, 377, 378, 379, 380, 381, 382, 44, + 0, 45, 0, 0, 0, 0, 0, 46, 0, 0, + 376, 47, 377, 378, 379, 380, 381, 382, 4, 0, + 0, 5, 0, 0, 48, 0, 6, 0, 49, 50, + 0, 0, 7, 0, 51, 0, 52, 0, 8, 0, + 0, 9, 4, 53, 0, 5, 0, 5, 0, 0, + 6, 0, 6, 0, 54, 55, 7, 0, 5, 10, + 235, 56, 8, 6, 8, 9, 11, 9, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, 9, 0, + 0, 0, 0, 10, 0, 10, 57, 58, 59, 60, + 11, 0, 61, 0, 0, 0, 10, 62, 5, 0, + 0, 0, 0, 6, 63, 0, 64, 12, 0, 0, + 0, 65, 66, 13, 14, 8, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 375, 0, 376, 377, 378, 379, 380, 381, 0, - 0, 0, 0, 0, 0, 0, 442, 375, 503, 376, - 377, 378, 379, 380, 381, 375, 43, 376, 377, 378, - 379, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 45, 0, 0, 0, 0, 0, - 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 5, 0, 0, 48, 0, 6, - 0, 49, 50, 0, 0, 7, 0, 51, 0, 52, - 0, 8, 0, 0, 9, 4, 53, 0, 5, 0, - 5, 0, 0, 6, 0, 6, 0, 54, 55, 7, - 0, 5, 10, 234, 56, 8, 6, 8, 9, 11, - 9, 0, 0, 0, 0, 0, 0, 0, 8, 0, - 0, 9, 0, 0, 0, 0, 10, 0, 10, 57, - 58, 59, 60, 11, 0, 61, 0, 0, 0, 10, - 62, 0, 0, 0, 0, 0, 0, 63, 0, 64, - 12, 0, 0, 0, 65, 66, 13, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, - 13, 14, 13, 14, 0, 243, 15, 12, 0, 0, - 0, 0, 0, 13, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 422, 15, 87, 0, 88, 89, 0, 90, 91, - 0, 0, 479, 15, 92, 0, 93, 0, 0, 0, - 0, 0, 0, 94, 95, 96, 97, 0, 98, 99, - 100, 101, 102, 0, 103, 0, 104, 105, 106, 0, - 0, 107, 0, 0, 0, 0, 108, 0, 109, 110, - 111, 112, 113, 114, 0, 115, 116, 117, 118, 119, - 0, 0, 120, 0, 121, 0, 0, 0, 0, 122, - 0, 123, 0, 0, 0, 124, 125, 126, 127, 128, - 129, 130, 131, 0, 132, 0, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 0, 0, 0, - 0, 144, 0, 0, 145, 0, 146, 147, 0, 0, - 148, 149, 150, 0, 0, 0, 151, 0, 152, 153, - 154, 155, 0, 0, 156 + 0, 12, 0, 12, 0, 0, 10, 13, 14, 13, + 14, 0, 244, 15, 12, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, 343, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, + 15, 0, 0, 0, 12, 0, 0, 0, 0, 0, + 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 87, 0, 88, 89, 0, 90, 91, 0, 92, + 0, 0, 93, 0, 94, 0, 0, 0, 0, 480, + 15, 95, 96, 97, 98, 0, 99, 100, 101, 102, + 103, 0, 104, 0, 105, 106, 107, 0, 0, 108, + 0, 0, 0, 0, 109, 0, 110, 111, 112, 113, + 114, 115, 0, 116, 117, 118, 119, 120, 0, 0, + 121, 0, 122, 0, 0, 0, 0, 123, 0, 124, + 0, 0, 0, 125, 126, 127, 128, 129, 130, 131, + 132, 0, 133, 0, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 0, 0, 0, 0, 145, + 0, 0, 146, 0, 147, 148, 0, 0, 149, 150, + 151, 0, 0, 0, 152, 0, 153, 154, 155, 156, + 0, 0, 157 }; static const short int yycheck[] = { - 2, 13, 5, 2, 71, 2, 2, 22, 2, 243, - 11, 12, 254, 231, 399, 219, 43, 221, 11, 12, - 224, 225, 2, 135, 135, 83, 119, 250, 266, 119, - 0, 99, 270, 271, 272, 103, 26, 135, 10, 501, - 151, 503, 209, 155, 47, 212, 213, 135, 38, 216, - 77, 218, 29, 151, 77, 278, 223, 29, 126, 152, - 32, 12, 152, 14, 150, 37, 43, 155, 32, 2, - 469, 43, 95, 11, 12, 135, 79, 49, 149, 8, - 52, 84, 481, 154, 288, 289, 290, 291, 292, 22, - 257, 151, 477, 154, 3, 4, 154, 331, 70, 71, - 77, 135, 149, 80, 135, 77, 149, 84, 342, 327, - 149, 62, 63, 149, 153, 154, 149, 151, 27, 149, - 151, 149, 59, 32, 362, 153, 154, 64, 56, 149, - 58, 3, 4, 200, 201, 3, 4, 3, 4, 152, - 207, 142, 143, 3, 4, 54, 118, 140, 141, 142, - 143, 149, 124, 125, 3, 4, 3, 4, 160, 161, - 175, 160, 161, 153, 160, 161, 160, 161, 152, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 416, 421, - 160, 161, 154, 350, 93, 137, 424, 190, 422, 11, - 12, 3, 4, 3, 4, 399, 3, 4, 3, 4, - 438, 139, 140, 141, 142, 143, 115, 8, 9, 153, - 154, 153, 154, 152, 3, 382, 5, 6, 7, 11, - 12, 75, 149, 226, 227, 459, 149, 230, 149, 8, - 468, 150, 152, 142, 149, 402, 248, 150, 250, 443, - 152, 150, 150, 150, 150, 479, 150, 150, 150, 150, - 11, 12, 264, 150, 150, 150, 255, 150, 150, 255, - 150, 255, 264, 150, 53, 150, 278, 279, 150, 150, - 474, 150, 150, 477, 150, 150, 150, 279, 3, 150, - 8, 485, 349, 152, 8, 152, 156, 152, 492, 292, - 494, 8, 151, 150, 3, 499, 5, 6, 7, 8, - 8, 8, 57, 5, 154, 150, 3, 149, 5, 6, - 7, 8, 137, 149, 136, 152, 138, 139, 140, 141, - 142, 143, 151, 112, 135, 153, 156, 150, 3, 151, - 151, 135, 150, 157, 123, 332, 151, 151, 151, 135, - 8, 344, 341, 151, 53, 341, 4, 341, 151, 151, - 139, 140, 151, 142, 353, 144, 53, 151, 361, 361, - 151, 150, 20, 366, 22, 151, 155, 151, 151, 151, - 28, 151, 137, 440, 32, 136, 151, 138, 139, 140, - 141, 142, 143, 151, 32, 151, 149, 45, 70, 37, - 151, 49, 50, 153, 151, 149, 149, 55, 149, 57, - 8, 49, 151, 112, 52, 151, 64, 151, 5, 151, - 149, 149, 135, 154, 123, 112, 151, 75, 76, 151, - 151, 154, 70, 152, 82, 137, 123, 20, 2, 340, - 139, 140, 467, 142, 437, 144, 224, 206, 338, 349, - 2, 150, 139, 140, 22, 142, 2, 144, 2, 107, - 108, 109, 110, 150, -1, 113, -1, -1, 222, -1, - 118, -1, 4, 462, 467, 467, 462, 125, 462, 127, - 118, -1, -1, -1, 132, 133, 124, 125, 20, -1, - 22, -1, -1, -1, -1, -1, 28, -1, -1, 501, - 32, 503, 11, 12, -1, -1, 154, -1, -1, 501, - -1, 503, -1, 45, -1, 153, 154, 49, 50, -1, - -1, -1, -1, 55, -1, 57, -1, -1, -1, -1, - -1, -1, 64, -1, -1, -1, -1, 3, 4, 5, - 6, 7, -1, 75, 76, -1, -1, -1, -1, 3, - 82, 5, 6, 7, 20, -1, 22, -1, -1, -1, - -1, 3, 28, 5, 6, 7, 32, -1, -1, -1, - 28, -1, -1, -1, -1, 107, 108, 109, 110, 45, - -1, 113, -1, 49, 50, -1, 118, 53, -1, 55, - -1, 57, -1, 125, -1, 127, 11, 12, 64, 53, - 132, 133, -1, -1, -1, -1, 64, -1, -1, 75, - 76, 53, 11, 12, -1, -1, 82, 75, 76, -1, - 11, 12, 154, -1, 82, -1, -1, 136, 137, 138, + 2, 13, 5, 2, 71, 2, 2, 244, 2, 119, + 210, 11, 12, 213, 214, 255, 220, 217, 222, 219, + 26, 225, 226, 232, 224, 2, 251, 22, 83, 267, + 400, 119, 38, 271, 272, 273, 43, 135, 77, 8, + 9, 135, 152, 28, 47, 29, 2, 0, 502, 135, + 504, 99, 135, 135, 279, 103, 95, 155, 258, 43, + 12, 155, 14, 150, 152, 151, 22, 32, 151, 151, + 77, 3, 149, 5, 6, 7, 79, 154, 126, 64, + 3, 84, 5, 6, 7, 289, 290, 291, 292, 293, + 75, 76, 56, 77, 58, 332, 80, 82, 135, 154, + 84, 154, 3, 4, 11, 12, 343, 149, 478, 8, + 62, 63, 470, 135, 151, 59, 11, 12, 149, 328, + 64, 53, 149, 108, 482, 363, 27, 152, 113, 151, + 53, 32, 149, 149, 201, 202, 153, 154, 3, 4, + 149, 208, 142, 143, 153, 154, 75, 153, 3, 4, + 137, 351, 150, 54, 3, 4, 3, 4, 149, 161, + 162, 150, 161, 162, 152, 161, 162, 161, 162, 149, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 417, + 112, 176, 422, 383, 161, 162, 423, 425, 191, 112, + 149, 123, 93, 3, 4, 152, 400, 3, 4, 149, + 123, 439, 149, 403, 3, 4, 149, 139, 140, 149, + 142, 8, 144, 152, 115, 152, 139, 140, 150, 142, + 150, 144, 150, 460, 227, 228, 150, 150, 231, 3, + 4, 469, 155, 140, 141, 142, 143, 249, 150, 251, + 444, 142, 150, 480, 139, 140, 141, 142, 143, 150, + 3, 4, 150, 265, 3, 4, 150, 256, 150, 150, + 256, 3, 256, 265, 153, 154, 152, 279, 280, 153, + 154, 475, 11, 12, 478, 150, 150, 150, 280, 4, + 150, 150, 486, 350, 150, 152, 150, 150, 150, 493, + 293, 495, 150, 150, 150, 20, 500, 22, 150, 150, + 8, 8, 152, 28, 8, 151, 3, 32, 5, 6, + 7, 8, 156, 150, 8, 8, 57, 5, 154, 150, + 45, 149, 137, 149, 49, 50, 153, 152, 151, 150, + 55, 135, 57, 135, 156, 151, 333, 150, 3, 64, + 151, 135, 345, 342, 151, 157, 342, 8, 342, 149, + 75, 76, 153, 151, 70, 354, 53, 82, 151, 362, + 362, 151, 151, 151, 367, 151, 151, 151, 151, 151, + 151, 151, 10, 151, 441, 151, 151, 137, 149, 149, + 149, 8, 107, 108, 109, 110, 151, 151, 113, 151, + 151, 29, 5, 118, 32, 151, 151, 149, 149, 37, + 125, 135, 127, 4, 151, 43, 151, 132, 133, 152, + 154, 49, 20, 137, 52, 112, 154, 2, 468, 20, + 341, 22, 225, 350, 339, 2, 123, 28, 207, 154, + 22, 32, 70, 71, 2, 438, 2, -1, -1, 77, + -1, -1, 139, 140, 45, 142, 223, 144, 49, 50, + -1, 11, 12, 150, 55, 3, 57, 5, 6, 7, + 8, -1, -1, 64, 463, 468, 468, 463, -1, 463, + -1, -1, -1, -1, 75, 76, -1, -1, -1, -1, + 118, 82, -1, -1, -1, -1, 124, 125, -1, -1, + 502, -1, 504, -1, 3, 4, 5, 6, 7, -1, + 502, -1, 504, -1, -1, 53, 107, 108, 109, 110, + -1, 20, 113, 22, -1, -1, 154, 118, 3, 28, + 5, 6, 7, 32, 125, -1, 127, -1, -1, -1, + -1, 132, 133, -1, -1, -1, 45, -1, -1, -1, + 49, 50, 11, 12, 53, -1, 55, -1, 57, -1, + -1, -1, -1, 154, -1, 64, 11, 12, -1, -1, + -1, -1, -1, -1, 112, -1, 75, 76, 53, -1, + 11, 12, -1, 82, -1, 123, 136, 137, 138, 139, + 140, 141, 142, 143, -1, -1, 11, 12, -1, -1, + -1, 139, 140, -1, 142, -1, 144, -1, 107, 108, + 109, 110, 150, 112, 113, 11, 12, -1, -1, 118, + -1, -1, -1, -1, 123, -1, 125, -1, 127, -1, + -1, -1, -1, 132, 133, -1, -1, 112, -1, -1, + 139, 140, -1, 142, -1, 144, -1, -1, 123, -1, + -1, 150, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 139, 140, -1, 142, -1, 144, + -1, -1, -1, -1, -1, 150, -1, 136, -1, 138, 139, 140, 141, 142, 143, -1, -1, -1, -1, -1, - -1, 107, 108, 109, 110, -1, 112, 113, -1, -1, - 108, -1, 118, -1, -1, 113, -1, 123, 112, 125, - -1, 127, -1, -1, -1, -1, 132, 133, -1, 123, - 112, -1, -1, 139, 140, -1, 142, -1, 144, -1, - -1, 123, -1, -1, 150, 139, 140, -1, 142, -1, - 144, -1, -1, -1, -1, -1, 150, 139, 140, -1, - 142, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 136, 151, 138, 139, 140, 141, 142, 143, -1, + -1, -1, -1, -1, -1, 136, 151, 138, 139, 140, + 141, 142, 143, 4, -1, -1, -1, -1, -1, -1, + 151, 136, 137, 138, 139, 140, 141, 142, 143, 20, + -1, 22, -1, -1, -1, -1, -1, 28, -1, -1, + 136, 32, 138, 139, 140, 141, 142, 143, 29, -1, + -1, 32, -1, -1, 45, -1, 37, -1, 49, 50, + -1, -1, 43, -1, 55, -1, 57, -1, 49, -1, + -1, 52, 29, 64, -1, 32, -1, 32, -1, -1, + 37, -1, 37, -1, 75, 76, 43, -1, 32, 70, + 71, 82, 49, 37, 49, 52, 77, 52, -1, -1, + -1, -1, -1, -1, -1, 49, -1, -1, 52, -1, + -1, -1, -1, 70, -1, 70, 107, 108, 109, 110, + 77, -1, 113, -1, -1, -1, 70, 118, 32, -1, + -1, -1, -1, 37, 125, -1, 127, 118, -1, -1, + -1, 132, 133, 124, 125, 49, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 136, -1, 138, 139, 140, 141, 142, 143, -1, - -1, -1, -1, -1, -1, -1, 151, 136, 137, 138, - 139, 140, 141, 142, 143, 136, 4, 138, 139, 140, - 141, 142, 143, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 20, -1, 22, -1, -1, -1, -1, -1, - 28, -1, -1, -1, 32, -1, -1, -1, -1, -1, - -1, 29, -1, -1, 32, -1, -1, 45, -1, 37, - -1, 49, 50, -1, -1, 43, -1, 55, -1, 57, - -1, 49, -1, -1, 52, 29, 64, -1, 32, -1, - 32, -1, -1, 37, -1, 37, -1, 75, 76, 43, - -1, 32, 70, 71, 82, 49, 37, 49, 52, 77, - 52, -1, -1, -1, -1, -1, -1, -1, 49, -1, - -1, 52, -1, -1, -1, -1, 70, -1, 70, 107, - 108, 109, 110, 77, -1, 113, -1, -1, -1, 70, - 118, -1, -1, -1, -1, -1, -1, 125, -1, 127, - 118, -1, -1, -1, 132, 133, 124, 125, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 118, -1, 118, -1, -1, -1, - 124, 125, 124, 125, -1, 153, 154, 118, -1, -1, - -1, -1, -1, 124, 125, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 154, 153, 154, 13, -1, 15, 16, -1, 18, 19, - -1, -1, 153, 154, 24, -1, 26, -1, -1, -1, - -1, -1, -1, 33, 34, 35, 36, -1, 38, 39, - 40, 41, 42, -1, 44, -1, 46, 47, 48, -1, - -1, 51, -1, -1, -1, -1, 56, -1, 58, 59, - 60, 61, 62, 63, -1, 65, 66, 67, 68, 69, - -1, -1, 72, -1, 74, -1, -1, -1, -1, 79, - -1, 81, -1, -1, -1, 85, 86, 87, 88, 89, - 90, 91, 92, -1, 94, -1, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, -1, -1, -1, - -1, 111, -1, -1, 114, -1, 116, 117, -1, -1, - 120, 121, 122, -1, -1, -1, 126, -1, 128, 129, - 130, 131, -1, -1, 134 + -1, 118, -1, 118, -1, -1, 70, 124, 125, 124, + 125, -1, 153, 154, 118, -1, -1, -1, -1, -1, + 124, 125, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 154, 153, 154, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 153, + 154, -1, -1, -1, 118, -1, -1, -1, -1, -1, + 124, 125, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 13, -1, 15, 16, -1, 18, 19, -1, 21, + -1, -1, 24, -1, 26, -1, -1, -1, -1, 153, + 154, 33, 34, 35, 36, -1, 38, 39, 40, 41, + 42, -1, 44, -1, 46, 47, 48, -1, -1, 51, + -1, -1, -1, -1, 56, -1, 58, 59, 60, 61, + 62, 63, -1, 65, 66, 67, 68, 69, -1, -1, + 72, -1, 74, -1, -1, -1, -1, 79, -1, 81, + -1, -1, -1, 85, 86, 87, 88, 89, 90, 91, + 92, -1, 94, -1, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, -1, -1, -1, -1, 111, + -1, -1, 114, -1, 116, 117, -1, -1, 120, 121, + 122, -1, -1, -1, 126, -1, 128, 129, 130, 131, + -1, -1, 134 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1432,48 +1444,48 @@ static const unsigned char yystos[] = 110, 113, 118, 125, 127, 132, 133, 191, 205, 207, 231, 232, 234, 150, 3, 4, 3, 4, 203, 32, 8, 3, 4, 203, 178, 179, 203, 13, 15, 16, - 18, 19, 24, 26, 33, 34, 35, 36, 38, 39, - 40, 41, 42, 44, 46, 47, 48, 51, 56, 58, - 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, - 72, 74, 79, 81, 85, 86, 87, 88, 89, 90, - 91, 92, 94, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 111, 114, 116, 117, 120, 121, - 122, 126, 128, 129, 130, 131, 134, 180, 182, 230, - 161, 161, 80, 84, 169, 208, 213, 219, 223, 149, - 149, 149, 149, 152, 149, 152, 149, 163, 149, 137, - 218, 152, 149, 149, 149, 232, 3, 75, 206, 206, - 150, 206, 207, 3, 3, 207, 3, 4, 204, 8, - 152, 232, 149, 152, 232, 119, 152, 150, 150, 150, + 18, 19, 21, 24, 26, 33, 34, 35, 36, 38, + 39, 40, 41, 42, 44, 46, 47, 48, 51, 56, + 58, 59, 60, 61, 62, 63, 65, 66, 67, 68, + 69, 72, 74, 79, 81, 85, 86, 87, 88, 89, + 90, 91, 92, 94, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 111, 114, 116, 117, 120, + 121, 122, 126, 128, 129, 130, 131, 134, 180, 182, + 230, 161, 161, 80, 84, 169, 208, 213, 219, 223, + 149, 149, 149, 149, 152, 149, 152, 149, 163, 149, + 137, 218, 152, 149, 149, 149, 232, 3, 75, 206, + 206, 150, 206, 207, 3, 3, 207, 3, 4, 204, + 8, 152, 232, 149, 152, 232, 119, 152, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 135, 155, 10, 71, 164, 168, 171, 208, 210, - 221, 222, 225, 153, 3, 3, 4, 152, 211, 95, - 215, 219, 3, 4, 152, 162, 232, 156, 151, 188, - 189, 190, 204, 204, 198, 27, 32, 54, 93, 115, - 142, 150, 184, 204, 226, 227, 228, 229, 150, 198, - 204, 3, 5, 6, 7, 53, 112, 123, 139, 140, - 142, 144, 150, 194, 195, 196, 8, 196, 8, 8, - 181, 8, 196, 196, 8, 8, 196, 8, 196, 194, - 57, 192, 193, 194, 230, 196, 192, 194, 232, 232, - 8, 9, 183, 5, 235, 232, 182, 154, 150, 149, - 163, 153, 178, 212, 137, 83, 178, 200, 216, 149, - 152, 162, 153, 164, 178, 201, 151, 196, 153, 135, - 156, 149, 153, 178, 179, 199, 200, 226, 226, 226, - 226, 150, 135, 200, 153, 151, 150, 194, 194, 194, - 194, 194, 232, 11, 12, 136, 138, 139, 140, 141, - 142, 143, 135, 151, 151, 151, 151, 135, 151, 151, - 151, 151, 151, 151, 151, 151, 151, 151, 3, 135, - 151, 151, 135, 151, 151, 151, 151, 151, 157, 151, - 151, 182, 8, 163, 222, 137, 232, 149, 153, 201, - 153, 167, 153, 163, 232, 149, 190, 196, 234, 149, - 149, 151, 132, 172, 173, 174, 175, 179, 232, 226, - 151, 232, 151, 151, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 196, 8, 151, 193, 196, 5, 151, - 226, 149, 162, 163, 226, 149, 151, 135, 232, 226, - 202, 204, 151, 194, 137, 151, 163, 154, 176, 153, - 175, 226, 176, 152, 194, 142, 177, 193, 163, 176, - 185, 155, 135, 155, 26, 38, 153, 186, 194, 154, - 194, 137, 194, 137, 199, 199 + 150, 150, 135, 155, 10, 71, 164, 168, 171, 208, + 210, 221, 222, 225, 153, 3, 3, 4, 152, 211, + 95, 215, 219, 3, 4, 152, 162, 232, 156, 151, + 188, 189, 190, 204, 204, 198, 27, 32, 54, 93, + 115, 142, 150, 184, 204, 226, 227, 228, 229, 150, + 198, 204, 3, 5, 6, 7, 53, 112, 123, 139, + 140, 142, 144, 150, 194, 195, 196, 8, 196, 8, + 8, 181, 8, 196, 196, 8, 8, 196, 8, 196, + 194, 57, 192, 193, 194, 230, 196, 192, 194, 232, + 232, 8, 9, 183, 5, 235, 232, 182, 154, 150, + 149, 163, 153, 178, 212, 137, 83, 178, 200, 216, + 149, 152, 162, 153, 164, 178, 201, 151, 196, 153, + 135, 156, 149, 153, 178, 179, 199, 200, 226, 226, + 226, 226, 150, 135, 200, 153, 151, 150, 194, 194, + 194, 194, 194, 232, 11, 12, 136, 138, 139, 140, + 141, 142, 143, 135, 151, 151, 151, 151, 135, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 3, + 135, 151, 151, 135, 151, 151, 151, 151, 151, 157, + 151, 151, 182, 8, 163, 222, 137, 232, 149, 153, + 201, 153, 167, 153, 163, 232, 149, 190, 196, 234, + 149, 149, 151, 132, 172, 173, 174, 175, 179, 232, + 226, 151, 232, 151, 151, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 196, 8, 151, 193, 196, 5, + 151, 226, 149, 162, 163, 226, 149, 151, 135, 232, + 226, 202, 204, 151, 194, 137, 151, 163, 154, 176, + 153, 175, 226, 176, 152, 194, 142, 177, 193, 163, + 176, 185, 155, 135, 155, 26, 38, 153, 186, 194, + 154, 194, 137, 194, 137, 199, 199 }; #define yyerrok (yyerrstatus = 0) @@ -2143,7 +2155,7 @@ yyreduce: switch (yyn) { case 2: -#line 292 "parser.y" +#line 304 "parser.y" { fix_incomplete(); check_all_user_types((yyvsp[0].ifref_list)); write_proxies((yyvsp[0].ifref_list)); @@ -2154,22 +2166,22 @@ yyreduce: break; case 3: -#line 301 "parser.y" +#line 313 "parser.y" { (yyval.ifref_list) = NULL; ;} break; case 4: -#line 302 "parser.y" +#line 314 "parser.y" { (yyval.ifref_list) = (yyvsp[-1].ifref_list); ;} break; case 5: -#line 303 "parser.y" +#line 315 "parser.y" { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), make_ifref((yyvsp[0].type)) ); ;} break; case 6: -#line 304 "parser.y" +#line 316 "parser.y" { (yyval.ifref_list) = (yyvsp[-2].ifref_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, 0); if (!parse_only && do_header) write_coclass_forward((yyvsp[-1].type)); @@ -2177,7 +2189,7 @@ yyreduce: break; case 7: -#line 308 "parser.y" +#line 320 "parser.y" { (yyval.ifref_list) = (yyvsp[-1].ifref_list); add_typelib_entry((yyvsp[0].type)); reg_type((yyvsp[0].type), (yyvsp[0].type)->name, 0); @@ -2186,42 +2198,42 @@ yyreduce: break; case 8: -#line 313 "parser.y" +#line 325 "parser.y" { (yyval.ifref_list) = (yyvsp[-1].ifref_list); add_typelib_entry((yyvsp[0].type)); ;} break; case 9: -#line 314 "parser.y" +#line 326 "parser.y" { (yyval.ifref_list) = (yyvsp[-1].ifref_list); ;} break; case 10: -#line 315 "parser.y" +#line 327 "parser.y" { (yyval.ifref_list) = (yyvsp[-1].ifref_list); ;} break; case 11: -#line 318 "parser.y" +#line 330 "parser.y" {;} break; case 12: -#line 319 "parser.y" +#line 331 "parser.y" { if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;} break; case 13: -#line 320 "parser.y" +#line 332 "parser.y" { if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;} break; case 14: -#line 321 "parser.y" +#line 333 "parser.y" { reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, 0); if (!parse_only && do_header) write_coclass_forward((yyvsp[-1].type)); ;} break; case 15: -#line 322 "parser.y" +#line 334 "parser.y" { if (!parse_only) add_typelib_entry((yyvsp[0].type)); reg_type((yyvsp[0].type), (yyvsp[0].type)->name, 0); if (!parse_only && do_header) write_coclass_forward((yyvsp[0].type)); @@ -2229,52 +2241,52 @@ yyreduce: break; case 16: -#line 326 "parser.y" +#line 338 "parser.y" { if (!parse_only) add_typelib_entry((yyvsp[0].type)); ;} break; case 17: -#line 327 "parser.y" +#line 339 "parser.y" {;} break; case 18: -#line 328 "parser.y" +#line 340 "parser.y" {;} break; case 19: -#line 329 "parser.y" +#line 341 "parser.y" {;} break; case 20: -#line 332 "parser.y" +#line 344 "parser.y" { (yyval.func_list) = NULL; ;} break; case 21: -#line 333 "parser.y" +#line 345 "parser.y" { (yyval.func_list) = append_func( (yyvsp[-2].func_list), (yyvsp[-1].func) ); ;} break; case 22: -#line 334 "parser.y" +#line 346 "parser.y" { (yyval.func_list) = (yyvsp[-1].func_list); ;} break; case 25: -#line 341 "parser.y" +#line 353 "parser.y" { if (!parse_only && do_header) { write_constdef((yyvsp[-1].var)); } ;} break; case 26: -#line 342 "parser.y" +#line 354 "parser.y" {;} break; case 27: -#line 343 "parser.y" +#line 355 "parser.y" { if (!parse_only && do_header) { write_type_def_or_decl(header, (yyvsp[-1].type), FALSE, NULL); fprintf(header, ";\n\n"); @@ -2283,17 +2295,17 @@ yyreduce: break; case 28: -#line 348 "parser.y" +#line 360 "parser.y" { if (!parse_only && do_header) { write_externdef((yyvsp[-1].var)); } ;} break; case 29: -#line 349 "parser.y" +#line 361 "parser.y" {;} break; case 30: -#line 350 "parser.y" +#line 362 "parser.y" { if (!parse_only && do_header) { write_type_def_or_decl(header, (yyvsp[-1].type), FALSE, NULL); fprintf(header, ";\n\n"); @@ -2302,12 +2314,12 @@ yyreduce: break; case 31: -#line 355 "parser.y" +#line 367 "parser.y" {;} break; case 32: -#line 356 "parser.y" +#line 368 "parser.y" { if (!parse_only && do_header) { write_type_def_or_decl(header, (yyvsp[-1].type), FALSE, NULL); fprintf(header, ";\n\n"); @@ -2316,12 +2328,12 @@ yyreduce: break; case 33: -#line 363 "parser.y" +#line 375 "parser.y" { if (!parse_only && do_header) fprintf(header, "%s\n", (yyvsp[-1].str)); ;} break; case 34: -#line 365 "parser.y" +#line 377 "parser.y" { assert(yychar == YYEMPTY); (yyval.num) = do_import((yyvsp[-1].str)); if (!(yyval.num)) yychar = aEOF; @@ -2329,55 +2341,57 @@ yyreduce: break; case 35: -#line 372 "parser.y" +#line 384 "parser.y" { if ((yyvsp[-2].num)) pop_import(); ;} break; case 36: -#line 376 "parser.y" +#line 388 "parser.y" { if(!parse_only) add_importlib((yyvsp[-2].str)); ;} break; case 37: -#line 379 "parser.y" +#line 391 "parser.y" { (yyval.str) = (yyvsp[0].str); ;} break; case 38: -#line 381 "parser.y" - { if (!parse_only) start_typelib((yyvsp[-1].str), (yyvsp[-2].attr_list)); +#line 393 "parser.y" + { check_library_attrs((yyvsp[-1].str), (yyvsp[-2].attr_list)); + if (!parse_only) start_typelib((yyvsp[-1].str), (yyvsp[-2].attr_list)); if (!parse_only && do_header) write_library((yyvsp[-1].str), (yyvsp[-2].attr_list)); if (!parse_only && do_idfile) write_libid((yyvsp[-1].str), (yyvsp[-2].attr_list)); + is_inside_library = TRUE; ;} break; case 39: -#line 387 "parser.y" - { if (!parse_only) end_typelib(); ;} +#line 401 "parser.y" + { if (!parse_only) end_typelib(); is_inside_library = FALSE; ;} break; case 40: -#line 390 "parser.y" +#line 404 "parser.y" { (yyval.var_list) = NULL; ;} break; case 42: -#line 394 "parser.y" +#line 408 "parser.y" { (yyval.var_list) = NULL; ;} break; case 43: -#line 397 "parser.y" +#line 411 "parser.y" { check_arg((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); ;} break; case 44: -#line 398 "parser.y" +#line 412 "parser.y" { check_arg((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var)); ;} break; case 46: -#line 403 "parser.y" +#line 417 "parser.y" { (yyval.var) = (yyvsp[-1].pident)->var; (yyval.var)->attrs = (yyvsp[-3].attr_list); set_type((yyval.var), (yyvsp[-2].type), (yyvsp[-1].pident), (yyvsp[0].array_dims), TRUE); @@ -2386,7 +2400,7 @@ yyreduce: break; case 47: -#line 408 "parser.y" +#line 422 "parser.y" { (yyval.var) = (yyvsp[-1].pident)->var; set_type((yyval.var), (yyvsp[-2].type), (yyvsp[-1].pident), (yyvsp[0].array_dims), TRUE); free((yyvsp[-1].pident)); @@ -2394,42 +2408,42 @@ yyreduce: break; case 48: -#line 414 "parser.y" +#line 428 "parser.y" { (yyval.array_dims) = NULL; ;} break; case 49: -#line 415 "parser.y" +#line 429 "parser.y" { (yyval.array_dims) = (yyvsp[-1].array_dims); ;} break; case 50: -#line 416 "parser.y" +#line 430 "parser.y" { (yyval.array_dims) = append_array( NULL, make_expr(EXPR_VOID) ); ;} break; case 51: -#line 419 "parser.y" +#line 433 "parser.y" { (yyval.array_dims) = append_array( NULL, (yyvsp[0].expr) ); ;} break; case 52: -#line 420 "parser.y" +#line 434 "parser.y" { (yyval.array_dims) = append_array( (yyvsp[-2].array_dims), (yyvsp[0].expr) ); ;} break; case 53: -#line 421 "parser.y" +#line 435 "parser.y" { (yyval.array_dims) = append_array( (yyvsp[-3].array_dims), (yyvsp[0].expr) ); ;} break; case 54: -#line 424 "parser.y" +#line 438 "parser.y" { (yyval.attr_list) = NULL; ;} break; case 56: -#line 429 "parser.y" +#line 443 "parser.y" { (yyval.attr_list) = (yyvsp[-1].attr_list); if (!(yyval.attr_list)) error_loc("empty attribute lists unsupported\n"); @@ -2437,468 +2451,473 @@ yyreduce: break; case 57: -#line 435 "parser.y" +#line 449 "parser.y" { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); ;} break; case 58: -#line 436 "parser.y" +#line 450 "parser.y" { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); ;} break; case 59: -#line 437 "parser.y" +#line 451 "parser.y" { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); ;} break; case 60: -#line 440 "parser.y" +#line 454 "parser.y" { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); ;} break; case 61: -#line 441 "parser.y" +#line 455 "parser.y" { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); ;} break; case 62: -#line 444 "parser.y" +#line 458 "parser.y" { (yyval.attr) = NULL; ;} break; case 63: -#line 445 "parser.y" +#line 459 "parser.y" { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); ;} break; case 64: -#line 446 "parser.y" +#line 460 "parser.y" { (yyval.attr) = make_attr(ATTR_APPOBJECT); ;} break; case 65: -#line 447 "parser.y" +#line 461 "parser.y" { (yyval.attr) = make_attr(ATTR_ASYNC); ;} break; case 66: -#line 448 "parser.y" +#line 462 "parser.y" { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); ;} break; case 67: -#line 449 "parser.y" +#line 463 "parser.y" { (yyval.attr) = make_attr(ATTR_BINDABLE); ;} break; case 68: -#line 450 "parser.y" - { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); ;} +#line 464 "parser.y" + { (yyval.attr) = make_attr(ATTR_BROADCAST); ;} break; case 69: -#line 451 "parser.y" - { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); ;} +#line 465 "parser.y" + { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); ;} break; case 70: -#line 452 "parser.y" - { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); ;} +#line 466 "parser.y" + { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); ;} break; case 71: -#line 453 "parser.y" - { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ ;} +#line 467 "parser.y" + { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); ;} break; case 72: -#line 454 "parser.y" - { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ ;} +#line 468 "parser.y" + { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ ;} break; case 73: -#line 455 "parser.y" - { (yyval.attr) = make_attr(ATTR_CONTROL); ;} +#line 469 "parser.y" + { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ ;} break; case 74: -#line 456 "parser.y" - { (yyval.attr) = make_attr(ATTR_DEFAULT); ;} +#line 470 "parser.y" + { (yyval.attr) = make_attr(ATTR_CONTROL); ;} break; case 75: -#line 457 "parser.y" - { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); ;} +#line 471 "parser.y" + { (yyval.attr) = make_attr(ATTR_DEFAULT); ;} break; case 76: -#line 458 "parser.y" - { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE_EXPR, (yyvsp[-1].expr)); ;} +#line 472 "parser.y" + { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); ;} break; case 77: -#line 459 "parser.y" - { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE_STRING, (yyvsp[-1].str)); ;} +#line 473 "parser.y" + { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE_EXPR, (yyvsp[-1].expr)); ;} break; case 78: -#line 460 "parser.y" - { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); ;} +#line 474 "parser.y" + { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE_STRING, (yyvsp[-1].str)); ;} break; case 79: -#line 461 "parser.y" - { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); ;} +#line 475 "parser.y" + { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); ;} break; case 80: -#line 462 "parser.y" - { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); ;} +#line 476 "parser.y" + { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); ;} break; case 81: -#line 463 "parser.y" - { (yyval.attr) = make_attr(ATTR_DUAL); ;} +#line 477 "parser.y" + { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); ;} break; case 82: -#line 464 "parser.y" - { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); ;} +#line 478 "parser.y" + { (yyval.attr) = make_attr(ATTR_DUAL); ;} break; case 83: -#line 465 "parser.y" - { (yyval.attr) = make_attrp(ATTR_ENTRY_STRING, (yyvsp[-1].str)); ;} +#line 479 "parser.y" + { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); ;} break; case 84: -#line 466 "parser.y" - { (yyval.attr) = make_attrp(ATTR_ENTRY_ORDINAL, (yyvsp[-1].expr)); ;} +#line 480 "parser.y" + { (yyval.attr) = make_attrp(ATTR_ENTRY_STRING, (yyvsp[-1].str)); ;} break; case 85: -#line 467 "parser.y" - { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); ;} +#line 481 "parser.y" + { (yyval.attr) = make_attrp(ATTR_ENTRY_ORDINAL, (yyvsp[-1].expr)); ;} break; case 86: -#line 468 "parser.y" - { (yyval.attr) = make_attr(ATTR_HANDLE); ;} +#line 482 "parser.y" + { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); ;} break; case 87: -#line 469 "parser.y" - { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); ;} +#line 483 "parser.y" + { (yyval.attr) = make_attr(ATTR_HANDLE); ;} break; case 88: -#line 470 "parser.y" - { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); ;} +#line 484 "parser.y" + { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); ;} break; case 89: -#line 471 "parser.y" - { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); ;} +#line 485 "parser.y" + { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); ;} break; case 90: -#line 472 "parser.y" - { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); ;} +#line 486 "parser.y" + { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); ;} break; case 91: -#line 473 "parser.y" - { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); ;} +#line 487 "parser.y" + { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); ;} break; case 92: -#line 474 "parser.y" - { (yyval.attr) = make_attr(ATTR_HIDDEN); ;} +#line 488 "parser.y" + { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); ;} break; case 93: -#line 475 "parser.y" - { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); ;} +#line 489 "parser.y" + { (yyval.attr) = make_attr(ATTR_HIDDEN); ;} break; case 94: -#line 476 "parser.y" - { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); ;} +#line 490 "parser.y" + { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); ;} break; case 95: -#line 477 "parser.y" - { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); ;} +#line 491 "parser.y" + { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); ;} break; case 96: -#line 478 "parser.y" - { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); ;} +#line 492 "parser.y" + { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); ;} break; case 97: -#line 479 "parser.y" - { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].str)); ;} +#line 493 "parser.y" + { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); ;} break; case 98: -#line 480 "parser.y" - { (yyval.attr) = make_attr(ATTR_IN); ;} +#line 494 "parser.y" + { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].str)); ;} break; case 99: -#line 481 "parser.y" - { (yyval.attr) = make_attr(ATTR_INPUTSYNC); ;} +#line 495 "parser.y" + { (yyval.attr) = make_attr(ATTR_IN); ;} break; case 100: -#line 482 "parser.y" - { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); ;} +#line 496 "parser.y" + { (yyval.attr) = make_attr(ATTR_INPUTSYNC); ;} break; case 101: -#line 483 "parser.y" - { (yyval.attr) = make_attr(ATTR_LOCAL); ;} +#line 497 "parser.y" + { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); ;} break; case 102: -#line 484 "parser.y" - { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); ;} +#line 498 "parser.y" + { (yyval.attr) = make_attr(ATTR_LOCAL); ;} break; case 103: -#line 485 "parser.y" - { (yyval.attr) = make_attr(ATTR_NONCREATABLE); ;} +#line 499 "parser.y" + { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); ;} break; case 104: -#line 486 "parser.y" - { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); ;} +#line 500 "parser.y" + { (yyval.attr) = make_attr(ATTR_NONCREATABLE); ;} break; case 105: -#line 487 "parser.y" - { (yyval.attr) = make_attr(ATTR_OBJECT); ;} +#line 501 "parser.y" + { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); ;} break; case 106: -#line 488 "parser.y" - { (yyval.attr) = make_attr(ATTR_ODL); ;} +#line 502 "parser.y" + { (yyval.attr) = make_attr(ATTR_OBJECT); ;} break; case 107: -#line 489 "parser.y" - { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); ;} +#line 503 "parser.y" + { (yyval.attr) = make_attr(ATTR_ODL); ;} break; case 108: -#line 490 "parser.y" - { (yyval.attr) = make_attr(ATTR_OPTIONAL); ;} +#line 504 "parser.y" + { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); ;} break; case 109: -#line 491 "parser.y" - { (yyval.attr) = make_attr(ATTR_OUT); ;} +#line 505 "parser.y" + { (yyval.attr) = make_attr(ATTR_OPTIONAL); ;} break; case 110: -#line 492 "parser.y" - { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); ;} +#line 506 "parser.y" + { (yyval.attr) = make_attr(ATTR_OUT); ;} break; case 111: -#line 493 "parser.y" - { (yyval.attr) = make_attr(ATTR_PROPGET); ;} +#line 507 "parser.y" + { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); ;} break; case 112: -#line 494 "parser.y" - { (yyval.attr) = make_attr(ATTR_PROPPUT); ;} +#line 508 "parser.y" + { (yyval.attr) = make_attr(ATTR_PROPGET); ;} break; case 113: -#line 495 "parser.y" - { (yyval.attr) = make_attr(ATTR_PROPPUTREF); ;} +#line 509 "parser.y" + { (yyval.attr) = make_attr(ATTR_PROPPUT); ;} break; case 114: -#line 496 "parser.y" - { (yyval.attr) = make_attr(ATTR_PUBLIC); ;} +#line 510 "parser.y" + { (yyval.attr) = make_attr(ATTR_PROPPUTREF); ;} break; case 115: -#line 497 "parser.y" +#line 511 "parser.y" + { (yyval.attr) = make_attr(ATTR_PUBLIC); ;} + break; + + case 116: +#line 512 "parser.y" { expr_list_t *list = append_expr( NULL, (yyvsp[-3].expr) ); list = append_expr( list, (yyvsp[-1].expr) ); (yyval.attr) = make_attrp(ATTR_RANGE, list); ;} break; - case 116: -#line 500 "parser.y" + case 117: +#line 515 "parser.y" { (yyval.attr) = make_attr(ATTR_READONLY); ;} break; - case 117: -#line 501 "parser.y" + case 118: +#line 516 "parser.y" { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); ;} break; - case 118: -#line 502 "parser.y" + case 119: +#line 517 "parser.y" { (yyval.attr) = make_attr(ATTR_RESTRICTED); ;} break; - case 119: -#line 503 "parser.y" + case 120: +#line 518 "parser.y" { (yyval.attr) = make_attr(ATTR_RETVAL); ;} break; - case 120: -#line 504 "parser.y" + case 121: +#line 519 "parser.y" { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); ;} break; - case 121: -#line 505 "parser.y" + case 122: +#line 520 "parser.y" { (yyval.attr) = make_attr(ATTR_SOURCE); ;} break; - case 122: -#line 506 "parser.y" + case 123: +#line 521 "parser.y" { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); ;} break; - case 123: -#line 507 "parser.y" + case 124: +#line 522 "parser.y" { (yyval.attr) = make_attr(ATTR_STRING); ;} break; - case 124: -#line 508 "parser.y" + case 125: +#line 523 "parser.y" { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); ;} break; - case 125: -#line 509 "parser.y" + case 126: +#line 524 "parser.y" { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); ;} break; - case 126: -#line 510 "parser.y" + case 127: +#line 525 "parser.y" { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); ;} break; - case 127: -#line 511 "parser.y" + case 128: +#line 526 "parser.y" { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); ;} break; - case 128: -#line 512 "parser.y" + case 129: +#line 527 "parser.y" { (yyval.attr) = make_attr(ATTR_V1ENUM); ;} break; - case 129: -#line 513 "parser.y" + case 130: +#line 528 "parser.y" { (yyval.attr) = make_attr(ATTR_VARARG); ;} break; - case 130: -#line 514 "parser.y" + case 131: +#line 529 "parser.y" { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); ;} break; - case 131: -#line 515 "parser.y" + case 132: +#line 530 "parser.y" { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); ;} break; - case 132: -#line 516 "parser.y" + case 133: +#line 531 "parser.y" { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); ;} break; - case 134: -#line 521 "parser.y" + case 135: +#line 536 "parser.y" { if (!is_valid_uuid((yyvsp[0].str))) error_loc("invalid UUID: %s\n", (yyvsp[0].str)); (yyval.uuid) = parse_uuid((yyvsp[0].str)); ;} break; - case 135: -#line 526 "parser.y" - { (yyval.str) = (yyvsp[0].str); ;} - break; - case 136: -#line 527 "parser.y" +#line 541 "parser.y" { (yyval.str) = (yyvsp[0].str); ;} break; case 137: -#line 528 "parser.y" +#line 542 "parser.y" { (yyval.str) = (yyvsp[0].str); ;} break; case 138: -#line 529 "parser.y" +#line 543 "parser.y" { (yyval.str) = (yyvsp[0].str); ;} break; case 139: -#line 532 "parser.y" - { (yyval.var_list) = NULL; ;} +#line 544 "parser.y" + { (yyval.str) = (yyvsp[0].str); ;} break; case 140: -#line 533 "parser.y" - { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); ;} +#line 547 "parser.y" + { (yyval.var_list) = NULL; ;} break; case 141: -#line 536 "parser.y" +#line 548 "parser.y" + { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); ;} + break; + + case 142: +#line 551 "parser.y" { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, (yyvsp[-2].expr) )); (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL); (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a ); ;} break; - case 142: -#line 540 "parser.y" + case 143: +#line 555 "parser.y" { attr_t *a = make_attr(ATTR_DEFAULT); (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL); (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a ); ;} break; - case 143: -#line 546 "parser.y" + case 144: +#line 561 "parser.y" { (yyval.var) = reg_const((yyvsp[-2].var)); set_type((yyval.var), (yyvsp[-3].type), NULL, NULL, FALSE); (yyval.var)->eval = (yyvsp[0].expr); ;} break; - case 144: -#line 552 "parser.y" + case 145: +#line 567 "parser.y" { (yyval.var_list) = NULL; ;} break; - case 145: -#line 553 "parser.y" + case 146: +#line 568 "parser.y" { (yyval.var_list) = (yyvsp[-1].var_list); ;} break; - case 147: -#line 557 "parser.y" + case 148: +#line 572 "parser.y" { if (!(yyvsp[0].var)->eval) (yyvsp[0].var)->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); ;} break; - case 148: -#line 561 "parser.y" + case 149: +#line 576 "parser.y" { if (!(yyvsp[0].var)->eval) { var_t *last = LIST_ENTRY( list_tail((yyval.var_list)), var_t, entry ); @@ -2908,23 +2927,23 @@ yyreduce: ;} break; - case 149: -#line 570 "parser.y" + case 150: +#line 585 "parser.y" { (yyval.var) = reg_const((yyvsp[-2].var)); (yyval.var)->eval = (yyvsp[0].expr); (yyval.var)->type = make_int(0); ;} break; - case 150: -#line 574 "parser.y" + case 151: +#line 589 "parser.y" { (yyval.var) = reg_const((yyvsp[0].var)); (yyval.var)->type = make_int(0); ;} break; - case 151: -#line 579 "parser.y" + case 152: +#line 594 "parser.y" { (yyval.type) = get_typev(RPC_FC_ENUM16, (yyvsp[-3].var), tsENUM); (yyval.type)->kind = TKIND_ENUM; (yyval.type)->fields_or_args = (yyvsp[-1].var_list); @@ -2934,256 +2953,253 @@ yyreduce: ;} break; - case 152: -#line 588 "parser.y" - { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); ;} - break; - case 153: -#line 589 "parser.y" - { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); ;} +#line 603 "parser.y" + { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); ;} break; case 154: -#line 602 "parser.y" - { (yyval.expr) = make_expr(EXPR_VOID); ;} - break; - - case 156: -#line 606 "parser.y" - { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); ;} - break; - - case 157: -#line 607 "parser.y" - { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); ;} - break; - - case 158: -#line 608 "parser.y" - { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); ;} - break; - - case 159: -#line 609 "parser.y" - { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); ;} - break; - - case 160: -#line 610 "parser.y" - { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); ;} - break; - - case 161: -#line 611 "parser.y" - { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); ;} - break; - - case 162: -#line 612 "parser.y" - { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 163: -#line 613 "parser.y" - { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 164: -#line 614 "parser.y" - { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 165: -#line 615 "parser.y" - { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 166: -#line 616 "parser.y" - { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 167: -#line 617 "parser.y" - { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 168: -#line 618 "parser.y" - { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 169: -#line 619 "parser.y" - { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 170: -#line 620 "parser.y" - { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} - break; - - case 171: -#line 621 "parser.y" - { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); ;} - break; - - case 172: -#line 622 "parser.y" - { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); ;} - break; - - case 173: -#line 623 "parser.y" - { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); ;} - break; - - case 174: -#line 624 "parser.y" - { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); ;} - break; - - case 175: -#line 625 "parser.y" - { (yyval.expr) = make_exprt(EXPR_CAST, (yyvsp[-2].type), (yyvsp[0].expr)); ;} - break; - - case 176: -#line 626 "parser.y" - { (yyval.expr) = make_exprt(EXPR_SIZEOF, (yyvsp[-1].type), NULL); ;} - break; - - case 177: -#line 627 "parser.y" - { (yyval.expr) = (yyvsp[-1].expr); ;} - break; - - case 178: -#line 630 "parser.y" - { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); ;} - break; - - case 179: -#line 631 "parser.y" +#line 604 "parser.y" { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); ;} break; - case 180: + case 155: +#line 617 "parser.y" + { (yyval.expr) = make_expr(EXPR_VOID); ;} + break; + + case 157: +#line 621 "parser.y" + { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); ;} + break; + + case 158: +#line 622 "parser.y" + { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); ;} + break; + + case 159: +#line 623 "parser.y" + { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); ;} + break; + + case 160: +#line 624 "parser.y" + { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); ;} + break; + + case 161: +#line 625 "parser.y" + { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); ;} + break; + + case 162: +#line 626 "parser.y" + { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); ;} + break; + + case 163: +#line 627 "parser.y" + { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 164: +#line 628 "parser.y" + { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 165: +#line 629 "parser.y" + { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 166: +#line 630 "parser.y" + { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 167: +#line 631 "parser.y" + { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 168: +#line 632 "parser.y" + { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 169: +#line 633 "parser.y" + { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 170: #line 634 "parser.y" + { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 171: +#line 635 "parser.y" + { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 172: +#line 636 "parser.y" + { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); ;} + break; + + case 173: +#line 637 "parser.y" + { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); ;} + break; + + case 174: +#line 638 "parser.y" + { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); ;} + break; + + case 175: +#line 639 "parser.y" + { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); ;} + break; + + case 176: +#line 640 "parser.y" + { (yyval.expr) = make_exprt(EXPR_CAST, (yyvsp[-2].type), (yyvsp[0].expr)); ;} + break; + + case 177: +#line 641 "parser.y" + { (yyval.expr) = make_exprt(EXPR_SIZEOF, (yyvsp[-1].type), NULL); ;} + break; + + case 178: +#line 642 "parser.y" + { (yyval.expr) = (yyvsp[-1].expr); ;} + break; + + case 179: +#line 645 "parser.y" + { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); ;} + break; + + case 180: +#line 646 "parser.y" + { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); ;} + break; + + case 181: +#line 649 "parser.y" { (yyval.expr) = (yyvsp[0].expr); if (!(yyval.expr)->is_const) error_loc("expression is not constant\n"); ;} break; - case 181: -#line 640 "parser.y" + case 182: +#line 655 "parser.y" { (yyval.var) = (yyvsp[0].var); set_type((yyval.var), (yyvsp[-1].type), NULL, NULL, FALSE); ;} break; - case 182: -#line 645 "parser.y" + case 183: +#line 660 "parser.y" { (yyval.var_list) = NULL; ;} break; - case 183: -#line 646 "parser.y" + case 184: +#line 661 "parser.y" { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); ;} break; - case 184: -#line 649 "parser.y" + case 185: +#line 664 "parser.y" { (yyval.var) = (yyvsp[-1].var); ;} break; - case 185: -#line 650 "parser.y" + case 186: +#line 665 "parser.y" { (yyval.var) = make_var(NULL); (yyval.var)->type = (yyvsp[-1].type); (yyval.var)->attrs = (yyvsp[-2].attr_list); ;} break; - case 186: -#line 651 "parser.y" + case 187: +#line 666 "parser.y" { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); ;} break; - case 187: -#line 652 "parser.y" + case 188: +#line 667 "parser.y" { (yyval.var) = NULL; ;} break; - case 188: -#line 655 "parser.y" + case 189: +#line 670 "parser.y" { (yyval.var) = (yyvsp[-1].pident)->var; - (yyval.var)->attrs = (yyvsp[-3].attr_list); + (yyval.var)->attrs = check_field_attrs((yyval.var)->name, (yyvsp[-3].attr_list)); set_type((yyval.var), (yyvsp[-2].type), (yyvsp[-1].pident), (yyvsp[0].array_dims), FALSE); free((yyvsp[-1].pident)); ;} break; - case 189: -#line 663 "parser.y" + case 190: +#line 678 "parser.y" { var_t *v = (yyvsp[0].pident)->var; var_list_t *args = (yyvsp[0].pident)->args; - v->attrs = (yyvsp[-2].attr_list); + v->attrs = check_function_attrs(v->name, (yyvsp[-2].attr_list)); set_type(v, (yyvsp[-1].type), (yyvsp[0].pident), NULL, FALSE); free((yyvsp[0].pident)); (yyval.func) = make_func(v, args); - if (is_attr(v->attrs, ATTR_IN)) { - error_loc("inapplicable attribute [in] for function '%s'\n",(yyval.func)->def->name); - } ;} break; - case 190: -#line 675 "parser.y" - { (yyval.var) = NULL; ;} - break; - - case 192: -#line 679 "parser.y" + case 191: +#line 687 "parser.y" { (yyval.var) = NULL; ;} break; case 193: -#line 680 "parser.y" - { (yyval.var) = make_var((yyvsp[0].str)); ;} +#line 691 "parser.y" + { (yyval.var) = NULL; ;} break; case 194: -#line 681 "parser.y" +#line 692 "parser.y" { (yyval.var) = make_var((yyvsp[0].str)); ;} break; case 195: -#line 684 "parser.y" +#line 693 "parser.y" { (yyval.var) = make_var((yyvsp[0].str)); ;} break; case 196: -#line 686 "parser.y" +#line 696 "parser.y" { (yyval.var) = make_var((yyvsp[0].str)); ;} break; case 197: -#line 689 "parser.y" - { (yyval.type) = make_builtin((yyvsp[0].str)); ;} +#line 698 "parser.y" + { (yyval.var) = make_var((yyvsp[0].str)); ;} break; case 198: -#line 690 "parser.y" +#line 701 "parser.y" { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; - case 200: -#line 692 "parser.y" - { (yyval.type) = (yyvsp[0].type); (yyval.type)->sign = 1; ;} + case 199: +#line 702 "parser.y" + { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; case 201: -#line 693 "parser.y" +#line 704 "parser.y" + { (yyval.type) = (yyvsp[0].type); (yyval.type)->sign = 1; ;} + break; + + case 202: +#line 705 "parser.y" { (yyval.type) = (yyvsp[0].type); (yyval.type)->sign = -1; switch ((yyval.type)->type) { case RPC_FC_CHAR: break; @@ -3202,93 +3218,93 @@ yyreduce: ;} break; - case 202: -#line 709 "parser.y" + case 203: +#line 721 "parser.y" { (yyval.type) = make_int(-1); ;} break; - case 203: -#line 710 "parser.y" - { (yyval.type) = make_builtin((yyvsp[0].str)); ;} - break; - case 204: -#line 711 "parser.y" - { (yyval.type) = duptype(find_type("float", 0), 1); ;} - break; - - case 205: -#line 712 "parser.y" - { (yyval.type) = make_builtin((yyvsp[0].str)); ;} - break; - - case 206: -#line 713 "parser.y" - { (yyval.type) = make_builtin((yyvsp[0].str)); ;} - break; - - case 207: -#line 714 "parser.y" - { (yyval.type) = make_builtin((yyvsp[0].str)); ;} - break; - - case 208: -#line 715 "parser.y" - { (yyval.type) = make_builtin((yyvsp[0].str)); ;} - break; - - case 211: #line 722 "parser.y" { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; - case 212: + case 205: #line 723 "parser.y" - { (yyval.type) = make_builtin((yyvsp[-1].str)); ;} + { (yyval.type) = duptype(find_type("float", 0), 1); ;} break; - case 213: + case 206: #line 724 "parser.y" { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; - case 214: + case 207: #line 725 "parser.y" - { (yyval.type) = make_builtin((yyvsp[-1].str)); ;} + { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; - case 215: + case 208: #line 726 "parser.y" - { (yyval.type) = make_builtin((yyvsp[-1].str)); ;} + { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; - case 216: + case 209: #line 727 "parser.y" { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; + case 212: +#line 734 "parser.y" + { (yyval.type) = make_builtin((yyvsp[0].str)); ;} + break; + + case 213: +#line 735 "parser.y" + { (yyval.type) = make_builtin((yyvsp[-1].str)); ;} + break; + + case 214: +#line 736 "parser.y" + { (yyval.type) = make_builtin((yyvsp[0].str)); ;} + break; + + case 215: +#line 737 "parser.y" + { (yyval.type) = make_builtin((yyvsp[-1].str)); ;} + break; + + case 216: +#line 738 "parser.y" + { (yyval.type) = make_builtin((yyvsp[-1].str)); ;} + break; + case 217: -#line 728 "parser.y" +#line 739 "parser.y" { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; case 218: -#line 731 "parser.y" - { (yyval.type) = make_class((yyvsp[0].str)); ;} +#line 740 "parser.y" + { (yyval.type) = make_builtin((yyvsp[0].str)); ;} break; case 219: -#line 732 "parser.y" +#line 743 "parser.y" + { (yyval.type) = make_class((yyvsp[0].str)); ;} + break; + + case 220: +#line 744 "parser.y" { (yyval.type) = find_type((yyvsp[0].str), 0); if ((yyval.type)->defined) error_loc("multiple definition error\n"); if ((yyval.type)->kind != TKIND_COCLASS) error_loc("%s was not declared a coclass\n", (yyvsp[0].str)); ;} break; - case 220: -#line 738 "parser.y" + case 221: +#line 750 "parser.y" { (yyval.type) = (yyvsp[0].type); - (yyval.type)->attrs = (yyvsp[-1].attr_list); + (yyval.type)->attrs = check_coclass_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)); if (!parse_only && do_header) write_coclass((yyval.type)); if (!parse_only && do_idfile) @@ -3296,47 +3312,47 @@ yyreduce: ;} break; - case 221: -#line 748 "parser.y" + case 222: +#line 760 "parser.y" { (yyval.type) = (yyvsp[-4].type); (yyval.type)->ifaces = (yyvsp[-2].ifref_list); (yyval.type)->defined = TRUE; ;} break; - case 222: -#line 754 "parser.y" + case 223: +#line 766 "parser.y" { (yyval.ifref_list) = NULL; ;} break; - case 223: -#line 755 "parser.y" + case 224: +#line 767 "parser.y" { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), (yyvsp[0].ifref) ); ;} break; - case 224: -#line 759 "parser.y" + case 225: +#line 771 "parser.y" { (yyval.ifref) = make_ifref((yyvsp[0].type)); (yyval.ifref)->attrs = (yyvsp[-1].attr_list); ;} break; - case 225: -#line 762 "parser.y" - { (yyval.type) = get_type(0, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_DISPATCH; ;} - break; - case 226: -#line 763 "parser.y" +#line 774 "parser.y" { (yyval.type) = get_type(0, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_DISPATCH; ;} break; case 227: -#line 766 "parser.y" +#line 775 "parser.y" + { (yyval.type) = get_type(0, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_DISPATCH; ;} + break; + + case 228: +#line 778 "parser.y" { attr_t *attrs; is_object_interface = TRUE; (yyval.type) = (yyvsp[0].type); if ((yyval.type)->defined) error_loc("multiple definition error\n"); attrs = make_attr(ATTR_DISPINTERFACE); - (yyval.type)->attrs = append_attr( (yyvsp[-1].attr_list), attrs ); + (yyval.type)->attrs = append_attr( check_dispiface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)), attrs ); (yyval.type)->ref = find_type("IDispatch", 0); if (!(yyval.type)->ref) error_loc("IDispatch is undefined\n"); (yyval.type)->defined = TRUE; @@ -3344,28 +3360,28 @@ yyreduce: ;} break; - case 228: -#line 779 "parser.y" + case 229: +#line 791 "parser.y" { (yyval.var_list) = NULL; ;} break; - case 229: -#line 780 "parser.y" + case 230: +#line 792 "parser.y" { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); ;} break; - case 230: -#line 783 "parser.y" + case 231: +#line 795 "parser.y" { (yyval.func_list) = NULL; ;} break; - case 231: -#line 784 "parser.y" + case 232: +#line 796 "parser.y" { (yyval.func_list) = append_func( (yyvsp[-2].func_list), (yyvsp[-1].func) ); ;} break; - case 232: -#line 790 "parser.y" + case 233: +#line 802 "parser.y" { (yyval.type) = (yyvsp[-4].type); (yyval.type)->fields_or_args = (yyvsp[-2].var_list); (yyval.type)->funcs = (yyvsp[-1].func_list); @@ -3374,8 +3390,8 @@ yyreduce: ;} break; - case 233: -#line 797 "parser.y" + case 234: +#line 809 "parser.y" { (yyval.type) = (yyvsp[-4].type); (yyval.type)->fields_or_args = (yyvsp[-2].type)->fields_or_args; (yyval.type)->funcs = (yyvsp[-2].type)->funcs; @@ -3384,45 +3400,46 @@ yyreduce: ;} break; - case 234: -#line 805 "parser.y" + case 235: +#line 817 "parser.y" { (yyval.type) = NULL; ;} break; - case 235: -#line 806 "parser.y" + case 236: +#line 818 "parser.y" { (yyval.type) = find_type2((yyvsp[0].str), 0); ;} break; - case 236: -#line 809 "parser.y" - { (yyval.type) = get_type(RPC_FC_IP, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_INTERFACE; ;} - break; - case 237: -#line 810 "parser.y" +#line 821 "parser.y" { (yyval.type) = get_type(RPC_FC_IP, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_INTERFACE; ;} break; case 238: -#line 813 "parser.y" +#line 822 "parser.y" + { (yyval.type) = get_type(RPC_FC_IP, (yyvsp[0].str), 0); (yyval.type)->kind = TKIND_INTERFACE; ;} + break; + + case 239: +#line 825 "parser.y" { (yyval.ifinfo).interface = (yyvsp[0].type); (yyval.ifinfo).old_pointer_default = pointer_default; if (is_attr((yyvsp[-1].attr_list), ATTR_POINTERDEFAULT)) pointer_default = get_attrv((yyvsp[-1].attr_list), ATTR_POINTERDEFAULT); is_object_interface = is_object((yyvsp[-1].attr_list)); if ((yyvsp[0].type)->defined) error_loc("multiple definition error\n"); - (yyvsp[0].type)->attrs = (yyvsp[-1].attr_list); + (yyvsp[0].type)->attrs = check_iface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)); (yyvsp[0].type)->defined = TRUE; if (!parse_only && do_header) write_forward((yyvsp[0].type)); ;} break; - case 239: -#line 826 "parser.y" + case 240: +#line 838 "parser.y" { (yyval.type) = (yyvsp[-5].ifinfo).interface; (yyval.type)->ref = (yyvsp[-4].type); (yyval.type)->funcs = (yyvsp[-2].func_list); + check_functions((yyval.type)); compute_method_indexes((yyval.type)); if (!parse_only && do_header) write_interface((yyval.type)); if (!parse_only && local_stubs) write_locals(local_stubs, (yyval.type), TRUE); @@ -3431,8 +3448,8 @@ yyreduce: ;} break; - case 240: -#line 839 "parser.y" + case 241: +#line 852 "parser.y" { (yyval.type) = (yyvsp[-7].ifinfo).interface; (yyval.type)->ref = find_type2((yyvsp[-5].str), 0); if (!(yyval.type)->ref) error_loc("base class '%s' not found in import\n", (yyvsp[-5].str)); @@ -3445,117 +3462,117 @@ yyreduce: ;} break; - case 241: -#line 849 "parser.y" + case 242: +#line 862 "parser.y" { (yyval.type) = (yyvsp[-1].type); ;} break; - case 242: -#line 853 "parser.y" - { (yyval.type) = (yyvsp[-1].type); if (!parse_only && do_header) write_forward((yyval.type)); ;} - break; - case 243: -#line 854 "parser.y" +#line 866 "parser.y" { (yyval.type) = (yyvsp[-1].type); if (!parse_only && do_header) write_forward((yyval.type)); ;} break; case 244: -#line 857 "parser.y" - { (yyval.type) = make_type(0, NULL); (yyval.type)->name = (yyvsp[0].str); (yyval.type)->kind = TKIND_MODULE; ;} +#line 867 "parser.y" + { (yyval.type) = (yyvsp[-1].type); if (!parse_only && do_header) write_forward((yyval.type)); ;} break; case 245: -#line 858 "parser.y" +#line 870 "parser.y" { (yyval.type) = make_type(0, NULL); (yyval.type)->name = (yyvsp[0].str); (yyval.type)->kind = TKIND_MODULE; ;} break; case 246: -#line 861 "parser.y" - { (yyval.type) = (yyvsp[0].type); - (yyval.type)->attrs = (yyvsp[-1].attr_list); - ;} +#line 871 "parser.y" + { (yyval.type) = make_type(0, NULL); (yyval.type)->name = (yyvsp[0].str); (yyval.type)->kind = TKIND_MODULE; ;} break; case 247: -#line 867 "parser.y" +#line 874 "parser.y" + { (yyval.type) = (yyvsp[0].type); + (yyval.type)->attrs = check_module_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)); + ;} + break; + + case 248: +#line 880 "parser.y" { (yyval.type) = (yyvsp[-4].type); (yyval.type)->funcs = (yyvsp[-2].func_list); /* FIXME: if (!parse_only && do_header) write_module($$); */ ;} break; - case 248: -#line 873 "parser.y" + case 249: +#line 886 "parser.y" { (yyval.pident) = (yyvsp[0].pident); (yyval.pident)->ptr_level++; ;} break; - case 249: -#line 874 "parser.y" + case 250: +#line 887 "parser.y" { (yyval.pident) = (yyvsp[0].pident); /* FIXME */ ;} break; - case 250: -#line 875 "parser.y" + case 251: +#line 888 "parser.y" { (yyval.pident) = (yyvsp[0].pident); if ((yyval.pident)->callconv) parser_warning("multiple calling conventions %s, %s for function %s\n", (yyval.pident)->callconv, (yyvsp[-1].str), (yyval.pident)->var->name); (yyval.pident)->callconv = (yyvsp[-1].str); ;} break; - case 252: -#line 883 "parser.y" + case 253: +#line 896 "parser.y" { (yyval.pident) = (yyvsp[-3].pident); (yyvsp[-3].pident)->args = (yyvsp[-1].var_list); (yyvsp[-3].pident)->is_func = TRUE; ;} break; - case 253: -#line 889 "parser.y" + case 254: +#line 902 "parser.y" { (yyval.pident) = make_pident((yyvsp[0].var)); ;} break; - case 254: -#line 890 "parser.y" + case 255: +#line 903 "parser.y" { (yyval.pident) = (yyvsp[-1].pident); ;} break; - case 255: -#line 891 "parser.y" + case 256: +#line 904 "parser.y" { (yyval.pident) = (yyvsp[0].pident); (yyval.pident)->func_ptr_level = (yyval.pident)->ptr_level; (yyval.pident)->ptr_level = 0; ;} break; - case 256: -#line 898 "parser.y" + case 257: +#line 911 "parser.y" { (yyval.pident_list) = append_pident( NULL, (yyvsp[0].pident) ); ;} break; - case 257: -#line 899 "parser.y" + case 258: +#line 912 "parser.y" { (yyval.pident_list) = append_pident( (yyvsp[-2].pident_list), (yyvsp[0].pident) ); ;} break; - case 258: -#line 903 "parser.y" + case 259: +#line 916 "parser.y" { (yyval.num) = RPC_FC_RP; ;} break; - case 259: -#line 904 "parser.y" + case 260: +#line 917 "parser.y" { (yyval.num) = RPC_FC_UP; ;} break; - case 260: -#line 905 "parser.y" + case 261: +#line 918 "parser.y" { (yyval.num) = RPC_FC_FP; ;} break; - case 261: -#line 908 "parser.y" + case 262: +#line 921 "parser.y" { (yyval.type) = get_typev(RPC_FC_STRUCT, (yyvsp[-3].var), tsSTRUCT); /* overwrite RPC_FC_STRUCT with a more exact type */ (yyval.type)->type = get_struct_type( (yyvsp[-1].var_list) ); @@ -3567,70 +3584,70 @@ yyreduce: ;} break; - case 262: -#line 919 "parser.y" + case 263: +#line 932 "parser.y" { (yyval.type) = duptype(find_type("void", 0), 1); ;} break; - case 263: -#line 920 "parser.y" + case 264: +#line 933 "parser.y" { (yyval.type) = find_type((yyvsp[0].str), 0); ;} break; - case 264: -#line 921 "parser.y" - { (yyval.type) = (yyvsp[0].type); ;} - break; - case 265: -#line 922 "parser.y" - { (yyval.type) = duptype((yyvsp[0].type), 1); (yyval.type)->is_const = TRUE; ;} +#line 934 "parser.y" + { (yyval.type) = (yyvsp[0].type); ;} break; case 266: -#line 923 "parser.y" - { (yyval.type) = (yyvsp[0].type); ;} +#line 935 "parser.y" + { (yyval.type) = duptype((yyvsp[0].type), 1); (yyval.type)->is_const = TRUE; ;} break; case 267: -#line 924 "parser.y" - { (yyval.type) = find_type2((yyvsp[0].str), tsENUM); ;} +#line 936 "parser.y" + { (yyval.type) = (yyvsp[0].type); ;} break; case 268: -#line 925 "parser.y" - { (yyval.type) = (yyvsp[0].type); ;} +#line 937 "parser.y" + { (yyval.type) = find_type2((yyvsp[0].str), tsENUM); ;} break; case 269: -#line 926 "parser.y" - { (yyval.type) = get_type(RPC_FC_STRUCT, (yyvsp[0].str), tsSTRUCT); ;} - break; - - case 270: -#line 927 "parser.y" +#line 938 "parser.y" { (yyval.type) = (yyvsp[0].type); ;} break; + case 270: +#line 939 "parser.y" + { (yyval.type) = get_type(RPC_FC_STRUCT, (yyvsp[0].str), tsSTRUCT); ;} + break; + case 271: -#line 928 "parser.y" - { (yyval.type) = find_type2((yyvsp[0].str), tsUNION); ;} +#line 940 "parser.y" + { (yyval.type) = (yyvsp[0].type); ;} break; case 272: -#line 929 "parser.y" - { (yyval.type) = make_safearray((yyvsp[-1].type)); ;} +#line 941 "parser.y" + { (yyval.type) = find_type2((yyvsp[0].str), tsUNION); ;} break; case 273: -#line 932 "parser.y" - { reg_typedefs((yyvsp[-1].type), (yyvsp[0].pident_list), (yyvsp[-2].attr_list)); +#line 942 "parser.y" + { (yyval.type) = make_safearray((yyvsp[-1].type)); ;} + break; + + case 274: +#line 945 "parser.y" + { reg_typedefs((yyvsp[-1].type), (yyvsp[0].pident_list), check_typedef_attrs((yyvsp[-2].attr_list))); process_typedefs((yyvsp[0].pident_list)); ;} break; - case 274: -#line 937 "parser.y" + case 275: +#line 950 "parser.y" { (yyval.type) = get_typev(RPC_FC_NON_ENCAPSULATED_UNION, (yyvsp[-3].var), tsUNION); (yyval.type)->kind = TKIND_UNION; (yyval.type)->fields_or_args = (yyvsp[-1].var_list); @@ -3638,8 +3655,8 @@ yyreduce: ;} break; - case 275: -#line 944 "parser.y" + case 276: +#line 957 "parser.y" { var_t *u = (yyvsp[-3].var); (yyval.type) = get_typev(RPC_FC_ENCAPSULATED_UNION, (yyvsp[-8].var), tsUNION); (yyval.type)->kind = TKIND_UNION; @@ -3654,13 +3671,13 @@ yyreduce: ;} break; - case 276: -#line 959 "parser.y" + case 277: +#line 972 "parser.y" { (yyval.num) = MAKEVERSION((yyvsp[0].num), 0); ;} break; - case 277: -#line 960 "parser.y" + case 278: +#line 973 "parser.y" { (yyval.num) = MAKEVERSION((yyvsp[-2].num), (yyvsp[0].num)); ;} break; @@ -3669,7 +3686,7 @@ yyreduce: } /* Line 1126 of yacc.c. */ -#line 3673 "parser.tab.c" +#line 3690 "parser.tab.c" yyvsp -= yylen; yyssp -= yylen; @@ -3937,7 +3954,7 @@ yyreturn: } -#line 963 "parser.y" +#line 976 "parser.y" static void decl_builtin(const char *name, unsigned char type) @@ -4003,12 +4020,21 @@ static str_list_t *append_str(str_list_t *list, char *str) static attr_list_t *append_attr(attr_list_t *list, attr_t *attr) { + attr_t *attr_existing; if (!attr) return list; if (!list) { list = xmalloc( sizeof(*list) ); list_init( list ); } + LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry) + if (attr_existing->type == attr->type) + { + parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type)); + /* use the last attribute, like MIDL does */ + list_remove(&attr_existing->entry); + break; + } list_add_tail( list, &attr->entry ); return list; } @@ -4146,7 +4172,7 @@ static expr_t *make_expr1(enum expr_type type, expr_t *expr) { expr_t *e; if (type == EXPR_ADDRESSOF && expr->type != EXPR_IDENTIFIER) - error("address-of operator applied to invalid expression\n"); + error_loc("address-of operator applied to invalid expression\n"); e = xmalloc(sizeof(expr_t)); e->type = type; e->ref = expr; @@ -4313,7 +4339,7 @@ static type_t *make_type(unsigned char type, type_t *ref) } static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_t *arr, - int top) + int top) { expr_list_t *sizes = get_attrp(v->attrs, ATTR_SIZEIS); expr_list_t *lengs = get_attrp(v->attrs, ATTR_LENGTHIS); @@ -4350,7 +4376,7 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ } } else if (!arr && ptr_attr) - error("%s: pointer attribute applied to non-pointer type\n", v->name); + error_loc("%s: pointer attribute applied to non-pointer type\n", v->name); } if (pident && pident->is_func) { @@ -4372,7 +4398,7 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ if (arr) LIST_FOR_EACH_ENTRY_REV(dim, arr, expr_t, entry) { if (sizeless) - error("%s: only the first array dimension can be unspecified\n", v->name); + error_loc("%s: only the first array dimension can be unspecified\n", v->name); if (dim->is_const) { @@ -4380,10 +4406,10 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ size_t size = type_memsize(v->type, &align); if (dim->cval <= 0) - error("%s: array dimension must be positive\n", v->name); + error_loc("%s: array dimension must be positive\n", v->name); if (0xffffffffuL / size < (unsigned long) dim->cval) - error("%s: total array size is too large\n", v->name); + error_loc("%s: total array size is too large\n", v->name); else if (0xffffuL < size * dim->cval) v->type = make_type(RPC_FC_LGFARRAY, v->type); else @@ -4409,10 +4435,10 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ atype = *ptype = duptype(*ptype, 0); if (atype->type == RPC_FC_SMFARRAY || atype->type == RPC_FC_LGFARRAY) - error("%s: cannot specify size_is for a fixed sized array\n", v->name); + error_loc("%s: cannot specify size_is for a fixed sized array\n", v->name); if (atype->type != RPC_FC_CARRAY && !is_ptr(atype)) - error("%s: size_is attribute applied to illegal type\n", v->name); + error_loc("%s: size_is attribute applied to illegal type\n", v->name); atype->type = RPC_FC_CARRAY; atype->size_is = dim; @@ -4420,7 +4446,7 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ ptype = &(*ptype)->ref; if (*ptype == NULL) - error("%s: too many expressions in size_is attribute\n", v->name); + error_loc("%s: too many expressions in size_is attribute\n", v->name); } ptype = &v->type; @@ -4438,14 +4464,14 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ else if (atype->type == RPC_FC_CARRAY) atype->type = RPC_FC_CVARRAY; else - error("%s: length_is attribute applied to illegal type\n", v->name); + error_loc("%s: length_is attribute applied to illegal type\n", v->name); atype->length_is = dim; } ptype = &(*ptype)->ref; if (*ptype == NULL) - error("%s: too many expressions in length_is attribute\n", v->name); + error_loc("%s: too many expressions in length_is attribute\n", v->name); } if (has_varconf && !last_array(v->type)) @@ -4521,6 +4547,9 @@ static var_t *make_var(char *name) v->type = NULL; v->attrs = NULL; v->eval = NULL; + v->loc_info.input_name = input_name ? input_name : "stdin"; + v->loc_info.line_number = line_number; + v->loc_info.near_text = parser_text; return v; } @@ -5092,12 +5121,287 @@ static void process_typedefs(pident_list_t *pidents) } } +struct allowed_attr +{ + unsigned int dce_compatible : 1; + unsigned int acf : 1; + unsigned int on_interface : 1; + unsigned int on_function : 1; + unsigned int on_arg : 1; + unsigned int on_type : 1; + unsigned int on_field : 1; + unsigned int on_library : 1; + unsigned int on_dispinterface : 1; + unsigned int on_module : 1; + unsigned int on_coclass : 1; + const char *display_name; +}; + +struct allowed_attr allowed_attr[] = +{ + /* attr { D ACF I Fn ARG T Fi L DI M C } */ + /* ATTR_AGGREGATABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "aggregatable" }, + /* ATTR_APPOBJECT */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "appobject" }, + /* ATTR_ASYNC */ { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, "async" }, + /* ATTR_AUTO_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "auto_handle" }, + /* ATTR_BINDABLE */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "bindable" }, + /* ATTR_BROADCAST */ { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "broadcast" }, + /* ATTR_CALLAS */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "call_as" }, + /* ATTR_CALLCONV */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, + /* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" }, + /* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "context_handle" }, + /* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" }, + /* ATTR_DEFAULT */ { 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, "default" }, + /* ATTR_DEFAULTCOLLELEM */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" }, + /* ATTR_DEFAULTVALUE_EXPR */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "defaultvalue" }, + /* ATTR_DEFAULTVALUE_STRING */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "defaultvalue" }, + /* ATTR_DEFAULTVTABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "defaultvtable" }, + /* ATTR_DISPINTERFACE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, + /* ATTR_DISPLAYBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "displaybind" }, + /* ATTR_DLLNAME */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "dllname" }, + /* ATTR_DUAL */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "dual" }, + /* ATTR_ENDPOINT */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" }, + /* ATTR_ENTRY_ORDINAL */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "entry" }, + /* ATTR_ENTRY_STRING */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "entry" }, + /* ATTR_EXPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" }, + /* ATTR_HANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "handle" }, + /* ATTR_HELPCONTEXT */ { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpcontext" }, + /* ATTR_HELPFILE */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpfile" }, + /* ATTR_HELPSTRING */ { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpstring" }, + /* ATTR_HELPSTRINGCONTEXT */ { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpstringcontext" }, + /* ATTR_HELPSTRINGDLL */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpstringdll" }, + /* ATTR_HIDDEN */ { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, "hidden" }, + /* ATTR_ID */ { 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, "id" }, + /* ATTR_IDEMPOTENT */ { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "idempotent" }, + /* ATTR_IIDIS */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "iid_is" }, + /* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "immediatebind" }, + /* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" }, + /* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "in" }, + /* ATTR_INPUTSYNC */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" }, + /* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "length_is" }, + /* ATTR_LOCAL */ { 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, "local" }, + /* ATTR_NONBROWSABLE */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" }, + /* ATTR_NONCREATABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "noncreatable" }, + /* ATTR_NONEXTENSIBLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "nonextensible" }, + /* ATTR_OBJECT */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "object" }, + /* ATTR_ODL */ { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, "odl" }, + /* ATTR_OLEAUTOMATION */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" }, + /* ATTR_OPTIONAL */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "optional" }, + /* ATTR_OUT */ { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "out" }, + /* ATTR_POINTERDEFAULT */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" }, + /* ATTR_POINTERTYPE */ { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, "ref, unique or ptr" }, + /* ATTR_PROPGET */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propget" }, + /* ATTR_PROPPUT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propput" }, + /* ATTR_PROPPUTREF */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propputref" }, + /* ATTR_PUBLIC */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "public" }, + /* ATTR_RANGE */ { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, "range" }, + /* ATTR_READONLY */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "readonly" }, + /* ATTR_REQUESTEDIT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "requestedit" }, + /* ATTR_RESTRICTED */ { 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, "restricted" }, + /* ATTR_RETVAL */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "retval" }, + /* ATTR_SIZEIS */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "size_is" }, + /* ATTR_SOURCE */ { 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, "source" }, + /* ATTR_STRICTCONTEXTHANDLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "strict_context_handle" }, + /* ATTR_STRING */ { 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, "string" }, + /* ATTR_SWITCHIS */ { 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "switch_is" }, + /* ATTR_SWITCHTYPE */ { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, "switch_type" }, + /* ATTR_TRANSMITAS */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "transmit_as" }, + /* ATTR_UUID */ { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, "uuid" }, + /* ATTR_V1ENUM */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "v1_enum" }, + /* ATTR_VARARG */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "vararg" }, + /* ATTR_VERSION */ { 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, "version" }, + /* ATTR_WIREMARSHAL */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "wire_marshal" }, +}; + +const char *get_attr_display_name(enum attr_type type) +{ + return allowed_attr[type].display_name; +} + +static const attr_list_t *check_iface_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_interface) + error_loc("inapplicable attribute %s for interface %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_function) + error_loc("inapplicable attribute %s for function %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + static void check_arg(var_t *arg) { - type_t *t = arg->type; + const type_t *t = arg->type; + const attr_t *attr; if (t->type == 0 && ! is_var_ptr(arg)) error_loc("argument '%s' has void type\n", arg->name); + + if (arg->attrs) + { + LIST_FOR_EACH_ENTRY(attr, arg->attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_arg) + error_loc("inapplicable attribute %s for argument %s\n", + allowed_attr[attr->type].display_name, arg->name); + } + } +} + +static attr_list_t *check_typedef_attrs(attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_type) + error_loc("inapplicable attribute %s for typedef\n", + allowed_attr[attr->type].display_name); + } + return attrs; +} + +static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_field) + error_loc("inapplicable attribute %s for field %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static const attr_list_t *check_library_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_library) + error_loc("inapplicable attribute %s for library %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_dispinterface) + error_loc("inapplicable attribute %s for dispinterface %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static const attr_list_t *check_module_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_module) + error_loc("inapplicable attribute %s for module %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static const attr_list_t *check_coclass_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_coclass) + error_loc("inapplicable attribute %s for coclass %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +/* checks that arguments for a function make sense for marshalling and unmarshalling */ +static void check_remoting_args(const func_t *func) +{ + const char *funcname = func->def->name; + const var_t *arg; + + if (func->args) LIST_FOR_EACH_ENTRY( arg, func->args, const var_t, entry ) + { + int ptr_level = 0; + const type_t *type = arg->type; + int is_wire_marshal = 0; + int is_context_handle = 0; + + /* get pointer level and fundamental type for the argument */ + for (;;) + { + if (!is_wire_marshal && is_attr(type->attrs, ATTR_WIREMARSHAL)) + is_wire_marshal = 1; + if (!is_context_handle && is_attr(type->attrs, ATTR_CONTEXTHANDLE)) + is_context_handle = 1; + if (type->kind == TKIND_ALIAS) + type = type->orig; + else if (is_ptr(type)) + { + ptr_level++; + type = type->ref; + } + else + break; + } + + /* check that [out] parameters have enough pointer levels */ + if (is_attr(arg->attrs, ATTR_OUT)) + { + if (!is_array(type)) + { + if (!ptr_level) + error_loc_info(&arg->loc_info, "out parameter \'%s\' of function \'%s\' is not a pointer\n", arg->name, funcname); + if (type->type == RPC_FC_IP && ptr_level == 1) + error_loc_info(&arg->loc_info, "out interface pointer \'%s\' of function \'%s\' is not a double pointer\n", arg->name, funcname); + } + } + + if (type->type == 0 && !is_attr(arg->attrs, ATTR_IIDIS) && !is_wire_marshal && !is_context_handle) + error_loc_info(&arg->loc_info, "parameter \'%s\' of function \'%s\' cannot derive from void *\n", arg->name, funcname); + else if (type->type == RPC_FC_FUNCTION) + error_loc_info(&arg->loc_info, "parameter \'%s\' of function \'%s\' cannot be a function pointer\n", arg->name, funcname); + } +} + +static void check_functions(const type_t *iface) +{ + if (!is_inside_library && !is_attr(iface->attrs, ATTR_LOCAL)) + { + const func_t *func; + if (iface->funcs) LIST_FOR_EACH_ENTRY( func, iface->funcs, const func_t, entry ) + { + if (!is_attr(func->def->attrs, ATTR_LOCAL)) + check_remoting_args(func); + } + } } static void check_all_user_types(ifref_list_t *ifrefs) diff --git a/reactos/tools/widl/parser.tab.h b/reactos/tools/widl/parser.tab.h index f6cd0802337..c0b5e9f7a35 100644 --- a/reactos/tools/widl/parser.tab.h +++ b/reactos/tools/widl/parser.tab.h @@ -309,7 +309,7 @@ #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 139 "parser.y" +#line 151 "parser.y" typedef union YYSTYPE { attr_t *attr; attr_list_t *attr_list; diff --git a/reactos/tools/widl/parser.y b/reactos/tools/widl/parser.y index 46418a33049..5d00305c5c2 100644 --- a/reactos/tools/widl/parser.y +++ b/reactos/tools/widl/parser.y @@ -67,6 +67,8 @@ unsigned char pointer_default = RPC_FC_UP; static int is_object_interface = FALSE; +/* are we inside a library block? */ +static int is_inside_library = FALSE; typedef struct list typelist_t; struct typenode { @@ -129,7 +131,17 @@ static int compute_method_indexes(type_t *iface); static char *gen_name(void); static void process_typedefs(var_list_t *names); static void check_arg(var_t *arg); +static void check_functions(const type_t *iface); static void check_all_user_types(ifref_list_t *ifaces); +static const attr_list_t *check_iface_attrs(const char *name, const attr_list_t *attrs); +static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs); +static attr_list_t *check_typedef_attrs(attr_list_t *attrs); +static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs); +static const attr_list_t *check_library_attrs(const char *name, const attr_list_t *attrs); +static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs); +static const attr_list_t *check_module_attrs(const char *name, const attr_list_t *attrs); +static const attr_list_t *check_coclass_attrs(const char *name, const attr_list_t *attrs); +const char *get_attr_display_name(enum attr_type type); #define tsENUM 1 #define tsSTRUCT 2 @@ -378,13 +390,15 @@ importlib: tIMPORTLIB '(' aSTRING ')' libraryhdr: tLIBRARY aIDENTIFIER { $$ = $2; } ; -library_start: attributes libraryhdr '{' { if (!parse_only) start_typelib($2, $1); +library_start: attributes libraryhdr '{' { check_library_attrs($2, $1); + if (!parse_only) start_typelib($2, $1); if (!parse_only && do_header) write_library($2, $1); if (!parse_only && do_idfile) write_libid($2, $1); + is_inside_library = TRUE; } ; librarydef: library_start imp_statements '}' - semicolon_opt { if (!parse_only) end_typelib(); } + semicolon_opt { if (!parse_only) end_typelib(); is_inside_library = FALSE; } ; m_args: { $$ = NULL; } @@ -447,6 +461,7 @@ attribute: { $$ = NULL; } | tASYNC { $$ = make_attr(ATTR_ASYNC); } | tAUTOHANDLE { $$ = make_attr(ATTR_AUTO_HANDLE); } | tBINDABLE { $$ = make_attr(ATTR_BINDABLE); } + | tBROADCAST { $$ = make_attr(ATTR_BROADCAST); } | tCALLAS '(' ident ')' { $$ = make_attrp(ATTR_CALLAS, $3); } | tCASE '(' expr_list_const ')' { $$ = make_attrp(ATTR_CASE, $3); } | tCONTEXTHANDLE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); } @@ -653,7 +668,7 @@ field: s_field ';' { $$ = $1; } ; s_field: m_attributes type pident array { $$ = $3->var; - $$->attrs = $1; + $$->attrs = check_field_attrs($$->name, $1); set_type($$, $2, $3, $4, FALSE); free($3); } @@ -662,13 +677,10 @@ s_field: m_attributes type pident array { $$ = $3->var; funcdef: m_attributes type pident { var_t *v = $3->var; var_list_t *args = $3->args; - v->attrs = $1; + v->attrs = check_function_attrs(v->name, $1); set_type(v, $2, $3, NULL, FALSE); free($3); $$ = make_func(v, args); - if (is_attr(v->attrs, ATTR_IN)) { - error_loc("inapplicable attribute [in] for function '%s'\n",$$->def->name); - } } ; @@ -736,7 +748,7 @@ coclass: tCOCLASS aIDENTIFIER { $$ = make_class($2); } ; coclasshdr: attributes coclass { $$ = $2; - $$->attrs = $1; + $$->attrs = check_coclass_attrs($2->name, $1); if (!parse_only && do_header) write_coclass($$); if (!parse_only && do_idfile) @@ -768,7 +780,7 @@ dispinterfacehdr: attributes dispinterface { attr_t *attrs; $$ = $2; if ($$->defined) error_loc("multiple definition error\n"); attrs = make_attr(ATTR_DISPINTERFACE); - $$->attrs = append_attr( $1, attrs ); + $$->attrs = append_attr( check_dispiface_attrs($2->name, $1), attrs ); $$->ref = find_type("IDispatch", 0); if (!$$->ref) error_loc("IDispatch is undefined\n"); $$->defined = TRUE; @@ -816,7 +828,7 @@ interfacehdr: attributes interface { $$.interface = $2; pointer_default = get_attrv($1, ATTR_POINTERDEFAULT); is_object_interface = is_object($1); if ($2->defined) error_loc("multiple definition error\n"); - $2->attrs = $1; + $2->attrs = check_iface_attrs($2->name, $1); $2->defined = TRUE; if (!parse_only && do_header) write_forward($2); } @@ -826,6 +838,7 @@ interfacedef: interfacehdr inherit '{' int_statements '}' semicolon_opt { $$ = $1.interface; $$->ref = $2; $$->funcs = $4; + check_functions($$); compute_method_indexes($$); if (!parse_only && do_header) write_interface($$); if (!parse_only && local_stubs) write_locals(local_stubs, $$, TRUE); @@ -859,7 +872,7 @@ module: tMODULE aIDENTIFIER { $$ = make_type(0, NULL); $$->name = $2; $$->ki ; modulehdr: attributes module { $$ = $2; - $$->attrs = $1; + $$->attrs = check_module_attrs($2->name, $1); } ; @@ -929,7 +942,7 @@ type: tVOID { $$ = duptype(find_type("void", 0), 1); } | tSAFEARRAY '(' type ')' { $$ = make_safearray($3); } ; -typedef: tTYPEDEF m_attributes type pident_list { reg_typedefs($3, $4, $2); +typedef: tTYPEDEF m_attributes type pident_list { reg_typedefs($3, $4, check_typedef_attrs($2)); process_typedefs($4); } ; @@ -1025,12 +1038,21 @@ static str_list_t *append_str(str_list_t *list, char *str) static attr_list_t *append_attr(attr_list_t *list, attr_t *attr) { + attr_t *attr_existing; if (!attr) return list; if (!list) { list = xmalloc( sizeof(*list) ); list_init( list ); } + LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry) + if (attr_existing->type == attr->type) + { + parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type)); + /* use the last attribute, like MIDL does */ + list_remove(&attr_existing->entry); + break; + } list_add_tail( list, &attr->entry ); return list; } @@ -1168,7 +1190,7 @@ static expr_t *make_expr1(enum expr_type type, expr_t *expr) { expr_t *e; if (type == EXPR_ADDRESSOF && expr->type != EXPR_IDENTIFIER) - error("address-of operator applied to invalid expression\n"); + error_loc("address-of operator applied to invalid expression\n"); e = xmalloc(sizeof(expr_t)); e->type = type; e->ref = expr; @@ -1372,7 +1394,7 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ } } else if (!arr && ptr_attr) - error("%s: pointer attribute applied to non-pointer type\n", v->name); + error_loc("%s: pointer attribute applied to non-pointer type\n", v->name); } if (pident && pident->is_func) { @@ -1394,7 +1416,7 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ if (arr) LIST_FOR_EACH_ENTRY_REV(dim, arr, expr_t, entry) { if (sizeless) - error("%s: only the first array dimension can be unspecified\n", v->name); + error_loc("%s: only the first array dimension can be unspecified\n", v->name); if (dim->is_const) { @@ -1402,10 +1424,10 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ size_t size = type_memsize(v->type, &align); if (dim->cval <= 0) - error("%s: array dimension must be positive\n", v->name); + error_loc("%s: array dimension must be positive\n", v->name); if (0xffffffffuL / size < (unsigned long) dim->cval) - error("%s: total array size is too large\n", v->name); + error_loc("%s: total array size is too large\n", v->name); else if (0xffffuL < size * dim->cval) v->type = make_type(RPC_FC_LGFARRAY, v->type); else @@ -1431,10 +1453,10 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ atype = *ptype = duptype(*ptype, 0); if (atype->type == RPC_FC_SMFARRAY || atype->type == RPC_FC_LGFARRAY) - error("%s: cannot specify size_is for a fixed sized array\n", v->name); + error_loc("%s: cannot specify size_is for a fixed sized array\n", v->name); if (atype->type != RPC_FC_CARRAY && !is_ptr(atype)) - error("%s: size_is attribute applied to illegal type\n", v->name); + error_loc("%s: size_is attribute applied to illegal type\n", v->name); atype->type = RPC_FC_CARRAY; atype->size_is = dim; @@ -1442,7 +1464,7 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ ptype = &(*ptype)->ref; if (*ptype == NULL) - error("%s: too many expressions in size_is attribute\n", v->name); + error_loc("%s: too many expressions in size_is attribute\n", v->name); } ptype = &v->type; @@ -1460,14 +1482,14 @@ static void set_type(var_t *v, type_t *type, const pident_t *pident, array_dims_ else if (atype->type == RPC_FC_CARRAY) atype->type = RPC_FC_CVARRAY; else - error("%s: length_is attribute applied to illegal type\n", v->name); + error_loc("%s: length_is attribute applied to illegal type\n", v->name); atype->length_is = dim; } ptype = &(*ptype)->ref; if (*ptype == NULL) - error("%s: too many expressions in length_is attribute\n", v->name); + error_loc("%s: too many expressions in length_is attribute\n", v->name); } if (has_varconf && !last_array(v->type)) @@ -1543,6 +1565,9 @@ static var_t *make_var(char *name) v->type = NULL; v->attrs = NULL; v->eval = NULL; + v->loc_info.input_name = input_name ? input_name : "stdin"; + v->loc_info.line_number = line_number; + v->loc_info.near_text = parser_text; return v; } @@ -2114,12 +2139,287 @@ static void process_typedefs(pident_list_t *pidents) } } +struct allowed_attr +{ + unsigned int dce_compatible : 1; + unsigned int acf : 1; + unsigned int on_interface : 1; + unsigned int on_function : 1; + unsigned int on_arg : 1; + unsigned int on_type : 1; + unsigned int on_field : 1; + unsigned int on_library : 1; + unsigned int on_dispinterface : 1; + unsigned int on_module : 1; + unsigned int on_coclass : 1; + const char *display_name; +}; + +struct allowed_attr allowed_attr[] = +{ + /* attr { D ACF I Fn ARG T Fi L DI M C } */ + /* ATTR_AGGREGATABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "aggregatable" }, + /* ATTR_APPOBJECT */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "appobject" }, + /* ATTR_ASYNC */ { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, "async" }, + /* ATTR_AUTO_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "auto_handle" }, + /* ATTR_BINDABLE */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "bindable" }, + /* ATTR_BROADCAST */ { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "broadcast" }, + /* ATTR_CALLAS */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "call_as" }, + /* ATTR_CALLCONV */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, + /* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" }, + /* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "context_handle" }, + /* ATTR_CONTROL */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" }, + /* ATTR_DEFAULT */ { 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, "default" }, + /* ATTR_DEFAULTCOLLELEM */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" }, + /* ATTR_DEFAULTVALUE_EXPR */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "defaultvalue" }, + /* ATTR_DEFAULTVALUE_STRING */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "defaultvalue" }, + /* ATTR_DEFAULTVTABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "defaultvtable" }, + /* ATTR_DISPINTERFACE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, + /* ATTR_DISPLAYBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "displaybind" }, + /* ATTR_DLLNAME */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "dllname" }, + /* ATTR_DUAL */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "dual" }, + /* ATTR_ENDPOINT */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" }, + /* ATTR_ENTRY_ORDINAL */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "entry" }, + /* ATTR_ENTRY_STRING */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "entry" }, + /* ATTR_EXPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" }, + /* ATTR_HANDLE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "handle" }, + /* ATTR_HELPCONTEXT */ { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpcontext" }, + /* ATTR_HELPFILE */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpfile" }, + /* ATTR_HELPSTRING */ { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpstring" }, + /* ATTR_HELPSTRINGCONTEXT */ { 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, "helpstringcontext" }, + /* ATTR_HELPSTRINGDLL */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpstringdll" }, + /* ATTR_HIDDEN */ { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, "hidden" }, + /* ATTR_ID */ { 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, "id" }, + /* ATTR_IDEMPOTENT */ { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "idempotent" }, + /* ATTR_IIDIS */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "iid_is" }, + /* ATTR_IMMEDIATEBIND */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "immediatebind" }, + /* ATTR_IMPLICIT_HANDLE */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" }, + /* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "in" }, + /* ATTR_INPUTSYNC */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" }, + /* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "length_is" }, + /* ATTR_LOCAL */ { 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, "local" }, + /* ATTR_NONBROWSABLE */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" }, + /* ATTR_NONCREATABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "noncreatable" }, + /* ATTR_NONEXTENSIBLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "nonextensible" }, + /* ATTR_OBJECT */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "object" }, + /* ATTR_ODL */ { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, "odl" }, + /* ATTR_OLEAUTOMATION */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" }, + /* ATTR_OPTIONAL */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "optional" }, + /* ATTR_OUT */ { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "out" }, + /* ATTR_POINTERDEFAULT */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" }, + /* ATTR_POINTERTYPE */ { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, "ref, unique or ptr" }, + /* ATTR_PROPGET */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propget" }, + /* ATTR_PROPPUT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propput" }, + /* ATTR_PROPPUTREF */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "propputref" }, + /* ATTR_PUBLIC */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "public" }, + /* ATTR_RANGE */ { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, "range" }, + /* ATTR_READONLY */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "readonly" }, + /* ATTR_REQUESTEDIT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "requestedit" }, + /* ATTR_RESTRICTED */ { 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, "restricted" }, + /* ATTR_RETVAL */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "retval" }, + /* ATTR_SIZEIS */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "size_is" }, + /* ATTR_SOURCE */ { 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, "source" }, + /* ATTR_STRICTCONTEXTHANDLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "strict_context_handle" }, + /* ATTR_STRING */ { 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, "string" }, + /* ATTR_SWITCHIS */ { 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "switch_is" }, + /* ATTR_SWITCHTYPE */ { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, "switch_type" }, + /* ATTR_TRANSMITAS */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "transmit_as" }, + /* ATTR_UUID */ { 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, "uuid" }, + /* ATTR_V1ENUM */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "v1_enum" }, + /* ATTR_VARARG */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "vararg" }, + /* ATTR_VERSION */ { 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, "version" }, + /* ATTR_WIREMARSHAL */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "wire_marshal" }, +}; + +const char *get_attr_display_name(enum attr_type type) +{ + return allowed_attr[type].display_name; +} + +static const attr_list_t *check_iface_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_interface) + error_loc("inapplicable attribute %s for interface %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_function) + error_loc("inapplicable attribute %s for function %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + static void check_arg(var_t *arg) { - type_t *t = arg->type; + const type_t *t = arg->type; + const attr_t *attr; if (t->type == 0 && ! is_var_ptr(arg)) error_loc("argument '%s' has void type\n", arg->name); + + if (arg->attrs) + { + LIST_FOR_EACH_ENTRY(attr, arg->attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_arg) + error_loc("inapplicable attribute %s for argument %s\n", + allowed_attr[attr->type].display_name, arg->name); + } + } +} + +static attr_list_t *check_typedef_attrs(attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_type) + error_loc("inapplicable attribute %s for typedef\n", + allowed_attr[attr->type].display_name); + } + return attrs; +} + +static attr_list_t *check_field_attrs(const char *name, attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_field) + error_loc("inapplicable attribute %s for field %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static const attr_list_t *check_library_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_library) + error_loc("inapplicable attribute %s for library %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_dispinterface) + error_loc("inapplicable attribute %s for dispinterface %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static const attr_list_t *check_module_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_module) + error_loc("inapplicable attribute %s for module %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +static const attr_list_t *check_coclass_attrs(const char *name, const attr_list_t *attrs) +{ + const attr_t *attr; + if (!attrs) return attrs; + LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry) + { + if (!allowed_attr[attr->type].on_coclass) + error_loc("inapplicable attribute %s for coclass %s\n", + allowed_attr[attr->type].display_name, name); + } + return attrs; +} + +/* checks that arguments for a function make sense for marshalling and unmarshalling */ +static void check_remoting_args(const func_t *func) +{ + const char *funcname = func->def->name; + const var_t *arg; + + if (func->args) LIST_FOR_EACH_ENTRY( arg, func->args, const var_t, entry ) + { + int ptr_level = 0; + const type_t *type = arg->type; + int is_wire_marshal = 0; + int is_context_handle = 0; + + /* get pointer level and fundamental type for the argument */ + for (;;) + { + if (!is_wire_marshal && is_attr(type->attrs, ATTR_WIREMARSHAL)) + is_wire_marshal = 1; + if (!is_context_handle && is_attr(type->attrs, ATTR_CONTEXTHANDLE)) + is_context_handle = 1; + if (type->kind == TKIND_ALIAS) + type = type->orig; + else if (is_ptr(type)) + { + ptr_level++; + type = type->ref; + } + else + break; + } + + /* check that [out] parameters have enough pointer levels */ + if (is_attr(arg->attrs, ATTR_OUT)) + { + if (!is_array(type)) + { + if (!ptr_level) + error_loc_info(&arg->loc_info, "out parameter \'%s\' of function \'%s\' is not a pointer\n", arg->name, funcname); + if (type->type == RPC_FC_IP && ptr_level == 1) + error_loc_info(&arg->loc_info, "out interface pointer \'%s\' of function \'%s\' is not a double pointer\n", arg->name, funcname); + } + } + + if (type->type == 0 && !is_attr(arg->attrs, ATTR_IIDIS) && !is_wire_marshal && !is_context_handle) + error_loc_info(&arg->loc_info, "parameter \'%s\' of function \'%s\' cannot derive from void *\n", arg->name, funcname); + else if (type->type == RPC_FC_FUNCTION) + error_loc_info(&arg->loc_info, "parameter \'%s\' of function \'%s\' cannot be a function pointer\n", arg->name, funcname); + } +} + +static void check_functions(const type_t *iface) +{ + if (!is_inside_library && !is_attr(iface->attrs, ATTR_LOCAL)) + { + const func_t *func; + if (iface->funcs) LIST_FOR_EACH_ENTRY( func, iface->funcs, const func_t, entry ) + { + if (!is_attr(func->def->attrs, ATTR_LOCAL)) + check_remoting_args(func); + } + } } static void check_all_user_types(ifref_list_t *ifrefs) diff --git a/reactos/tools/widl/proxy.c b/reactos/tools/widl/proxy.c index b818288b810..e3c89eeac00 100644 --- a/reactos/tools/widl/proxy.c +++ b/reactos/tools/widl/proxy.c @@ -253,10 +253,12 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, var_t *def = cur->def; int has_ret = !is_void(get_func_return_type(cur)); int has_full_pointer = is_full_pointer_function(cur); + const char *callconv = get_attrp(def->type->attrs, ATTR_CALLCONV); + if (!callconv) callconv = ""; indent = 0; write_type_decl_left(proxy, get_func_return_type(cur)); - print_proxy( " STDMETHODCALLTYPE %s_", iface->name); + print_proxy( " %s %s_", callconv, iface->name); write_name(proxy, def); print_proxy( "_Proxy(\n"); write_args(proxy, cur->args, iface->name, 1, TRUE); diff --git a/reactos/tools/widl/typelib.c b/reactos/tools/widl/typelib.c index 43d16ec2760..a126debc9eb 100644 --- a/reactos/tools/widl/typelib.c +++ b/reactos/tools/widl/typelib.c @@ -240,7 +240,7 @@ unsigned short get_type_vt(type_t *t) return 0; } -void start_typelib(char *name, attr_list_t *attrs) +void start_typelib(char *name, const attr_list_t *attrs) { in_typelib++; if (!do_typelib) return; diff --git a/reactos/tools/widl/typelib.h b/reactos/tools/widl/typelib.h index b17387dfc39..9dce14ae072 100644 --- a/reactos/tools/widl/typelib.h +++ b/reactos/tools/widl/typelib.h @@ -22,7 +22,7 @@ #define __WIDL_TYPELIB_H extern int in_typelib; -extern void start_typelib(char *name, attr_list_t *attrs); +extern void start_typelib(char *name, const attr_list_t *attrs); extern void end_typelib(void); extern void add_typelib_entry(type_t *t); extern void add_importlib(const char *name); diff --git a/reactos/tools/widl/utils.c b/reactos/tools/widl/utils.c index ed950f6095d..9c4452fa6af 100644 --- a/reactos/tools/widl/utils.c +++ b/reactos/tools/widl/utils.c @@ -33,6 +33,8 @@ #include "utils.h" #include "parser.h" +#define CURRENT_LOCATION { input_name ? input_name : "stdin", line_number, parser_text } + static const int want_near_indication = 0; static void make_print(char *str) @@ -45,17 +47,17 @@ static void make_print(char *str) } } -static void generic_msg(const char *s, const char *t, const char *n, va_list ap) +static void generic_msg(const loc_info_t *loc_info, const char *s, const char *t, va_list ap) { - fprintf(stderr, "%s:%d: %s: ", input_name ? input_name : "stdin", line_number, t); + fprintf(stderr, "%s:%d: %s: ", loc_info->input_name, loc_info->line_number, t); vfprintf(stderr, s, ap); if (want_near_indication) { char *cpy; - if(n) + if(loc_info->near_text) { - cpy = xstrdup(n); + cpy = xstrdup(loc_info->near_text); make_print(cpy); fprintf(stderr, " near '%s'", cpy); free(cpy); @@ -67,9 +69,10 @@ static void generic_msg(const char *s, const char *t, const char *n, va_list ap) /* yyerror: yacc assumes this is not newline terminated. */ int parser_error(const char *s, ...) { + loc_info_t cur_location = CURRENT_LOCATION; va_list ap; va_start(ap, s); - generic_msg(s, "Error", parser_text, ap); + generic_msg(&cur_location, s, "Error", ap); fprintf(stderr, "\n"); va_end(ap); exit(1); @@ -78,18 +81,29 @@ int parser_error(const char *s, ...) void error_loc(const char *s, ...) { + loc_info_t cur_loc = CURRENT_LOCATION; va_list ap; va_start(ap, s); - generic_msg(s, "Error", parser_text, ap); + generic_msg(&cur_loc, s, "Error", ap); + va_end(ap); + exit(1); +} + +void error_loc_info(const loc_info_t *loc_info, const char *s, ...) +{ + va_list ap; + va_start(ap, s); + generic_msg(loc_info, s, "Error", ap); va_end(ap); exit(1); } int parser_warning(const char *s, ...) { + loc_info_t cur_loc = CURRENT_LOCATION; va_list ap; va_start(ap, s); - generic_msg(s, "Warning", parser_text, ap); + generic_msg(&cur_loc, s, "Warning", ap); va_end(ap); return 0; } @@ -113,6 +127,14 @@ void warning(const char *s, ...) va_end(ap); } +void warning_loc_info(const loc_info_t *loc_info, const char *s, ...) +{ + va_list ap; + va_start(ap, s); + generic_msg(loc_info, s, "Warning", ap); + va_end(ap); +} + void chat(const char *s, ...) { if(debuglevel & DEBUGLEVEL_CHAT) diff --git a/reactos/tools/widl/utils.h b/reactos/tools/widl/utils.h index 7d6ce5c5f30..73adf54ad80 100644 --- a/reactos/tools/widl/utils.h +++ b/reactos/tools/widl/utils.h @@ -37,7 +37,9 @@ int parser_error(const char *s, ...) __attribute__((format (printf, 1, 2))); int parser_warning(const char *s, ...) __attribute__((format (printf, 1, 2))); void error_loc(const char *s, ...) __attribute__((format (printf, 1, 2))); void error(const char *s, ...) __attribute__((format (printf, 1, 2))); +void error_loc_info(const loc_info_t *, const char *s, ...) __attribute__((format (printf, 2, 3))); void warning(const char *s, ...) __attribute__((format (printf, 1, 2))); +void warning_loc_info(const loc_info_t *, const char *s, ...) __attribute__((format (printf, 2, 3))); void chat(const char *s, ...) __attribute__((format (printf, 1, 2))); char *dup_basename(const char *name, const char *ext); diff --git a/reactos/tools/widl/widltypes.h b/reactos/tools/widl/widltypes.h index f99e31af585..48a426bed77 100644 --- a/reactos/tools/widl/widltypes.h +++ b/reactos/tools/widl/widltypes.h @@ -45,6 +45,7 @@ typedef GUID UUID; #define RPC_FC_FUNCTION 0xfe +typedef struct _loc_info_t loc_info_t; typedef struct _attr_t attr_t; typedef struct _expr_t expr_t; typedef struct _type_t type_t; @@ -78,6 +79,7 @@ enum attr_type ATTR_ASYNC, ATTR_AUTO_HANDLE, ATTR_BINDABLE, + ATTR_BROADCAST, ATTR_CALLAS, ATTR_CALLCONV, /* calling convention pseudo-attribute */ ATTR_CASE, @@ -184,6 +186,13 @@ enum type_kind TKIND_MAX }; +struct _loc_info_t +{ + const char *input_name; + int line_number; + const char *near_text; +}; + struct str_list_entry_t { char *str; @@ -248,6 +257,8 @@ struct _var_t { attr_list_t *attrs; expr_t *eval; + struct _loc_info_t loc_info; + /* parser-internal */ struct list entry; }; @@ -316,7 +327,7 @@ struct _importlib_t { struct _typelib_t { char *name; char *filename; - attr_list_t *attrs; + const attr_list_t *attrs; struct list entries; struct list importlibs; }; diff --git a/reactos/tools/widl/write_msft.c b/reactos/tools/widl/write_msft.c index 7b3878d7b45..3ecd5c4740f 100644 --- a/reactos/tools/widl/write_msft.c +++ b/reactos/tools/widl/write_msft.c @@ -1317,10 +1317,14 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, const func_t *func, int expr_t *expr = attr->u.pval; switch(attr->type) { case ATTR_BINDABLE: - funcflags |= 0x4; /* FUNCFLAG_BINDABLE */ + funcflags |= 0x4; /* FUNCFLAG_FBINDABLE */ + break; + /* FIXME: FUNCFLAG_FDEFAULTBIND */ + case ATTR_DEFAULTCOLLELEM: + funcflags |= 0x100; /* FUNCFLAG_FDEFAULTCOLLELEM */ break; case ATTR_DISPLAYBIND: - funcflags |= 0x10; /* FUNCFLAG_DISPLAYBIND */ + funcflags |= 0x10; /* FUNCFLAG_FDISPLAYBIND */ break; case ATTR_ENTRY_ORDINAL: extra_attr = max(extra_attr, 3); @@ -1349,8 +1353,11 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, const func_t *func, int case ATTR_ID: id = expr->cval; break; + case ATTR_IMMEDIATEBIND: + funcflags |= 0x1000; /* FUNCFLAG_FIMMEDIATEBIND */ + break; case ATTR_NONBROWSABLE: - funcflags |= 0x400; /* FUNCFLAG_NONBROWSABLE */ + funcflags |= 0x400; /* FUNCFLAG_FNONBROWSABLE */ break; case ATTR_OUT: break; @@ -1363,9 +1370,18 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, const func_t *func, int case ATTR_PROPPUTREF: invokekind = 0x8; /* INVOKE_PROPERTYPUTREF */ break; + /* FIXME: FUNCFLAG_FREPLACEABLE */ + case ATTR_REQUESTEDIT: + funcflags |= 0x8; /* FUNCFLAG_FREQUESTEDIT */ + break; case ATTR_RESTRICTED: funcflags |= 0x1; /* FUNCFLAG_FRESTRICTED */ break; + case ATTR_SOURCE: + funcflags |= 0x2; /* FUNCFLAG_FSOURCE */ + break; + /* FIXME: FUNCFLAG_FUIDEFAULT */ + /* FIXME: FUNCFLAG_FUSESGETLASTERROR */ case ATTR_VARARG: if (num_optional || num_defaults) warning("add_func_desc: ignoring vararg in function with optional or defaultvalue params\n"); @@ -1373,7 +1389,6 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, const func_t *func, int num_optional = -1; break; default: - warning("add_func_desc: ignoring attr %d\n", attr->type); break; } } @@ -1595,23 +1610,44 @@ static HRESULT add_var_desc(msft_typeinfo_t *typeinfo, UINT index, var_t* var) if (var->attrs) LIST_FOR_EACH_ENTRY( attr, var->attrs, const attr_t, entry ) { expr_t *expr = attr->u.pval; switch(attr->type) { + case ATTR_BINDABLE: + varflags |= 0x04; /* VARFLAG_FBINDABLE */ + break; + /* FIXME: VARFLAG_FDEFAULTBIND */ + case ATTR_DEFAULTCOLLELEM: + varflags |= 0x100; /* VARFLAG_FDEFAULTCOLLELEM */ + break; + case ATTR_DISPLAYBIND: + varflags |= 0x10; /* VARFLAG_FDISPLAYBIND */ + break; case ATTR_HIDDEN: varflags |= 0x40; /* VARFLAG_FHIDDEN */ break; case ATTR_ID: id = expr->cval; break; + case ATTR_IMMEDIATEBIND: + varflags |= 0x1000; /* VARFLAG_FIMMEDIATEBIND */ + break; + case ATTR_NONBROWSABLE: + varflags |= 0x400; /* VARFLAG_FNONBROWSABLE */ + break; case ATTR_READONLY: varflags |= 0x01; /* VARFLAG_FREADONLY */ break; + /* FIXME: VARFLAG_FREPLACEABLE */ + break; + case ATTR_REQUESTEDIT: + varflags |= 0x08; /* VARFLAG_FREQUESTEDIT */ + break; case ATTR_RESTRICTED: varflags |= 0x80; /* VARFLAG_FRESTRICTED */ break; case ATTR_SOURCE: varflags |= 0x02; /* VARFLAG_FSOURCE */ break; + /* FIXME: VARFLAG_FUIDEFAULT */ default: - warning("AddVarDesc: unhandled attr type %d\n", attr->type); break; } } @@ -1799,9 +1835,6 @@ static msft_typeinfo_t *create_msft_typeinfo(msft_typelib_t *typelib, enum type_ typeinfo->flags |= 0x20; /* TYPEFLAG_FCONTROL */ break; - case ATTR_DISPINTERFACE: - break; - case ATTR_DLLNAME: { int offset = ctl2_alloc_string(typelib, attr->u.pval); @@ -1838,8 +1871,7 @@ static msft_typeinfo_t *create_msft_typeinfo(msft_typelib_t *typelib, enum type_ typeinfo->flags |= 0x10; /* TYPEFLAG_FHIDDEN */ break; - case ATTR_LOCAL: - break; + /* FIXME: TYPEFLAG_FLICENSED */ case ATTR_NONCREATABLE: typeinfo->flags &= ~0x2; /* TYPEFLAG_FCANCREATE */ @@ -1849,18 +1881,15 @@ static msft_typeinfo_t *create_msft_typeinfo(msft_typelib_t *typelib, enum type_ typeinfo->flags |= 0x80; /* TYPEFLAG_FNONEXTENSIBLE */ break; - case ATTR_OBJECT: - break; - - case ATTR_ODL: - break; - case ATTR_OLEAUTOMATION: typeinfo->flags |= 0x100; /* TYPEFLAG_FOLEAUTOMATION */ break; - case ATTR_PUBLIC: - break; + /* FIXME: TYPEFLAG_FPREDCLID */ + + /* FIXME: TYPEFLAG_FPROXY */ + + /* FIXME: TYPEFLAG_FREPLACEABLE */ case ATTR_RESTRICTED: typeinfo->flags |= 0x200; /* TYPEFLAG_FRESTRICTED */ @@ -1883,7 +1912,6 @@ static msft_typeinfo_t *create_msft_typeinfo(msft_typelib_t *typelib, enum type_ break; default: - warning("create_msft_typeinfo: ignoring attr %d\n", attr->type); break; } } @@ -2102,6 +2130,9 @@ static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls) case ATTR_DEFAULT: ref->flags |= 0x1; /* IMPLTYPEFLAG_FDEFAULT */ break; + case ATTR_DEFAULTVTABLE: + ref->flags |= 0x8; /* IMPLTYPEFLAG_FDEFAULTVTABLE */ + break; case ATTR_RESTRICTED: ref->flags |= 0x4; /* IMPLTYPEFLAG_FRESTRICTED */ break;