Signed-off-by: Kevin Puetz PuetzKevinA@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 3cbf4ff2d2..e163bd5d6f 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -337,6 +337,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}, @@ -427,7 +428,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 3ef8d89ba1..c50880a7f1 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); @@ -173,6 +174,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 @@ -501,6 +503,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); } @@ -1211,6 +1214,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) { @@ -1219,6 +1224,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; } @@ -1343,6 +1349,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; @@ -2091,6 +2108,7 @@ struct allowed_attr allowed_attr[] = /* ATTR_COMMSTATUS */ { 0, 0, 0, 1, 1, 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, "context_handle" }, /* ATTR_CONTROL */ { 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, 0, "custom" }, /* ATTR_DECODE */ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "decode" }, /* ATTR_DEFAULT */ { 0, 0, 1, 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, "defaultbind" }, diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 085a0ff55f..6b67538594 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; @@ -83,6 +84,7 @@ enum attr_type ATTR_COMMSTATUS, ATTR_CONTEXTHANDLE, ATTR_CONTROL, + ATTR_CUSTOM, ATTR_DECODE, ATTR_DEFAULT, ATTR_DEFAULTBIND, @@ -337,6 +339,11 @@ struct _expr_t { struct list entry; };
+struct _attr_custdata_t { + GUID id; + expr_t *pval; +}; + struct struct_details { var_list_t *fields;