summaryrefslogtreecommitdiff
path: root/src/webidl-ast.c
diff options
context:
space:
mode:
authorVincent Sanders <vincent.sanders@collabora.co.uk>2012-09-24 20:17:03 +0100
committerVincent Sanders <vincent.sanders@collabora.co.uk>2012-09-24 20:17:03 +0100
commitb5c59d1138c704afd09c4716faabe79f04a80616 (patch)
tree6a850ca46c373636dd8d8911665ac6cad94f7bef /src/webidl-ast.c
parent20f9ab6b2c89a9a9edf00f052c912f139e7c4a38 (diff)
downloadnsgenbind-b5c59d1138c704afd09c4716faabe79f04a80616.tar.gz
nsgenbind-b5c59d1138c704afd09c4716faabe79f04a80616.tar.bz2
add interface function argument and type processing
Diffstat (limited to 'src/webidl-ast.c')
-rw-r--r--src/webidl-ast.c54
1 files changed, 47 insertions, 7 deletions
diff --git a/src/webidl-ast.c b/src/webidl-ast.c
index d698fff..53ba7e6 100644
--- a/src/webidl-ast.c
+++ b/src/webidl-ast.c
@@ -30,21 +30,40 @@ struct webidl_node {
} r;
};
+/* insert node at beginning of a list */
+struct webidl_node *
+webidl_node_prepend(struct webidl_node *list, struct webidl_node *node)
+{
+ if (node == NULL) {
+ return list; /* no node to prepend - return existing list */
+ }
+ node->l = list;
+ return node;
+}
+
+/* append node at end of a list */
struct webidl_node *
-webidl_node_link(struct webidl_node *tgt, struct webidl_node *src)
+webidl_node_append(struct webidl_node *list, struct webidl_node *node)
{
- if (tgt != NULL) {
- tgt->l = src;
- return tgt;
- }
- return src;
+ struct webidl_node *cur = list;
+
+ if (cur == NULL) {
+ return node; /* no existing list so just return node */
+ }
+
+ while (cur->l != NULL) {
+ cur = cur->l;
+ }
+ cur->l = node;
+
+ return list;
}
struct webidl_node *
webidl_add_interface_member(struct webidl_node *list, struct webidl_node *new)
{
- return webidl_node_link(new, list);
+ return webidl_node_prepend(list, new);
}
struct webidl_node *webidl_node_new(enum webidl_node_type type, struct webidl_node *l, void *r)
@@ -178,6 +197,9 @@ struct webidl_node *webidl_node_getnode(struct webidl_node *node)
case WEBIDL_NODE_TYPE_INTERFACE_MEMBERS:
case WEBIDL_NODE_TYPE_ATTRIBUTE:
case WEBIDL_NODE_TYPE_OPERATION:
+ case WEBIDL_NODE_TYPE_OPTIONAL_ARGUMENT:
+ case WEBIDL_NODE_TYPE_ARGUMENT:
+ case WEBIDL_NODE_TYPE_TYPE:
return node->r.node;
default:
break;
@@ -211,6 +233,24 @@ static const char *webidl_node_type_to_str(enum webidl_node_type type)
case WEBIDL_NODE_TYPE_OPERATION:
return "Operation";
+ case WEBIDL_NODE_TYPE_OPTIONAL_ARGUMENT:
+ return "Argument(opt)";
+
+ case WEBIDL_NODE_TYPE_ARGUMENT:
+ return "Argument";
+
+ case WEBIDL_NODE_TYPE_ELLIPSIS:
+ return "Ellipsis";
+
+ case WEBIDL_NODE_TYPE_TYPE:
+ return "Type";
+
+ case WEBIDL_NODE_TYPE_TYPE_BASE:
+ return "Base";
+
+ case WEBIDL_NODE_TYPE_TYPE_MODIFIER:
+ return "Modifier";
+
default:
return "Unknown";
}