summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-07-31 21:49:45 +0100
committerVincent Sanders <vince@kyllikki.org>2015-07-31 21:49:45 +0100
commit02ebfefd0fc3d81b59cc15f34033210a6344f430 (patch)
tree22bb97027149ae2336e561b6f345bcf10593ff0d
parent4b723a410bc1a3355d401b95ac390f377b5d77b8 (diff)
downloadnsgenbind-02ebfefd0fc3d81b59cc15f34033210a6344f430.tar.gz
nsgenbind-02ebfefd0fc3d81b59cc15f34033210a6344f430.tar.bz2
Generate makefile fragment and add header guards
-rw-r--r--src/duk-libdom.c119
-rw-r--r--src/duk-libdom.h4
-rw-r--r--src/interface-map.c21
-rw-r--r--src/interface-map.h13
-rw-r--r--src/nsgenbind.c4
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: