merge in Winehq changes to reduce noise
[reactos.git] / reactos / tools / widl / parser.y
index 80b7815..4d27f2f 100644 (file)
 #include <alloca.h>
 #endif
 
 #include <alloca.h>
 #endif
 
-#include "windef.h"
-
 #include "widl.h"
 #include "utils.h"
 #include "parser.h"
 #include "header.h"
 #include "widl.h"
 #include "utils.h"
 #include "parser.h"
 #include "header.h"
-#include "proxy.h"
 #include "typelib.h"
 
 #if defined(YYBYACC)
 #include "typelib.h"
 
 #if defined(YYBYACC)
@@ -138,7 +135,7 @@ static type_t std_uhyper = { "MIDL_uhyper" };
 %token tDLLNAME tDOUBLE tDUAL
 %token tENDPOINT
 %token tENTRY tENUM tERRORSTATUST
 %token tDLLNAME tDOUBLE tDUAL
 %token tENDPOINT
 %token tENTRY tENUM tERRORSTATUST
-%token tEXTERN
+%token tEXPLICITHANDLE tEXTERN
 %token tFLOAT
 %token tHANDLE
 %token tHANDLET
 %token tFLOAT
 %token tHANDLE
 %token tHANDLET
@@ -147,6 +144,7 @@ static type_t std_uhyper = { "MIDL_uhyper" };
 %token tHIDDEN
 %token tHYPER tID tIDEMPOTENT
 %token tIIDIS
 %token tHIDDEN
 %token tHYPER tID tIDEMPOTENT
 %token tIIDIS
+%token tIMPLICITHANDLE
 %token tIMPORT tIMPORTLIB
 %token tIN tINCLUDE tINLINE
 %token tINPUTSYNC
 %token tIMPORT tIMPORTLIB
 %token tIN tINCLUDE tINLINE
 %token tINPUTSYNC
@@ -171,6 +169,7 @@ static type_t std_uhyper = { "MIDL_uhyper" };
 %token tSHORT
 %token tSIGNED
 %token tSIZEIS tSIZEOF
 %token tSHORT
 %token tSIGNED
 %token tSIZEIS tSIZEOF
+%token tSMALL
 %token tSOURCE
 %token tSTDCALL
 %token tSTRING tSTRUCT
 %token tSOURCE
 %token tSTDCALL
 %token tSTRING tSTRUCT
@@ -224,7 +223,7 @@ static type_t std_uhyper = { "MIDL_uhyper" };
 
 %%
 
 
 %%
 
-input:   gbl_statements                        { write_proxies($1); }
+input:   gbl_statements                        { write_proxies($1); write_client($1); write_server($1); }
        ;
 
 gbl_statements:                                        { $$ = NULL; }
        ;
 
 gbl_statements:                                        { $$ = NULL; }
@@ -333,6 +332,7 @@ attrib_list: attribute
 
 attribute:
          tASYNC                                { $$ = make_attr(ATTR_ASYNC); }
 
 attribute:
          tASYNC                                { $$ = make_attr(ATTR_ASYNC); }
+       | tAUTOHANDLE                           { $$ = make_attr(ATTR_AUTO_HANDLE); }
        | tCALLAS '(' ident ')'                 { $$ = make_attrp(ATTR_CALLAS, $3); }
        | tCASE '(' expr_list_const ')'         { $$ = make_attrp(ATTR_CASE, $3); }
        | tCONTEXTHANDLE                        { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); }
        | tCALLAS '(' ident ')'                 { $$ = make_attrp(ATTR_CALLAS, $3); }
        | tCASE '(' expr_list_const ')'         { $$ = make_attrp(ATTR_CASE, $3); }
        | tCONTEXTHANDLE                        { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); }
@@ -347,6 +347,7 @@ attribute:
        | tENDPOINT '(' aSTRING ')'             { $$ = make_attrp(ATTR_ENDPOINT, $3); }
        | tENTRY '(' aSTRING ')'                { $$ = make_attrp(ATTR_ENTRY_STRING, $3); }
        | tENTRY '(' expr_const ')'             { $$ = make_attrp(ATTR_ENTRY_ORDINAL, $3); }
        | tENDPOINT '(' aSTRING ')'             { $$ = make_attrp(ATTR_ENDPOINT, $3); }
        | tENTRY '(' aSTRING ')'                { $$ = make_attrp(ATTR_ENTRY_STRING, $3); }
        | tENTRY '(' expr_const ')'             { $$ = make_attrp(ATTR_ENTRY_ORDINAL, $3); }
