From 46cfe5f47ce0034bb8804d0bd04d573bc6213ab8 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Wed, 19 Sep 2012 19:22:07 +0100 Subject: extract and output binding parameters --- src/genjsbind-ast.c | 12 ++++------ src/genjsbind-ast.h | 3 +-- src/genjsbind-parser.y | 4 ++-- src/jsapi-libdom.c | 63 ++++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 58 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/genjsbind-ast.c b/src/genjsbind-ast.c index 28208e0..94f306c 100644 --- a/src/genjsbind-ast.c +++ b/src/genjsbind-ast.c @@ -129,8 +129,7 @@ char *genbind_node_gettext(struct genbind_node *node) case GENBIND_NODE_TYPE_WEBIDLFILE: case GENBIND_NODE_TYPE_STRING: case GENBIND_NODE_TYPE_PREAMBLE: - case GENBIND_NODE_TYPE_BINDING_IDENT: - case GENBIND_NODE_TYPE_TYPE_IDENT: + case GENBIND_NODE_TYPE_IDENT: case GENBIND_NODE_TYPE_TYPE_NODE: case GENBIND_NODE_TYPE_TYPE_INTERFACE: return node->r.text; @@ -157,6 +156,9 @@ struct genbind_node *genbind_node_getnode(struct genbind_node *node) static const char *genbind_node_type_to_str(enum genbind_node_type type) { switch(type) { + case GENBIND_NODE_TYPE_IDENT: + return "Ident"; + case GENBIND_NODE_TYPE_ROOT: return "Root"; @@ -175,15 +177,9 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type) case GENBIND_NODE_TYPE_BINDING: return "Binding"; - case GENBIND_NODE_TYPE_BINDING_IDENT: - return "Binding: Ident"; - case GENBIND_NODE_TYPE_TYPE: return "Type"; - case GENBIND_NODE_TYPE_TYPE_IDENT: - return "Type: Ident"; - case GENBIND_NODE_TYPE_TYPE_NODE: return "Type: Node"; diff --git a/src/genjsbind-ast.h b/src/genjsbind-ast.h index eaa42f9..66d66c2 100644 --- a/src/genjsbind-ast.h +++ b/src/genjsbind-ast.h @@ -11,14 +11,13 @@ enum genbind_node_type { GENBIND_NODE_TYPE_ROOT = 0, + GENBIND_NODE_TYPE_IDENT, GENBIND_NODE_TYPE_WEBIDLFILE, GENBIND_NODE_TYPE_HDRCOMMENT, GENBIND_NODE_TYPE_STRING, GENBIND_NODE_TYPE_PREAMBLE, GENBIND_NODE_TYPE_BINDING, - GENBIND_NODE_TYPE_BINDING_IDENT, GENBIND_NODE_TYPE_TYPE, - GENBIND_NODE_TYPE_TYPE_IDENT, GENBIND_NODE_TYPE_TYPE_NODE, GENBIND_NODE_TYPE_TYPE_EXTRA, GENBIND_NODE_TYPE_TYPE_INTERFACE, diff --git a/src/genjsbind-parser.y b/src/genjsbind-parser.y index 98ae18a..de2bd10 100644 --- a/src/genjsbind-parser.y +++ b/src/genjsbind-parser.y @@ -162,7 +162,7 @@ Binding { $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING, NULL, - genbind_new_node(GENBIND_NODE_TYPE_BINDING_IDENT, $4, $2)); + genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2)); } ; @@ -191,7 +191,7 @@ Type { $$ = genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, - genbind_new_node(GENBIND_NODE_TYPE_TYPE_IDENT, $4, $2)); + genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2)); } ; diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index 505f115..4dc2db8 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -6,10 +6,11 @@ * Copyright 2012 Vincent Sanders */ +#include #include #include #include -#include +#include #include "options.h" #include "genjsbind-ast.h" @@ -19,6 +20,11 @@ #define HDR_COMMENT_SEP "\n * " #define HDR_COMMENT_PREABLE "Generated by nsgenjsapi" +struct binding { + const char *name; /* name of the binding */ + const char *interface; /* webidl interface binding is for */ +}; + static int webidl_preamble_cb(struct genbind_node *node, void *ctx) { FILE *outfile = ctx; @@ -91,29 +97,62 @@ read_webidl(struct genbind_node *genbind_ast, struct webidl_node **webidl_ast) /* debug dump of web idl AST */ if (options->verbose) { - webidl_ast_dump(webidl_ast, 0); + webidl_ast_dump(*webidl_ast, 0); } return res; } -struct binding { - const char *name; /* name of the binding */ - const char *interface; /* webidl interface binding is for */ -}; +static int +output_function_spec(FILE *outfile, + struct genbind_node *genbind_ast, + struct binding *binding) +{ + fprintf(outfile, "%s\n%s\n", binding->name, binding->interface); + + return 0; +} static struct binding *binding_new(struct genbind_node *genbind_ast) { struct binding *nb; - nb = calloc(1, sizeof(struct binding)); - struct genbind_node *binding_node; + struct genbind_node *ident_node; + struct genbind_node *interface_node; binding_node = genbind_node_find(genbind_ast, - NULL, - genbind_cmp_node_type, - GENBIND_NODE_TYPE_BINDING); + NULL, + genbind_cmp_node_type, + (void *)GENBIND_NODE_TYPE_BINDING); + + if (binding_node == NULL) { + return NULL; + } + + ident_node = genbind_node_find(genbind_node_getnode(binding_node), + NULL, + genbind_cmp_node_type, + (void *)GENBIND_NODE_TYPE_IDENT); + + if (ident_node == NULL) { + return NULL; + } + + interface_node = genbind_node_find(genbind_node_getnode(binding_node), + NULL, + genbind_cmp_node_type, + (void *)GENBIND_NODE_TYPE_TYPE_INTERFACE); + + if (interface_node == NULL) { + return NULL; + } + + nb = calloc(1, sizeof(struct binding)); + + nb->name = genbind_node_gettext(ident_node); + nb->interface = genbind_node_gettext(interface_node); + return nb; } int jsapi_libdom_output(char *outfilename, struct genbind_node *genbind_ast) @@ -151,7 +190,7 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node *genbind_ast) output_preamble(outfile, genbind_ast); - //output_function_spec(outfile, genbind_ast); + output_function_spec(outfile, genbind_ast, binding); //output_property_spec(outfile, genbind_ast); -- cgit v1.2.3