summaryrefslogtreecommitdiff
path: root/src/duk-libdom.c
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 /src/duk-libdom.c
parent4b723a410bc1a3355d401b95ac390f377b5d77b8 (diff)
downloadnsgenbind-02ebfefd0fc3d81b59cc15f34033210a6344f430.tar.gz
nsgenbind-02ebfefd0fc3d81b59cc15f34033210a6344f430.tar.bz2
Generate makefile fragment and add header guards
Diffstat (limited to 'src/duk-libdom.c')
-rw-r--r--src/duk-libdom.c119
1 files changed, 100 insertions, 19 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;