diff options
author | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-09-20 20:28:49 +0100 |
---|---|---|
committer | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-09-20 20:28:49 +0100 |
commit | d58d0289a7b7817e2d96f4666ebb370add8d1a81 (patch) | |
tree | e00f33e3044e2254ec8c35aa0d2e2be6123b7fac /src/webidl-ast.c | |
parent | 2133ce26a2ec07fb37a5f4cc6cab5326fdf49546 (diff) | |
download | nsgenbind-d58d0289a7b7817e2d96f4666ebb370add8d1a81.tar.gz nsgenbind-d58d0289a7b7817e2d96f4666ebb370add8d1a81.tar.bz2 |
cope with partial interfaces
Diffstat (limited to 'src/webidl-ast.c')
-rw-r--r-- | src/webidl-ast.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/src/webidl-ast.c b/src/webidl-ast.c index 396fd4b..aa8e279 100644 --- a/src/webidl-ast.c +++ b/src/webidl-ast.c @@ -20,6 +20,15 @@ extern int webidl__flex_debug; extern void webidl_restart(FILE*); extern int webidl_parse(struct webidl_node **webidl_ast); +struct webidl_node { + enum webidl_node_type type; + struct webidl_node *l; + union { + void *value; + struct webidl_node *node; + char *text; + } r; +}; struct webidl_node * @@ -42,6 +51,12 @@ struct webidl_node *webidl_node_new(enum webidl_node_type type, struct webidl_no return nn; } +void +webidl_node_set(struct webidl_node *node, enum webidl_node_type type, void *r) +{ + node->type = type; + node->r.value = r; +} int webidl_node_for_each_type(struct webidl_node *node, @@ -76,7 +91,7 @@ webidl_node_find(struct webidl_node *node, { struct webidl_node *ret; - if (node == NULL) { + if ((node == NULL) || (node == prev)){ return NULL; } @@ -150,17 +165,20 @@ char *webidl_node_gettext(struct webidl_node *node) struct webidl_node *webidl_node_getnode(struct webidl_node *node) { - switch(node->type) { - case WEBIDL_NODE_TYPE_ROOT: - case WEBIDL_NODE_TYPE_INTERFACE: - case WEBIDL_NODE_TYPE_INTERFACE_MEMBERS: - case WEBIDL_NODE_TYPE_ATTRIBUTE: - case WEBIDL_NODE_TYPE_OPERATION: - return node->r.node; - - default: - return NULL; + if (node != NULL) { + switch (node->type) { + case WEBIDL_NODE_TYPE_ROOT: + case WEBIDL_NODE_TYPE_INTERFACE: + case WEBIDL_NODE_TYPE_INTERFACE_MEMBERS: + case WEBIDL_NODE_TYPE_ATTRIBUTE: + case WEBIDL_NODE_TYPE_OPERATION: + return node->r.node; + default: + break; + } } + return NULL; + } static const char *webidl_node_type_to_str(enum webidl_node_type type) |