diff options
author | Vincent Sanders <vince@kyllikki.org> | 2015-07-31 21:49:45 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2015-07-31 21:49:45 +0100 |
commit | 02ebfefd0fc3d81b59cc15f34033210a6344f430 (patch) | |
tree | 22bb97027149ae2336e561b6f345bcf10593ff0d /src | |
parent | 4b723a410bc1a3355d401b95ac390f377b5d77b8 (diff) | |
download | nsgenbind-02ebfefd0fc3d81b59cc15f34033210a6344f430.tar.gz nsgenbind-02ebfefd0fc3d81b59cc15f34033210a6344f430.tar.bz2 |
Generate makefile fragment and add header guards
Diffstat (limited to 'src')
-rw-r--r-- | src/duk-libdom.c | 119 | ||||
-rw-r--r-- | src/duk-libdom.h | 4 | ||||
-rw-r--r-- | src/interface-map.c | 21 | ||||
-rw-r--r-- | src/interface-map.h | 13 | ||||
-rw-r--r-- | src/nsgenbind.c | 4 |
5 files changed, 126 insertions, 35 deletions
diff --git a/src/duk-libdom.c b/src/duk-libdom.c index a883f7c..49f100a 100644 --- a/src/duk-libdom.c +++ b/src/duk-libdom.c @@ -968,12 +968,20 @@ output_interface_attributes(FILE* outf, */ static int output_tool_preface(FILE* outf) { - char *fpath; + fprintf(outf, "\n%s\n", NSGENBIND_PREAMBLE); - fprintf(outf, "\n%s\n\n", NSGENBIND_PREAMBLE); + return 0; +} + +/** + * generate preface block for nsgenbind + */ +static int output_tool_prologue(FILE* outf) +{ + char *fpath; fpath = genb_fpath("private.h"); - fprintf(outf, "#include \"%s\"\n", fpath); + fprintf(outf, "\n#include \"%s\"\n", fpath); free(fpath); fpath = genb_fpath("prototype.h"); @@ -986,13 +994,11 @@ static int output_tool_preface(FILE* outf) /** * generate a source file to implement an interface using duk and libdom. */ -static int output_interface(struct genbind_node *genbind, - struct interface_map *interface_map, +static int output_interface(struct interface_map *interface_map, struct interface_map_entry *interfacee) { FILE *ifacef; int ifacenamelen; - struct genbind_node *binding_node; struct interface_map_entry *inherite; int res = 0; @@ -1014,11 +1020,10 @@ static int output_interface(struct genbind_node *genbind, /* find parent interface entry */ inherite = interface_map_inherit_entry(interface_map, interfacee); - binding_node = genbind_node_find_type(genbind, NULL, - GENBIND_NODE_TYPE_BINDING); - /* binding preface */ - output_cdata(ifacef, binding_node, GENBIND_NODE_TYPE_PREFACE); + output_cdata(ifacef, + interface_map->binding_node, + GENBIND_NODE_TYPE_PREFACE); /* tool preface */ output_tool_preface(ifacef); @@ -1027,7 +1032,11 @@ static int output_interface(struct genbind_node *genbind, output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PREFACE); /* binding prologue */ - output_cdata(ifacef, binding_node, GENBIND_NODE_TYPE_PROLOGUE); + output_cdata(ifacef, + interface_map->binding_node, + GENBIND_NODE_TYPE_PROLOGUE); + + output_tool_prologue(ifacef); /* class prologue */ output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PROLOGUE); @@ -1064,13 +1073,17 @@ static int output_interface(struct genbind_node *genbind, output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_EPILOGUE); /* binding epilogue */ - output_cdata(ifacef, binding_node, GENBIND_NODE_TYPE_EPILOGUE); + output_cdata(ifacef, + interface_map->binding_node, + GENBIND_NODE_TYPE_EPILOGUE); /* class postface */ output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_POSTFACE); /* binding postface */ - output_cdata(ifacef, binding_node, GENBIND_NODE_TYPE_POSTFACE); + output_cdata(ifacef, + interface_map->binding_node, + GENBIND_NODE_TYPE_POSTFACE); op_error: fclose(ifacef); @@ -1093,6 +1106,18 @@ output_private_header(struct interface_map *interface_map) return -1; } + /* binding preface */ + output_cdata(privf, + interface_map->binding_node, + GENBIND_NODE_TYPE_PREFACE); + + /* tool preface */ + output_tool_preface(privf); + + /* header guard */ + fprintf(privf, "\n#ifndef duk_libdom_private_h\n"); + fprintf(privf, "#define duk_libdom_private_h\n\n"); + for (idx = 0; idx < interface_map->entryc; idx++) { struct interface_map_entry *interfacee; struct interface_map_entry *inherite; @@ -1131,6 +1156,13 @@ output_private_header(struct interface_map *interface_map) } + /* binding postface */ + output_cdata(privf, + interface_map->binding_node, + GENBIND_NODE_TYPE_POSTFACE); + + fprintf(privf, "\n#endif\n"); + fclose(privf); return 0; @@ -1151,6 +1183,18 @@ output_prototype_header(struct interface_map *interface_map) return -1; } + /* binding preface */ + output_cdata(protof, + interface_map->binding_node, + GENBIND_NODE_TYPE_PREFACE); + + /* tool preface */ + output_tool_preface(protof); + + /* header guard */ + fprintf(protof, "\n#ifndef duk_libdom_prototype_h\n"); + fprintf(protof, "#define duk_libdom_prototype_h\n\n"); + for (idx = 0; idx < interface_map->entryc; idx++) { struct interface_map_entry *interfacee; struct genbind_node *init_node; @@ -1176,22 +1220,58 @@ output_prototype_header(struct interface_map *interface_map) fprintf(protof, ";\n\n"); } + /* binding postface */ + output_cdata(protof, + interface_map->binding_node, + GENBIND_NODE_TYPE_POSTFACE); + + fprintf(protof, "\n#endif\n"); + fclose(protof); return 0; } -int duk_libdom_output(struct genbind_node *genbind, - struct webidl_node *webidl, - struct interface_map *interface_map) +/** + * generate protottype header + */ +static int +output_makefile(struct interface_map *interface_map) +{ + int idx; + FILE *makef; + + /* open output file */ + makef = genb_fopen("Makefile", "w"); + if (makef == NULL) { + return -1; + } + + fprintf(makef, "# duk libdom makefile fragment\n\n"); + + fprintf(makef, "NSGENBIND_SOURCES:="); + for (idx = 0; idx < interface_map->entryc; idx++) { + struct interface_map_entry *interfacee; + + interfacee = interface_map->entries + idx; + + fprintf(makef, "%s ", interfacee->filename); + } + fprintf(makef, "\nNSGENBIND_PREFIX:=%s\n", options->outdirname); + + fclose(makef); + + return 0; +} + +int duk_libdom_output(struct interface_map *interface_map) { int idx; int res = 0; /* generate interfaces */ for (idx = 0; idx < interface_map->entryc; idx++) { - res = output_interface(genbind, - interface_map, + res = output_interface(interface_map, interface_map->entries + idx); if (res != 0) { goto output_err; @@ -1211,7 +1291,8 @@ int duk_libdom_output(struct genbind_node *genbind, } /* generate makefile fragment */ - /** \todo implement makefile generation */ + res = output_makefile(interface_map); + output_err: return res; diff --git a/src/duk-libdom.h b/src/duk-libdom.h index 8e86d74..e1dd2c4 100644 --- a/src/duk-libdom.h +++ b/src/duk-libdom.h @@ -9,8 +9,6 @@ #ifndef nsgenbind_duk_libdom_h #define nsgenbind_duk_libdom_h -int duk_libdom_output(struct genbind_node *genbind, - struct webidl_node *webidl, - struct interface_map *interface_map); +int duk_libdom_output(struct interface_map *interface_map); #endif diff --git a/src/interface-map.c b/src/interface-map.c index 2ac1871..13d6106 100644 --- a/src/interface-map.c +++ b/src/interface-map.c @@ -378,20 +378,20 @@ constant_map_new(struct webidl_node *interface, int interface_map_new(struct genbind_node *genbind, struct webidl_node *webidl, - struct interface_map **index_out) + struct interface_map **map_out) { int interfacec; struct interface_map_entry *entries; struct interface_map_entry *sorted_entries; struct interface_map_entry *ecur; struct webidl_node *node; - struct interface_map *index; + struct interface_map *map; interfacec = webidl_node_enumerate_type(webidl, WEBIDL_NODE_TYPE_INTERFACE); if (options->verbose) { - printf("Indexing %d interfaces\n", interfacec); + printf("Maping %d interfaces\n", interfacec); } entries = calloc(interfacec, sizeof(struct interface_map_entry)); @@ -399,12 +399,12 @@ int interface_map_new(struct genbind_node *genbind, return -1; } - /* for each interface populate an entry in the index */ + /* for each interface populate an entry in the map */ ecur = entries; node = webidl_node_find_type(webidl, NULL, WEBIDL_NODE_TYPE_INTERFACE); while (node != NULL) { - /* fill index entry */ + /* fill map entry */ ecur->node = node; /* name of interface */ @@ -461,11 +461,14 @@ int interface_map_new(struct genbind_node *genbind, /* compute inheritance and refcounts on sorted map */ compute_inherit_refcount(sorted_entries, interfacec); - index = malloc(sizeof(struct interface_map)); - index->entryc = interfacec; - index->entries = sorted_entries; + map = malloc(sizeof(struct interface_map)); + map->entryc = interfacec; + map->entries = sorted_entries; + map->webidl = webidl; + map->binding_node = genbind_node_find_type(genbind, NULL, + GENBIND_NODE_TYPE_BINDING); - *index_out = index; + *map_out = map; return 0; } diff --git a/src/interface-map.h b/src/interface-map.h index 8ce6c01..e44380a 100644 --- a/src/interface-map.h +++ b/src/interface-map.h @@ -77,12 +77,21 @@ struct interface_map_entry { /** WebIDL interface map */ struct interface_map { int entryc; /**< count of interfaces */ - struct interface_map_entry *entries; + struct interface_map_entry *entries; /**< interface entries */ + + /** The AST node of the binding information */ + struct genbind_node *binding_node; + + /** Root AST node of the webIDL */ + struct webidl_node *webidl; }; +/** + * Create a new interface map + */ int interface_map_new(struct genbind_node *genbind, struct webidl_node *webidl, - struct interface_map **index_out); + struct interface_map **map_out); int interface_map_dump(struct interface_map *map); diff --git a/src/nsgenbind.c b/src/nsgenbind.c index b3191ba..65feedd 100644 --- a/src/nsgenbind.c +++ b/src/nsgenbind.c @@ -207,7 +207,7 @@ int main(int argc, char **argv) /* debug dump of web idl AST */ webidl_dump_ast(webidl_root); - /* generate index of interfaces in idl sorted by inheritance */ + /* generate map of WebIDL interfaces sorted by inheritance */ res = interface_map_new(genbind_root, webidl_root, &interface_map); if (res != 0) { return 5; @@ -220,7 +220,7 @@ int main(int argc, char **argv) /* generate binding */ switch (bindingtype) { case BINDINGTYPE_DUK_LIBDOM: - res = duk_libdom_output(genbind_root, webidl_root, interface_map); + res = duk_libdom_output(interface_map); break; default: |