+       | tEXPLICITHANDLE                       { $$ = make_attr(ATTR_EXPLICIT_HANDLE); }
        | tHANDLE                               { $$ = make_attr(ATTR_HANDLE); }
        | tHELPCONTEXT '(' expr_const ')'       { $$ = make_attrp(ATTR_HELPCONTEXT, $3); }
        | tHELPFILE '(' aSTRING ')'             { $$ = make_attrp(ATTR_HELPFILE, $3); }
        | tHANDLE                               { $$ = make_attr(ATTR_HANDLE); }
        | tHELPCONTEXT '(' expr_const ')'       { $$ = make_attrp(ATTR_HELPCONTEXT, $3); }
        | tHELPFILE '(' aSTRING ')'             { $$ = make_attrp(ATTR_HELPFILE, $3); }
@@ -357,6 +358,7 @@ attribute:
        | tID '(' expr_const ')'                { $$ = make_attrp(ATTR_ID, $3); }
        | tIDEMPOTENT                           { $$ = make_attr(ATTR_IDEMPOTENT); }
        | tIIDIS '(' ident ')'                  { $$ = make_attrp(ATTR_IIDIS, $3); }
        | tID '(' expr_const ')'                { $$ = make_attrp(ATTR_ID, $3); }
        | tIDEMPOTENT                           { $$ = make_attr(ATTR_IDEMPOTENT); }
        | tIIDIS '(' ident ')'                  { $$ = make_attrp(ATTR_IIDIS, $3); }
+       | tIMPLICITHANDLE '(' tHANDLET aIDENTIFIER ')'  { $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $4); }
        | tIN                                   { $$ = make_attr(ATTR_IN); }
        | tINPUTSYNC                            { $$ = make_attr(ATTR_INPUTSYNC); }
        | tLENGTHIS '(' m_exprs ')'             { $$ = make_attrp(ATTR_LENGTHIS, $3); }
        | tIN                                   { $$ = make_attr(ATTR_IN); }
        | tINPUTSYNC                            { $$ = make_attr(ATTR_INPUTSYNC); }
        | tLENGTHIS '(' m_exprs ')'             { $$ = make_attrp(ATTR_LENGTHIS, $3); }
@@ -365,7 +367,7 @@ attribute:
        | tOBJECT                               { $$ = make_attr(ATTR_OBJECT); }
        | tODL                                  { $$ = make_attr(ATTR_ODL); }
        | tOLEAUTOMATION                        { $$ = make_attr(ATTR_OLEAUTOMATION); }
        | tOBJECT                               { $$ = make_attr(ATTR_OBJECT); }
        | tODL                                  { $$ = make_attr(ATTR_ODL); }
        | tOLEAUTOMATION                        { $$ = make_attr(ATTR_OLEAUTOMATION); }
-       | tOPTIONAL                             { $$ = make_attr(ATTR_OPTIONAL); }
+       | tOPTIONAL                             { $$ = make_attr(ATTR_OPTIONAL); }
        | tOUT                                  { $$ = make_attr(ATTR_OUT); }
        | tPOINTERDEFAULT '(' pointer_type ')'  { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); }
        | tPROPGET                              { $$ = make_attr(ATTR_PROPGET); }
        | tOUT                                  { $$ = make_attr(ATTR_OUT); }
        | tPOINTERDEFAULT '(' pointer_type ')'  { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); }
        | tPROPGET                              { $$ = make_attr(ATTR_PROPGET); }
@@ -431,19 +433,19 @@ enum_list: enum
 enum:    ident '=' expr_const                  { $$ = reg_const($1);
                                                  $$->eval = $3;
                                                  $$->lval = $3->cval;
 enum:    ident '=' expr_const                  { $$ = reg_const($1);
                                                  $$->eval = $3;
                                                  $$->lval = $3->cval;
-                                                  $$->type = make_type(RPC_FC_LONG, &std_int);
+                                                 $$->type = make_type(RPC_FC_LONG, &std_int);
                                                }
        | ident                                 { $$ = reg_const($1);
                                                  $$->lval = 0; /* default for first enum entry */
                                                }
        | ident                                 { $$ = reg_const($1);
                                                  $$->lval = 0; /* default for first enum entry */
-                                                  $$->type = make_type(RPC_FC_LONG, &std_int);
+                                                 $$->type = make_type(RPC_FC_LONG, &std_int);
                                                }
        ;
 
 enumdef: tENUM t_ident '{' enums '}'           { $$ = get_typev(RPC_FC_ENUM16, $2, tsENUM);
                                                  $$->fields = $4;
                                                  $$->defined = TRUE;
                                                }
        ;
 
 enumdef: tENUM t_ident '{' enums '}'           { $$ = get_typev(RPC_FC_ENUM16, $2, tsENUM);
                                                  $$->fields = $4;
                                                  $$->defined = TRUE;
-                                                  if(in_typelib)
-                                                      add_enum($$);
+                                                 if(in_typelib)
+                                                     add_enum($$);
                                                }
        ;
 
                                                }
        ;
 
@@ -490,7 +492,8 @@ expr_list_const: expr_const
        ;
 
 expr_const: expr                               { $$ = $1;
        ;
 
 expr_const: expr                               { $$ = $1;
-                                                 if (!$$->is_const) yyerror("expression is not constant\n");
+                                                 if (!$$->is_const)
+                                                     yyerror("expression is not constant\n");
                                                }
        ;
 
                                                }
        ;
 
