summaryrefslogtreecommitdiff
path: root/src/genjsbind-ast.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/genjsbind-ast.c')
-rw-r--r--src/genjsbind-ast.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/genjsbind-ast.c b/src/genjsbind-ast.c
new file mode 100644
index 0000000..ccadc7f
--- /dev/null
+++ b/src/genjsbind-ast.c
@@ -0,0 +1,151 @@
+/* binding generator AST implementation for parser
+ *
+ * This file is part of nsgenjsbind.
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
+ */
+
+/** @todo this currently stuffs everything in one global tree, not very nice
+ */
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#include "genjsbind-ast.h"
+#include "webidl-ast.h"
+#include "options.h"
+
+/* parser and lexer interface */
+extern int genjsbind_debug;
+extern int genjsbind__flex_debug;
+extern void genjsbind_restart(FILE*);
+extern int genjsbind_parse(void);
+
+
+#define HDR_COMMENT_SEP "\n * "
+#define HDR_COMMENT_SEP_LEN 4
+#define HDR_COMMENT_PREABLE "Generated by nsgenjsapi"HDR_COMMENT_SEP
+
+/* current state */
+static char *hdr_comments = NULL;
+static char *preamble = NULL;
+static char *ifname;
+
+int genjsbind_header_comment(char *comment)
+{
+ char *fullstr;
+ int fulllen;
+ fulllen = strlen(hdr_comments) + strlen(comment) + HDR_COMMENT_SEP_LEN + 1;
+ fullstr = malloc(fulllen);
+ snprintf(fullstr, fulllen, "%s"HDR_COMMENT_SEP"%s", hdr_comments , comment);
+ free(hdr_comments);
+ free(comment);
+ hdr_comments = fullstr;
+
+ return 0;
+}
+
+int genjsbind_preamble(char *ccode)
+{
+ char *fullstr;
+ int fulllen;
+ fulllen = strlen(preamble) + strlen(ccode) + 1;
+ fullstr = malloc(fulllen);
+ snprintf(fullstr, fulllen, "%s%s", preamble , ccode);
+ free(preamble);
+ free(ccode);
+ preamble = fullstr;
+
+ return 0;
+}
+
+int genjsbind_interface(char *interface)
+{
+ ifname = interface;
+ return 0;
+}
+
+static void init_state(void)
+{
+ /* initialise root node */
+ webidl_root = webidl_new_node(WEBIDL_NODE_TYPE_ROOT);
+
+ /* set default comment header text */
+ hdr_comments = strdup(HDR_COMMENT_PREABLE);
+
+ preamble = strdup("");
+}
+
+int genjsbind_parsefile(char *infilename)
+{
+ FILE *infile;
+
+ /* open input file */
+ if ((infilename[0] == '-') &&
+ (infilename[1] == 0)) {
+ if (options->verbose) {
+ printf("Using stdin for input\n");
+ }
+ infile = stdin;
+ } else {
+ if (options->verbose) {
+ printf("Opening binding file %s\n", options->infilename);
+ }
+ infile = fopen(infilename, "r");
+ }
+
+ if (!infile) {
+ fprintf(stderr, "Error opening %s: %s\n",
+ infilename,
+ strerror(errno));
+ return 3;
+ }
+
+ /* initialise internal state */
+ init_state();
+
+ if (options->debug) {
+ genjsbind_debug = 1;
+ genjsbind__flex_debug = 1;
+ }
+
+ /* set flex to read from file */
+ genjsbind_restart(infile);
+
+ /* process binding */
+ return genjsbind_parse();
+
+}
+
+int genjsbind_output(char *outfilename)
+{
+ FILE *outfile = NULL;
+ /* open output file */
+ if (outfilename == NULL) {
+ outfile = stdout;
+ } else {
+ outfile = fopen(outfilename, "w");
+ }
+
+ if (!outfile) {
+ fprintf(stderr, "Error opening output %s: %s\n",
+ outfilename,
+ strerror(errno));
+ return 4;
+ }
+
+ fprintf(outfile, "/* %s\n */\n\n", hdr_comments);
+
+ fprintf(outfile, "%s", preamble);
+
+ fprintf(outfile, "/* interface %s */\n\n", ifname);
+
+ fclose(outfile);
+
+ return 0;
+}
+