Robert Shearman : widl: Fix the detection of conformant and pointer
structs.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jan 24 06:45:14 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 362d42e0826dd2907418ec78bb9da5717e491a72
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=362d42e0826dd2907418ec78bb9da5717e491a72
Author: Robert Shearman <rob at codeweavers.com>
Date: Tue Jan 24 11:11:56 2006 +0100
widl: Fix the detection of conformant and pointer structs.
---
tools/widl/header.h | 12 ++++++++++++
tools/widl/parser.y | 21 +++++++++++++++++++--
tools/widl/typegen.c | 12 ------------
3 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/tools/widl/header.h b/tools/widl/header.h
index 1a767c7..a29502d 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -45,4 +45,16 @@ extern void write_library(const char *na
extern void write_user_types(void);
extern var_t* get_explicit_handle_var(func_t* func);
+static inline int is_string_type(const attr_t *attrs, int ptr_level, const expr_t *array)
+{
+ return (is_attr(attrs, ATTR_STRING) &&
+ ((ptr_level == 1 && !array) || (ptr_level == 0 && array)));
+}
+
+static inline int is_array_type(const attr_t *attrs, int ptr_level, const expr_t *array)
+{
+ return ((ptr_level == 1 && !array && is_attr(attrs, ATTR_SIZEIS)) ||
+ (ptr_level == 0 && array));
+}
+
#endif
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 7c32944..e4ee9ff 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -1243,7 +1243,7 @@ static int get_struct_type(var_t *field)
int has_conformant_array = 0;
int has_conformant_string = 0;
- while (field)
+ for (; field; field = NEXT_LINK(field))
{
type_t *t = field->type;
@@ -1251,6 +1251,24 @@ static int get_struct_type(var_t *field)
while( (t->type == 0) && t->ref )
t = t->ref;
+ if (is_string_type(field->attrs, field->ptr_level, field->array))
+ {
+ has_conformant_string = 1;
+ continue;
+ }
+
+ if (is_array_type(field->attrs, field->ptr_level, field->array))
+ {
+ has_conformant_array = 1;
+ continue;
+ }
+
+ if (field->ptr_level > 0)
+ {
+ has_pointer = 1;
+ continue;
+ }
+
switch (t->type)
{
/*
@@ -1329,7 +1347,6 @@ static int get_struct_type(var_t *field)
case RPC_FC_BOGUS_STRUCT:
return RPC_FC_BOGUS_STRUCT;
}
- field = NEXT_LINK(field);
}
if( has_conformant_string && has_pointer )
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index b54ad11..2a395c9 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -91,18 +91,6 @@ static inline int is_base_type(unsigned
}
}
-static inline int is_string_type(const attr_t *attrs, int ptr_level, const expr_t *array)
-{
- return (is_attr(attrs, ATTR_STRING) &&
- ((ptr_level == 1 && !array) || (ptr_level == 0 && array)));
-}
-
-static inline int is_array_type(const attr_t *attrs, int ptr_level, const expr_t *array)
-{
- return ((ptr_level == 1 && !array && is_attr(attrs, ATTR_SIZEIS)) ||
- (ptr_level == 0 && array));
-}
-
static size_t write_procformatstring_var(FILE *file, int indent,
const var_t *var, int is_return, unsigned int *type_offset)
{
More information about the wine-cvs
mailing list