@@ -548,7 +551,7 @@ base_type: tBYTE                            { $$ = make_type(RPC_FC_BYTE, NULL); }
        | tSIGNED int_std                       { $$ = $2; $$->sign = 1; }
        | tUNSIGNED int_std                     { $$ = $2; $$->sign = -1;
                                                  switch ($$->type) {
        | tSIGNED int_std                       { $$ = $2; $$->sign = 1; }
        | tUNSIGNED int_std                     { $$ = $2; $$->sign = -1;
                                                  switch ($$->type) {
-                                                 case RPC_FC_CHAR:  $$->type = RPC_FC_BYTE; $$->sign = 0; break;
+                                                 case RPC_FC_CHAR: break;
                                                  case RPC_FC_SMALL: $$->type = RPC_FC_USMALL; break;
                                                  case RPC_FC_SHORT: $$->type = RPC_FC_USHORT; break;
                                                  case RPC_FC_LONG:  $$->type = RPC_FC_ULONG;  break;
                                                  case RPC_FC_SMALL: $$->type = RPC_FC_USMALL; break;
                                                  case RPC_FC_SHORT: $$->type = RPC_FC_USHORT; break;
                                                  case RPC_FC_LONG:  $$->type = RPC_FC_ULONG;  break;
@@ -560,9 +563,9 @@ base_type: tBYTE                            { $$ = make_type(RPC_FC_BYTE, NULL); }
                                                }
        | tFLOAT                                { $$ = make_type(RPC_FC_FLOAT, NULL); }
        | tDOUBLE                               { $$ = make_type(RPC_FC_DOUBLE, NULL); }
                                                }
        | tFLOAT                                { $$ = make_type(RPC_FC_FLOAT, NULL); }
        | tDOUBLE                               { $$ = make_type(RPC_FC_DOUBLE, NULL); }
-       | tBOOLEAN                              { $$ = make_type(RPC_FC_BYTE, &std_bool); /* ? */ }
+       | tBOOLEAN                              { $$ = make_type(RPC_FC_SMALL, &std_bool); }
        | tERRORSTATUST                         { $$ = make_type(RPC_FC_ERROR_STATUS_T, NULL); }
        | tERRORSTATUST                         { $$ = make_type(RPC_FC_ERROR_STATUS_T, NULL); }
-       | tHANDLET                              { $$ = make_type(RPC_FC_BIND_PRIMITIVE, NULL); /* ? */ }
+       | tHANDLET                              { $$ = make_type(RPC_FC_IGNORE, NULL); }
        ;
 
 m_int:
        ;
 
 m_int:
@@ -570,6 +573,7 @@ m_int:
        ;
 
 int_std:  tINT                                 { $$ = make_type(RPC_FC_LONG, &std_int); } /* win32 only */
        ;
 
 int_std:  tINT                                 { $$ = make_type(RPC_FC_LONG, &std_int); } /* win32 only */
+       | tSMALL m_int                          { $$ = make_type(RPC_FC_SMALL, NULL); }
        | tSHORT m_int                          { $$ = make_type(RPC_FC_SHORT, NULL); }
        | tLONG m_int                           { $$ = make_type(RPC_FC_LONG, NULL); }
        | tHYPER m_int                          { $$ = make_type(RPC_FC_HYPER, NULL); }
        | tSHORT m_int                          { $$ = make_type(RPC_FC_SHORT, NULL); }
        | tLONG m_int                           { $$ = make_type(RPC_FC_LONG, NULL); }
        | tHYPER m_int                          { $$ = make_type(RPC_FC_HYPER, NULL); }
@@ -713,13 +717,13 @@ pointer_type:
        ;
 
 structdef: tSTRUCT t_ident '{' fields '}'      { $$ = get_typev(RPC_FC_STRUCT, $2, tsSTRUCT);
        ;
 
 structdef: tSTRUCT t_ident '{' fields '}'      { $$ = get_typev(RPC_FC_STRUCT, $2, tsSTRUCT);
-                                                  /* overwrite RPC_FC_STRUCT with a more exact type */
+                                                 /* overwrite RPC_FC_STRUCT with a more exact type */
                                                  $$->type = get_struct_type( $4 );
                                                  $$->fields = $4;
                                                  $$->defined = TRUE;
                                                  $$->type = get_struct_type( $4 );
                                                  $$->fields = $4;
                                                  $$->defined = TRUE;
-                                                  if(in_typelib)
-                                                      add_struct($$);
-                                                }
+                                                 if(in_typelib)
+                                                   add_struct($$);
+                                               }
        ;
 
 type:    tVOID                                 { $$ = make_tref(NULL, make_type(0, NULL)); }
        ;
 
 type:    tVOID                                 { $$ = make_tref(NULL, make_type(0, NULL)); }