diff options
Diffstat (limited to 'src/genjsbind-ast.c')
-rw-r--r-- | src/genjsbind-ast.c | 151 |
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; +} + |