summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-09-25 11:44:59 +0100
committerVincent Sanders <vince@kyllikki.org>2015-09-25 11:44:59 +0100
commit4a7185fd4a25b1456737b8fa2ac6a770a3e1721e (patch)
tree65280034968b4b04e000b43bcb3b8b4e1856c21e
parent5b0ac4502fd4407d51c165e0ea4ef814b3253fa9 (diff)
downloadnsgenbind-4a7185fd4a25b1456737b8fa2ac6a770a3e1721e.tar.gz
nsgenbind-4a7185fd4a25b1456737b8fa2ac6a770a3e1721e.tar.bz2
Make the binding parser understand c types
Instead of c types being opaque strings this makes the bindig parser understand them. This is necessary for extended attribute parsing in future but also makes the binding more easily understandable.
-rw-r--r--src/duk-libdom-common.c39
-rw-r--r--src/duk-libdom-interface.c62
-rw-r--r--src/duk-libdom.c21
-rw-r--r--src/duk-libdom.h15
-rw-r--r--src/nsgenbind-ast.c34
-rw-r--r--src/nsgenbind-ast.h26
-rw-r--r--src/nsgenbind-lexer.l23
-rw-r--r--src/nsgenbind-parser.y219
-rw-r--r--src/nsgenbind.c2
-rw-r--r--test/data/bindings/HTMLUnknownElement.bnd4
-rw-r--r--test/data/bindings/browser-duk.bnd174
11 files changed, 318 insertions, 301 deletions
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index 9a0f660..a1298e9 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -76,3 +76,42 @@ int output_tool_prologue(FILE* outf)
return 0;
}
+
+
+/* exported interface documented in duk-libdom.h */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier)
+{
+ const char *type_cdata = NULL;
+ struct genbind_node *typename_node;
+
+ typename_node = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_NAME);
+ while (typename_node != NULL) {
+ type_cdata = genbind_node_gettext(typename_node);
+
+ fprintf(outf, "%s", type_cdata);
+
+ typename_node = genbind_node_find_type(
+ genbind_node_getnode(node),
+ typename_node,
+ GENBIND_NODE_TYPE_NAME);
+
+ /* separate all but the last entry with spaces */
+ if (typename_node != NULL) {
+ fputc(' ', outf);
+ }
+ }
+
+ if (identifier) {
+ if ((type_cdata != NULL) &&
+ (type_cdata[0] != '*') &&
+ (type_cdata[0] != ' ')) {
+ fputc(' ', outf);
+ }
+
+ output_cdata(outf, node, GENBIND_NODE_TYPE_IDENT);
+ }
+
+ return 0;
+}
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index ad40741..38e1277 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -328,6 +328,42 @@ output_interface_destructor(FILE* outf, struct ir_entry *interfacee)
}
/**
+ * Compare two nodes to check their c types match.
+ */
+static bool compare_ctypes(struct genbind_node *a, struct genbind_node *b)
+{
+ struct genbind_node *ta;
+ struct genbind_node *tb;
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ NULL, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ NULL, GENBIND_NODE_TYPE_NAME);
+
+ while ((ta != NULL) && (tb != NULL)) {
+ char *txt_a;
+ char *txt_b;
+
+ txt_a = genbind_node_gettext(ta);
+ txt_b = genbind_node_gettext(tb);
+
+ if (strcmp(txt_a, txt_b) != 0) {
+ return false; /* missmatch */
+ }
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ ta, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ tb, GENBIND_NODE_TYPE_NAME);
+ }
+ if (ta != tb) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
* generate an initialisor call to parent interface
*/
static int
@@ -389,26 +425,14 @@ output_interface_inherit_init(FILE* outf,
param_name);
return -1;
} else {
- char *param_type;
- char *inh_param_type;
-
fprintf(outf, ", ");
/* cast the parameter if required */
- param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- inh_param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(inh_param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- if (strcmp(param_type, inh_param_type) != 0) {
- fprintf(outf, "(%s)", inh_param_type);
+ if (compare_ctypes(param_node,
+ inh_param_node) == false) {
+ fputc('(', outf);
+ output_ctype(outf, inh_param_node, false);
+ fputc(')', outf);
}
/* output the parameter identifier */
@@ -449,8 +473,8 @@ output_interface_init_declaration(FILE* outf,
while (param_node != NULL) {
interfacee->class_init_argc++;
fprintf(outf, ", ");
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_TYPE);
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_IDENT);
+
+ output_ctype(outf, param_node, true);
param_node = genbind_node_find_type(
genbind_node_getnode(init_node),
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index 084a68f..ee7cc3b 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -228,25 +228,10 @@ output_private_header(struct ir *ir)
NULL,
GENBIND_NODE_TYPE_PRIVATE);
while (priv_node != NULL) {
- /* generate the private variable definition ensuring
- * the type is separated from the identifier with
- * either a * or space.
- */
- const char *type_cdata;
- char cdatae;
- type_cdata = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(priv_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- fprintf(privf, "\t%s", type_cdata);
- cdatae = type_cdata[strlen(type_cdata) - 1];
- if ((cdatae != '*') && (cdatae != ' ')) {
- fputc(' ', privf);
- }
+ fprintf(privf, "\t");
+
+ output_ctype(privf, priv_node, true);
- output_cdata(privf, priv_node, GENBIND_NODE_TYPE_IDENT);
fprintf(privf, ";\n");
priv_node = genbind_node_find_type(
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index 79b440e..3b07009 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -56,4 +56,19 @@ int output_tool_prologue(FILE* outf);
*/
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type nodetype);
+/**
+ * output a C variable type
+ *
+ * Used to output c type and optionlly identifier declarations for parameters
+ * and structure entries.
+ * If the optional identifier is output it is ensured the type is separated
+ * from the identifier with either a * or space.
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to generate content for.
+ * \param identifier If the indentifier should be output.
+ * \return 0 on success.
+ */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier);
+
#endif
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 4f0654a..6b39461 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -259,34 +259,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
return found_node;
}
-/* exported interface documented in nsgenbind-ast.h */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type type,
- const char *ident)
-{
- struct genbind_node *found_node;
- struct genbind_node *ident_node;
-
- found_node = genbind_node_find_type(node, prev, type);
-
-
- while (found_node != NULL) {
- /* look for a type node */
- ident_node = genbind_node_find_type(genbind_node_getnode(found_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE);
- if (ident_node != NULL) {
- if (strcmp(ident_node->r.text, ident) == 0)
- break;
- }
-
- /* look for next matching node */
- found_node = genbind_node_find_type(node, found_node, type);
- }
- return found_node;
-}
/* exported interface documented in nsgenbind-ast.h */
@@ -371,7 +343,7 @@ char *genbind_node_gettext(struct genbind_node *node)
case GENBIND_NODE_TYPE_EPILOGUE:
case GENBIND_NODE_TYPE_POSTFACE:
case GENBIND_NODE_TYPE_IDENT:
- case GENBIND_NODE_TYPE_TYPE:
+ case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
return node->r.text;
@@ -449,8 +421,8 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type)
case GENBIND_NODE_TYPE_BINDING:
return "Binding";
- case GENBIND_NODE_TYPE_TYPE:
- return "Type";
+ case GENBIND_NODE_TYPE_NAME:
+ return "TypeName";
case GENBIND_NODE_TYPE_PRIVATE:
return "Private";
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index 2a384b2..282544e 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -12,7 +12,7 @@
enum genbind_node_type {
GENBIND_NODE_TYPE_ROOT = 0,
GENBIND_NODE_TYPE_IDENT, /**< generic identifier string */
- GENBIND_NODE_TYPE_TYPE, /**< generic type string */
+ GENBIND_NODE_TYPE_NAME, /**< generic type string */
GENBIND_NODE_TYPE_MODIFIER, /**< node modifier */
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
@@ -152,30 +152,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
/**
- * Returning node of the specified type with a GENBIND_NODE_TYPE_TYPE
- * subnode with matching text.
- *
- * This is a conveniance wrapper around nested calls to
- * genbind_node_find_type() which performs a depth first left hand
- * search returning nodes of the specified type and a child node of
- * GENBIND_NODE_TYPE_TYPE with matching text.
- *
- *
- * @param node The node to start the search from
- * @param prev The node at which to stop the search, either NULL to
- * search the full tree depth (initial search) or the result
- * of a previous search to continue.
- * @param nodetype The type of node to seach for.
- * @param type The text to match the type child node to.
- */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type nodetype,
- const char *type_text);
-
-
-/**
* Find a method node of a given method type
*
* \param node A node of type GENBIND_NODE_TYPE_CLASS to search for methods.
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l
index d092195..f32a948 100644
--- a/src/nsgenbind-lexer.l
+++ b/src/nsgenbind-lexer.l
@@ -93,50 +93,39 @@ dblcolon \:\:
/* binding terminals */
binding return TOK_BINDING;
-
webidl return TOK_WEBIDL;
-
preface return TOK_PREFACE;
-
prologue return TOK_PROLOGUE;
-
epilogue return TOK_EPILOGUE;
-
postface return TOK_POSTFACE;
/* class member terminals */
class return TOK_CLASS;
-
private return TOK_PRIVATE;
-
internal return TOK_INTERNAL;
-
flags return TOK_FLAGS;
-
type return TOK_TYPE;
-
unshared return TOK_UNSHARED;
-
shared return TOK_SHARED;
-
property return TOK_PROPERTY;
/* implementation terminals */
init return TOK_INIT;
-
fini return TOK_FINI;
-
method return TOK_METHOD;
-
getter return TOK_GETTER;
-
setter return TOK_SETTER;
-
prototype return TOK_PROTOTYPE;
+ /* c type terminals */
+
+struct return TOK_STRUCT;
+union return TOK_UNION;
+unsigned return TOK_UNSIGNED;
+
/* other terminals */
{dblcolon} return TOK_DBLCOLON;
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 1462b39..b883833 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -27,9 +27,9 @@ static void nsgenbind_error(YYLTYPE *locp,
struct genbind_node **genbind_ast,
const char *str)
{
- locp = locp;
- genbind_ast = genbind_ast;
- errtxt = strdup(str);
+ locp = locp;
+ genbind_ast = genbind_ast;
+ errtxt = strdup(str);
}
static struct genbind_node *
@@ -104,9 +104,9 @@ add_method(struct genbind_node **genbind_ast,
%union
{
- char *text;
- struct genbind_node *node;
- long value;
+ char *text;
+ struct genbind_node *node;
+ long value;
}
%token TOK_BINDING
@@ -135,6 +135,10 @@ add_method(struct genbind_node **genbind_ast,
%token TOK_DBLCOLON
+%token TOK_STRUCT
+%token TOK_UNION
+%token TOK_UNSIGNED
+
%token <text> TOK_IDENTIFIER
%token <text> TOK_STRING_LITERAL
%token <text> TOK_CCODE_LITERAL
@@ -169,38 +173,36 @@ add_method(struct genbind_node **genbind_ast,
%type <node> Property
%type <node> ParameterList
-%type <node> TypeIdent
+%type <node> CTypeIdent
+%type <node> CType
+%type <node> CTypeSpecifier
%%
-Input
- :
+Input:
Statements
- {
- *genbind_ast = $1;
+ {
+ *genbind_ast = $1;
}
;
-
-Statements
- :
- Statement
+Statements:
+ Statement
|
- Statements Statement
+ Statements Statement
{
- $$ = *genbind_ast = genbind_node_prepend($2, $1);
+ $$ = *genbind_ast = genbind_node_prepend($2, $1);
}
- |
- error ';'
- {
- fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
- free(errtxt);
- YYABORT ;
+ |
+ error ';'
+ {
+ fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
+ free(errtxt);
+ YYABORT ;
}
;
-Statement
- :
+Statement:
Binding
|
Class
@@ -208,18 +210,17 @@ Statement
Method
;
-Binding
- :
- TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}'
+Binding:
+ TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
- NULL,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, $4, $2));
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ $4, $2));
}
;
-BindingArgs
- :
+BindingArgs:
BindingArg
|
BindingArgs BindingArg
@@ -228,8 +229,7 @@ BindingArgs
}
;
-BindingArg
- :
+BindingArg:
WebIDL
|
Preface
@@ -241,71 +241,102 @@ BindingArg
Postface
;
- /* [3] a web IDL file specifier */
-WebIDL
- :
+ /* a web IDL file specifier */
+WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
}
;
+ /* parse a c type specifier. This probably also needs to cope with
+ * void, char, short, int, long, float, double, signed, enum
+ */
+CTypeSpecifier:
+ TOK_UNSIGNED TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("unsigned")),
+ $2);
+ }
+ |
+ TOK_STRUCT TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("struct")),
+ $2);
+ }
+ |
+ TOK_UNION TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("union")),
+ $2);
+ }
+ |
+ TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, NULL, $1);
+ }
+ ;
+
+CType:
+ CTypeSpecifier
+ |
+ CTypeSpecifier '*'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, $1, strdup("*"));
+ }
/* type and identifier of a variable */
-TypeIdent
- :
- TOK_STRING_LITERAL TOK_IDENTIFIER
+CTypeIdent:
+ CType TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $1), $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2);
}
|
- TOK_STRING_LITERAL TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
+ CType TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE,
- NULL,
- $1),
- $2),
- $4);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2), $4);
}
;
-Preface
- :
+Preface:
TOK_PREFACE CBlock ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
}
;
-Prologue
- :
+Prologue:
TOK_PROLOGUE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
}
;
-Epilogue
- :
+Epilogue:
TOK_EPILOGUE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
}
;
-Postface
- :
+Postface:
TOK_POSTFACE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
}
;
-CBlock
- :
+CBlock:
TOK_CCODE_LITERAL
|
CBlock TOK_CCODE_LITERAL
@@ -314,8 +345,7 @@ CBlock
}
;
-MethodType
- :
+MethodType:
TOK_INIT
{
$$ = GENBIND_METHOD_TYPE_INIT;
@@ -347,14 +377,13 @@ MethodType
}
;
-ParameterList
- :
- TypeIdent
+ParameterList:
+ CTypeIdent
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
}
|
- ParameterList ',' TypeIdent
+ ParameterList ',' CTypeIdent
{
$$ = genbind_node_prepend($1,
genbind_new_node(
@@ -364,8 +393,7 @@ ParameterList
}
;
-MethodDeclarator
- :
+MethodDeclarator:
TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ParameterList ')'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS,
@@ -406,8 +434,7 @@ MethodDeclarator
}
;
-Method
- :
+Method:
MethodType MethodDeclarator CBlock
{
$$ = add_method(genbind_ast, $1, $2, $3);
@@ -419,17 +446,15 @@ Method
}
;
-Class
- :
- TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}'
+Class:
+ TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL,
genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2));
}
;
-ClassArgs
- :
+ClassArgs:
ClassArg
|
ClassArgs ClassArg
@@ -438,8 +463,7 @@ ClassArgs
}
;
-ClassArg
- :
+ClassArg:
Private
|
Internal
@@ -458,45 +482,40 @@ ClassArg
;
-Private
- :
- TOK_PRIVATE TypeIdent ';'
+Private:
+ TOK_PRIVATE CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
}
;
-Internal
- :
- TOK_INTERNAL TypeIdent ';'
+Internal:
+ TOK_INTERNAL CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
;
-ClassFlag
- :
+ClassFlag:
TOK_FLAGS ClassFlags ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
}
;
-ClassFlags
- :
+ClassFlags:
TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
}
|
ClassFlags ',' TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
}
;
-Property
- :
+Property:
TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
@@ -508,8 +527,7 @@ Property
}
;
-Modifiers
- :
+Modifiers:
/* empty */
{
$$ = GENBIND_TYPE_NONE;
@@ -521,8 +539,7 @@ Modifiers
}
;
-Modifier
- :
+Modifier:
TOK_TYPE
{
$$ = GENBIND_TYPE_TYPE;
diff --git a/src/nsgenbind.c b/src/nsgenbind.c
index 135c5c0..09d4c29 100644
--- a/src/nsgenbind.c
+++ b/src/nsgenbind.c
@@ -168,7 +168,7 @@ static enum bindingtype_e genbind_get_type(struct genbind_node *node)
genbind_node_find_type(
genbind_node_getnode(binding_node),
NULL,
- GENBIND_NODE_TYPE_TYPE));
+ GENBIND_NODE_TYPE_NAME));
if (binding_type == NULL) {
fprintf(stderr, "Error: missing binding type\n");
return BINDINGTYPE_UNKNOWN;
diff --git a/test/data/bindings/HTMLUnknownElement.bnd b/test/data/bindings/HTMLUnknownElement.bnd
index faabaec..d44018b 100644
--- a/test/data/bindings/HTMLUnknownElement.bnd
+++ b/test/data/bindings/HTMLUnknownElement.bnd
@@ -14,6 +14,6 @@ class HTMLUnknownElement {
postface %{
/* class post */
%};
-}
+};
-init HTMLUnknownElement("struct dom_html_element *" html_unknown_element::html_element);
+init HTMLUnknownElement(struct dom_html_element *html_unknown_element::html_element);
diff --git a/test/data/bindings/browser-duk.bnd b/test/data/bindings/browser-duk.bnd
index 44497a1..cef3563 100644
--- a/test/data/bindings/browser-duk.bnd
+++ b/test/data/bindings/browser-duk.bnd
@@ -37,108 +37,108 @@ binding duk_libdom {
postface %{
/* binding postface */
%};
-}
+};
#include "HTMLUnknownElement.bnd"
/* specialisations of html_element */
-init HTMLFontElement("struct dom_html_element *" html_font_element::html_element);
-init HTMLDirectoryElement("struct dom_html_element *" html_directory_element::html_element);
-init HTMLFrameElement("struct dom_html_element *" html_frame_element::html_element);
-init HTMLFrameSetElement("struct dom_html_element *" html_frame_set_element::html_element);
-init HTMLMarqueeElement("struct dom_html_element *" html_marquee_element::html_element);
-init HTMLAppletElement("struct dom_html_element *" html_applet_element::html_element);
-init HTMLCanvasElement("struct dom_html_element *" html_canvas_element::html_element);
-init HTMLTemplateElement("struct dom_html_element *" html_template_element::html_element);
-init HTMLScriptElement("struct dom_html_element *" html_script_element::html_element);
-init HTMLDialogElement("struct dom_html_element *" html_dialog_element::html_element);
-init HTMLMenuItemElement("struct dom_html_element *" html_menu_item_element::html_element);
-init HTMLMenuElement("struct dom_html_element *" html_menu_element::html_element);
-init HTMLDetailsElement("struct dom_html_element *" html_details_element::html_element);
-init HTMLLegendElement("struct dom_html_element *" html_legend_element::html_element);
-init HTMLFieldSetElement("struct dom_html_element *" html_field_set_element::html_element);
-init HTMLMeterElement("struct dom_html_element *" html_meter_element::html_element);
-init HTMLProgressElement("struct dom_html_element *" html_progress_element::html_element);
-init HTMLOutputElement("struct dom_html_element *" html_output_element::html_element);
-init HTMLKeygenElement("struct dom_html_element *" html_keygen_element::html_element);
-init HTMLTextAreaElement("struct dom_html_element *" html_text_area_element::html_element);
-init HTMLOptionElement("struct dom_html_element *" html_option_element::html_element);
-init HTMLOptGroupElement("struct dom_html_element *" html_opt_group_element::html_element);
-init HTMLDataListElement("struct dom_html_element *" html_data_list_element::html_element);
-init HTMLSelectElement("struct dom_html_element *" html_select_element::html_element);
-init HTMLButtonElement("struct dom_html_element *" html_button_element::html_element);
-init HTMLInputElement("struct dom_html_element *" html_input_element::html_element);
-init HTMLLabelElement("struct dom_html_element *" html_label_element::html_element);
-init HTMLFormElement("struct dom_html_element *" html_form_element::html_element);
-init HTMLTableCellElement("struct dom_html_element *" html_table_cell_element::html_element);
-init HTMLTableRowElement("struct dom_html_element *" html_table_row_element::html_element);
-init HTMLTableSectionElement("struct dom_html_element *" html_table_section_element::html_element);
-init HTMLTableColElement("struct dom_html_element *" html_table_col_element::html_element);
-init HTMLTableCaptionElement("struct dom_html_element *" html_table_caption_element::html_element);
-init HTMLTableElement("struct dom_html_element *" html_table_element::html_element);
-init HTMLAreaElement("struct dom_html_element *" html_area_element::html_element);
-init HTMLMapElement("struct dom_html_element *" html_map_element::html_element);
-init HTMLMediaElement("struct dom_html_element *" html_media_element::html_element);
-init HTMLTrackElement("struct dom_html_element *" html_track_element::html_element);
-init HTMLParamElement("struct dom_html_element *" html_param_element::html_element);
-init HTMLObjectElement("struct dom_html_element *" html_object_element::html_element);
-init HTMLEmbedElement("struct dom_html_element *" html_embed_element::html_element);
-init HTMLIFrameElement("struct dom_html_element *" html_i_frame_element::html_element);
-init HTMLImageElement("struct dom_html_element *" html_image_element::html_element);
-init HTMLSourceElement("struct dom_html_element *" html_source_element::html_element);
-init HTMLPictureElement("struct dom_html_element *" html_picture_element::html_element);
-init HTMLModElement("struct dom_html_element *" html_mod_element::html_element);
-init HTMLBRElement("struct dom_html_element *" html_br_element::html_element);
-init HTMLSpanElement("struct dom_html_element *" html_span_element::html_element);
-init HTMLTimeElement("struct dom_html_element *" html_time_element::html_element);
-init HTMLDataElement("struct dom_html_element *" html_data_element::html_element);
-init HTMLAnchorElement("struct dom_html_element *" html_anchor_element::html_element);
-init HTMLDivElement("struct dom_html_element *" html_div_element::html_element);
-init HTMLDListElement("struct dom_html_element *" html_d_list_element::html_element);
-init HTMLLIElement("struct dom_html_element *" html_li_element::html_element);
-init HTMLUListElement("struct dom_html_element *" html_u_list_element::html_element);
-init HTMLOListElement("struct dom_html_element *" html_o_list_element::html_element);
-init HTMLQuoteElement("struct dom_html_element *" html_quote_element::html_element);
-init HTMLPreElement("struct dom_html_element *" html_pre_element::html_element);
-init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element);
-init HTMLParagraphElement("struct dom_html_element *" html_paragraph_element::html_element);
-init HTMLHeadingElement("struct dom_html_element *" html_heading_element::html_element);
-init HTMLBodyElement("struct dom_html_element *" html_body_element::html_element);
-init HTMLStyleElement("struct dom_html_element *" html_style_element::html_element);
-init HTMLMetaElement("struct dom_html_element *" html_meta_element::html_element);
-init HTMLLinkElement("struct dom_html_element *" html_link_element::html_element);
-init HTMLBaseElement("struct dom_html_element *" html_base_element::html_element);
-init HTMLTitleElement("struct dom_html_element *" html_title_element::html_element);
-init HTMLHeadElement("struct dom_html_element *" html_head_element::html_element);
-init HTMLHtmlElement("struct dom_html_element *" html_html_element::html_element);
+init HTMLFontElement(struct dom_html_element *html_font_element::html_element);
+init HTMLDirectoryElement(struct dom_html_element *html_directory_element::html_element);
+init HTMLFrameElement(struct dom_html_element *html_frame_element::html_element);
+init HTMLFrameSetElement(struct dom_html_element *html_frame_set_element::html_element);
+init HTMLMarqueeElement(struct dom_html_element *html_marquee_element::html_element);
+init HTMLAppletElement(struct dom_html_element *html_applet_element::html_element);
+init HTMLCanvasElement(struct dom_html_element *html_canvas_element::html_element);
+init HTMLTemplateElement(struct dom_html_element *html_template_element::html_element);
+init HTMLScriptElement(struct dom_html_element *html_script_element::html_element);
+init HTMLDialogElement(struct dom_html_element *html_dialog_element::html_element);
+init HTMLMenuItemElement(struct dom_html_element *html_menu_item_element::html_element);
+init HTMLMenuElement(struct dom_html_element *html_menu_element::html_element);
+init HTMLDetailsElement(struct dom_html_element *html_details_element::html_element);
+init HTMLLegendElement(struct dom_html_element *html_legend_element::html_element);
+init HTMLFieldSetElement(struct dom_html_element *html_field_set_element::html_element);
+init HTMLMeterElement(struct dom_html_element *html_meter_element::html_element);
+init HTMLProgressElement(struct dom_html_element *html_progress_element::html_element);
+init HTMLOutputElement(struct dom_html_element *html_output_element::html_element);
+init HTMLKeygenElement(struct dom_html_element *html_keygen_element::html_element);
+init HTMLTextAreaElement(struct dom_html_element *html_text_area_element::html_element);
+init HTMLOptionElement(struct dom_html_element *html_option_element::html_element);
+init HTMLOptGroupElement(struct dom_html_element *html_opt_group_element::html_element);
+init HTMLDataListElement(struct dom_html_element *html_data_list_element::html_element);
+init HTMLSelectElement(struct dom_html_element *html_select_element::html_element);
+init HTMLButtonElement(struct dom_html_element *html_button_element::html_element);
+init HTMLInputElement(struct dom_html_element *html_input_element::html_element);
+init HTMLLabelElement(struct dom_html_element *html_label_element::html_element);
+init HTMLFormElement(struct dom_html_element *html_form_element::html_element);
+init HTMLTableCellElement(struct dom_html_element *html_table_cell_element::html_element);
+init HTMLTableRowElement(struct dom_html_element *html_table_row_element::html_element);
+init HTMLTableSectionElement(struct dom_html_element *html_table_section_element::html_element);
+init HTMLTableColElement(struct dom_html_element *html_table_col_element::html_element);
+init HTMLTableCaptionElement(struct dom_html_element *html_table_caption_element::html_element);
+init HTMLTableElement(struct dom_html_element *html_table_element::html_element);
+init HTMLAreaElement(struct dom_html_element *html_area_element::html_element);
+init HTMLMapElement(struct dom_html_element *html_map_element::html_element);
+init HTMLMediaElement(struct dom_html_element *html_media_element::html_element);
+init HTMLTrackElement(struct dom_html_element *html_track_element::html_element);
+init HTMLParamElement(struct dom_html_element *html_param_element::html_element);
+init HTMLObjectElement(struct dom_html_element *html_object_element::html_element);
+init HTMLEmbedElement(struct dom_html_element *html_embed_element::html_element);
+init HTMLIFrameElement(struct dom_html_element *html_i_frame_element::html_element);
+init HTMLImageElement(struct dom_html_element *html_image_element::html_element);
+init HTMLSourceElement(struct dom_html_element *html_source_element::html_element);
+init HTMLPictureElement(struct dom_html_element *html_picture_element::html_element);
+init HTMLModElement(struct dom_html_element *html_mod_element::html_element);
+init HTMLBRElement(struct dom_html_element *html_br_element::html_element);
+init HTMLSpanElement(struct dom_html_element *html_span_element::html_element);
+init HTMLTimeElement(struct dom_html_element *html_time_element::html_element);
+init HTMLDataElement(struct dom_html_element *html_data_element::html_element);
+init HTMLAnchorElement(struct dom_html_element *html_anchor_element::html_element);
+init HTMLDivElement(struct dom_html_element *html_div_element::html_element);
+init HTMLDListElement(struct dom_html_element *html_d_list_element::html_element);
+init HTMLLIElement(struct dom_html_element *html_li_element::html_element);
+init HTMLUListElement(struct dom_html_element *html_u_list_element::html_element);
+init HTMLOListElement(struct dom_html_element *html_o_list_element::html_element);
+init HTMLQuoteElement(struct dom_html_element *html_quote_element::html_element);
+init HTMLPreElement(struct dom_html_element *html_pre_element::html_element);
+init HTMLHRElement(struct dom_html_element *html_hr_element::html_element);
+init HTMLParagraphElement(struct dom_html_element *html_paragraph_element::html_element);
+init HTMLHeadingElement(struct dom_html_element *html_heading_element::html_element);
+init HTMLBodyElement(struct dom_html_element *html_body_element::html_element);
+init HTMLStyleElement(struct dom_html_element *html_style_element::html_element);
+init HTMLMetaElement(struct dom_html_element *html_meta_element::html_element);
+init HTMLLinkElement(struct dom_html_element *html_link_element::html_element);
+init HTMLBaseElement(struct dom_html_element *html_base_element::html_element);
+init HTMLTitleElement(struct dom_html_element *html_title_element::html_element);
+init HTMLHeadElement(struct dom_html_element *html_head_element::html_element);
+init HTMLHtmlElement(struct dom_html_element *html_html_element::html_element);
/* specialisations of HTMLTableCellElement */
-init HTMLTableHeaderCellElement("struct dom_html_element *" html_table_header_cell_element::html_table_cell_element);
-init HTMLTableDataCellElement("struct dom_html_element *" html_table_data_cell_element::html_table_cell_element);
+init HTMLTableHeaderCellElement(struct dom_html_element *html_table_header_cell_element::html_table_cell_element);
+init HTMLTableDataCellElement(struct dom_html_element *html_table_data_cell_element::html_table_cell_element);
/* specialisations of html_media_element */
-init HTMLAudioElement("struct dom_html_element *" html_audio_element::html_media_element);
-init HTMLVideoElement("struct dom_html_element *" html_video_element::html_media_element);
+init HTMLAudioElement(struct dom_html_element *html_audio_element::html_media_element);
+init HTMLVideoElement(struct dom_html_element *html_video_element::html_media_element);
-init HTMLElement("struct dom_html_element *" html_element::element);
+init HTMLElement(struct dom_html_element *html_element::element);
-init Text("struct dom_node_text *" text::character_data);
-init Comment("struct dom_node_comment *" comment::character_data);
-init ProcessingInstruction("struct dom_node_text *" text::character_data);
+init Text(struct dom_node_text *text::character_data);
+init Comment(struct dom_node_comment *comment::character_data);
+init ProcessingInstruction(struct dom_node_text *text::character_data);
-init XMLDocument("struct dom_document *" document);
+init XMLDocument(struct dom_document * document);
-init Element("struct dom_element *" element::node);
-init CharacterData("struct dom_node_character_data *" character_data::node);
-init DocumentFragment("struct dom_document *" document::node);
-init DocumentType("struct dom_document *" document::node);
-init Document("struct dom_document *" document::node);
+init Element(struct dom_element *element::node);
+init CharacterData(struct dom_node_character_data *character_data::node);
+init DocumentFragment(struct dom_document *document::node);
+init DocumentType(struct dom_document *document::node);
+init Document(struct dom_document *document::node);
class Node {
- private "dom_node *" node;
-}
+ private dom_node *node;
+};
-init Node("struct dom_node *" node)
+init Node(struct dom_node *node)
%{
priv->node = node;
dom_node_ref(node);