diff options
author | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-09-20 18:42:58 +0100 |
---|---|---|
committer | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-09-20 18:42:58 +0100 |
commit | 2133ce26a2ec07fb37a5f4cc6cab5326fdf49546 (patch) | |
tree | 00c0931ae171de9852b229874b3ec6f0df5af9de /src/webidl-ast.c | |
parent | 94259becfc4441d9061c6f34f3e801dda834d01d (diff) | |
download | nsgenbind-2133ce26a2ec07fb37a5f4cc6cab5326fdf49546.tar.gz nsgenbind-2133ce26a2ec07fb37a5f4cc6cab5326fdf49546.tar.bz2 |
add property and function array generation
Diffstat (limited to 'src/webidl-ast.c')
-rw-r--r-- | src/webidl-ast.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/webidl-ast.c b/src/webidl-ast.c index 810ac24..396fd4b 100644 --- a/src/webidl-ast.c +++ b/src/webidl-ast.c @@ -67,6 +67,73 @@ webidl_node_for_each_type(struct webidl_node *node, return 0; } +/* exported interface defined in genjsbind-ast.h */ +struct webidl_node * +webidl_node_find(struct webidl_node *node, + struct webidl_node *prev, + webidl_callback_t *cb, + void *ctx) +{ + struct webidl_node *ret; + + if (node == NULL) { + return NULL; + } + + if (node->l != prev) { + ret = webidl_node_find(node->l, prev, cb, ctx); + if (ret != NULL) { + return ret; + } + } + + if (cb(node, ctx) != 0) { + return node; + } + + return NULL; +} + +int webidl_cmp_node_type(struct webidl_node *node, void *ctx) +{ + if (node->type == (enum webidl_node_type)ctx) + return 1; + return 0; +} + +struct webidl_node * +webidl_node_find_type_ident(struct webidl_node *root_node, + enum webidl_node_type type, + const char *ident) +{ + struct webidl_node *node; + struct webidl_node *ident_node; + + node = webidl_node_find(root_node, + NULL, + webidl_cmp_node_type, + (void *)type); + + while (node != NULL) { + + ident_node = webidl_node_find(webidl_node_getnode(node), + NULL, + webidl_cmp_node_type, + (void *)WEBIDL_NODE_TYPE_IDENT); + if (ident_node != NULL) { + if (strcmp(ident_node->r.text, ident) == 0) + break; + } + + node = webidl_node_find(root_node, + node, + webidl_cmp_node_type, + (void *)type); + + } + return node; +} + char *webidl_node_gettext(struct webidl_node *node) { |