Module: wine Branch: master Commit: 59cfad37aab59d307383f828d1ca79275efad453 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=59cfad37aab59d307383f828...
Author: Dan Hipschman dsh@linux.ucla.edu Date: Tue Aug 29 14:25:19 2006 -0700
widl: Generate names for tagless structs, unions and enums.
---
tools/widl/parser.y | 36 ++++++++++++++++++++++++++++++++++++ 1 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y index ead02cb..d70cc04 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -104,6 +104,7 @@ static void write_diid(type_t *iface); static void write_iid(type_t *iface);
static int compute_method_indexes(type_t *iface); +static char *gen_name(void);
#define tsENUM 1 #define tsSTRUCT 2 @@ -824,9 +825,19 @@ type: tVOID { $$ = make_tref(NULL, ;
typedef: tTYPEDEF m_attributes type pident_list { typeref_t *tref = uniq_tref($3); + type_t *t; $4->tname = tref->name; tref->name = NULL; $$ = type_ref(tref); + t = $$->ref; + if ((t->kind == TKIND_ENUM || t->kind == TKIND_RECORD + || t->kind == TKIND_UNION) && ! t->name && ! parse_only) + { + attr_t *a = make_attr(ATTR_PUBLIC); + LINK(a, $2); + $2 = a; + t->name = gen_name(); + } $$->attrs = $2; if (!parse_only && do_header) write_typedef($$, $4); @@ -1614,3 +1625,28 @@ static int compute_method_indexes(type_t
return idx; } + +static char *gen_name(void) +{ + static const char format[] = "__WIDL_%s_generated_name_%08lX"; + static unsigned long n = 0; + static const char *file_id; + static size_t size; + char *name; + + if (! file_id) + { + char *dst = dup_basename(input_name, ".idl"); + file_id = dst; + + for (; *dst; ++dst) + if (! isalnum((unsigned char) *dst)) + *dst = '_'; + + size = sizeof format - 7 + strlen(file_id) + 8; + } + + name = xmalloc(size); + sprintf(name, format, file_id, n++); + return name; +}