summaryrefslogtreecommitdiff
path: root/src/webidl-ast.c
diff options
context:
space:
mode:
authorVincent Sanders <vincent.sanders@collabora.co.uk>2012-09-20 20:28:49 +0100
committerVincent Sanders <vincent.sanders@collabora.co.uk>2012-09-20 20:28:49 +0100
commitd58d0289a7b7817e2d96f4666ebb370add8d1a81 (patch)
treee00f33e3044e2254ec8c35aa0d2e2be6123b7fac /src/webidl-ast.c
parent2133ce26a2ec07fb37a5f4cc6cab5326fdf49546 (diff)
downloadnsgenbind-d58d0289a7b7817e2d96f4666ebb370add8d1a81.tar.gz
nsgenbind-d58d0289a7b7817e2d96f4666ebb370add8d1a81.tar.bz2
cope with partial interfaces
Diffstat (limited to 'src/webidl-ast.c')
-rw-r--r--src/webidl-ast.c40
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)