/* 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 */ /** @todo this currently stuffs everything in one global tree, not very nice */ #include #include #include #include #include #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; }