[PATCH v2 2/6] widl: parse attribute custom(guid,expr).

Kevin Puetz PuetzKevinA at JohnDeere.com
Fri Oct 30 00:07:26 CDT 2020


Signed-off-by: Kevin Puetz <PuetzKevinA at JohnDeere.com>
---
 tools/widl/parser.l    |  2 +-
 tools/widl/parser.y    | 18 ++++++++++++++++++
 tools/widl/widltypes.h |  7 +++++++
 3 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index f2c09cd8051..d719535ceee 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -338,6 +338,7 @@ static const struct keyword attr_keywords[] =
         {"context_handle_noserialize",  tCONTEXTHANDLENOSERIALIZE},
         {"context_handle_serialize",    tCONTEXTHANDLENOSERIALIZE},
         {"control",                     tCONTROL},
+        {"custom",                      tCUSTOM},
         {"decode",                      tDECODE},
         {"defaultbind",                 tDEFAULTBIND},
         {"defaultcollelem",             tDEFAULTCOLLELEM},
@@ -430,7 +431,6 @@ static const struct keyword attr_keywords[] =
 };
 
 /* attributes TODO:
-    custom
     first_is
     last_is
     max_is
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 686aa6b58a8..7b045e2cb0f 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -58,6 +58,7 @@ static decl_spec_t *make_decl_spec(type_t *type, decl_spec_t *left, decl_spec_t
 static attr_t *make_attr(enum attr_type type);
 static attr_t *make_attrv(enum attr_type type, unsigned int val);
 static attr_t *make_attrp(enum attr_type type, void *val);
+static attr_t *make_custom_attr(UUID *id, expr_t *pval);
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr);
 static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_t *decl, int top);
 static var_list_t *set_var_types(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_list_t *decls);
@@ -177,6 +178,7 @@ static typelib_t *current_typelib;
 %token tCALLAS tCALLBACK tCASE tCDECL tCHAR tCOCLASS tCODE tCOMMSTATUS
 %token tCONST tCONTEXTHANDLE tCONTEXTHANDLENOSERIALIZE
 %token tCONTEXTHANDLESERIALIZE tCONTROL tCPPQUOTE
+%token tCUSTOM
 %token tDECODE tDEFAULT tDEFAULTBIND
 %token tDEFAULTCOLLELEM
 %token tDEFAULTVALUE
@@ -506,6 +508,7 @@ attribute:					{ $$ = NULL; }
 	| tCONTEXTHANDLENOSERIALIZE		{ $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
 	| tCONTEXTHANDLESERIALIZE		{ $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
 	| tCONTROL				{ $$ = make_attr(ATTR_CONTROL); }
+	| tCUSTOM '(' uuid_string ',' expr_const ')' { $$ = make_custom_attr($3, $5); }
 	| tDECODE				{ $$ = make_attr(ATTR_DECODE); }
 	| tDEFAULT				{ $$ = make_attr(ATTR_DEFAULT); }
 	| tDEFAULTBIND				{ $$ = make_attr(ATTR_DEFAULTBIND); }
@@ -1255,6 +1258,8 @@ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
         list = xmalloc( sizeof(*list) );
         list_init( list );
     }
+    if(attr->type != ATTR_CUSTOM)
+    {
     LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
         if (attr_existing->type == attr->type)
         {
@@ -1263,6 +1268,7 @@ static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
             list_remove(&attr_existing->entry);
             break;
         }
+    }
     list_add_tail( list, &attr->entry );
     return list;
 }
@@ -1387,6 +1393,17 @@ static attr_t *make_attrp(enum attr_type type, void *val)
   return a;
 }
 
+static attr_t *make_custom_attr(UUID *id, expr_t *pval)
+{
+  attr_t *a = xmalloc(sizeof(attr_t));
+  attr_custdata_t *cstdata = xmalloc(sizeof(attr_custdata_t));
+  a->type = ATTR_CUSTOM;
+  cstdata->id = *id;
+  cstdata->pval = pval;
+  a->u.pval = cstdata;
+  return a;
+}
+
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr)
 {
     if (!expr) return list;
@@ -2161,6 +2178,7 @@ struct allowed_attr allowed_attr[] =
     /* ATTR_COMMSTATUS */          { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
     /* ATTR_CONTEXTHANDLE */       { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
     /* ATTR_CONTROL */             { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
+    /* ATTR_CUSTOM */              { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, "custom" },
     /* ATTR_DECODE */              { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
     /* ATTR_DEFAULT */             { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, "default" },
     /* ATTR_DEFAULTBIND */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultbind" },
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 2e2ee7a206b..b02b80e122c 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -37,6 +37,7 @@ typedef GUID UUID;
 
 typedef struct _loc_info_t loc_info_t;
 typedef struct _attr_t attr_t;
+typedef struct _attr_custdata_t attr_custdata_t;
 typedef struct _expr_t expr_t;
 typedef struct _type_t type_t;
 typedef struct _var_t var_t;
@@ -84,6 +85,7 @@ enum attr_type
     ATTR_COMMSTATUS,
     ATTR_CONTEXTHANDLE,
     ATTR_CONTROL,
+    ATTR_CUSTOM,
     ATTR_DECODE,
     ATTR_DEFAULT,
     ATTR_DEFAULTBIND,
@@ -338,6 +340,11 @@ struct _expr_t {
   struct list entry;
 };
 
+struct _attr_custdata_t {
+  GUID id;
+  expr_t *pval;
+};
+
 struct struct_details
 {
   var_list_t *fields;



More information about the wine-devel mailing list