From e53469bc7682678c56e2a8b4b7038524ca0c461a Mon Sep 17 00:00:00 2001 From: "brendan%netscape.com" Date: Tue, 16 Feb 1999 05:10:40 +0000 Subject: [PATCH] prep for -m stub; misc code cleanups. --- xpcom/tools/xpidl/Makefile.in | 1 + xpcom/tools/xpidl/makefile.win | 1 + xpcom/tools/xpidl/xpidl.c | 67 ++++++++++++++++-------- xpcom/tools/xpidl/xpidl.h | 24 +++++---- xpcom/tools/xpidl/xpidl_doc.c | 2 +- xpcom/tools/xpidl/xpidl_header.c | 14 ++--- xpcom/tools/xpidl/xpidl_idl.c | 81 +++++++++++++---------------- xpcom/tools/xpidl/xpidl_stub.c | 28 ++++++++++ xpcom/tools/xpidl/xpidl_typelib.c | 2 +- xpcom/typelib/xpidl/Makefile.in | 1 + xpcom/typelib/xpidl/makefile.win | 1 + xpcom/typelib/xpidl/xpidl.c | 67 ++++++++++++++++-------- xpcom/typelib/xpidl/xpidl.h | 24 +++++---- xpcom/typelib/xpidl/xpidl_doc.c | 2 +- xpcom/typelib/xpidl/xpidl_header.c | 14 ++--- xpcom/typelib/xpidl/xpidl_idl.c | 81 +++++++++++++---------------- xpcom/typelib/xpidl/xpidl_stub.c | 28 ++++++++++ xpcom/typelib/xpidl/xpidl_typelib.c | 2 +- 18 files changed, 270 insertions(+), 170 deletions(-) create mode 100644 xpcom/tools/xpidl/xpidl_stub.c create mode 100644 xpcom/typelib/xpidl/xpidl_stub.c diff --git a/xpcom/tools/xpidl/Makefile.in b/xpcom/tools/xpidl/Makefile.in index 12409cb712e..42851701a0a 100644 --- a/xpcom/tools/xpidl/Makefile.in +++ b/xpcom/tools/xpidl/Makefile.in @@ -28,6 +28,7 @@ CSRCS = \ xpidl.c \ xpidl_idl.c \ xpidl_header.c \ + xpidl_stub.c \ xpidl_typelib.c \ xpidl_doc.c \ $(NULL) diff --git a/xpcom/tools/xpidl/makefile.win b/xpcom/tools/xpidl/makefile.win index c83fe73f50a..20b559347e8 100644 --- a/xpcom/tools/xpidl/makefile.win +++ b/xpcom/tools/xpidl/makefile.win @@ -25,6 +25,7 @@ OBJS = \ .\$(OBJDIR)\xpidl.obj \ .\$(OBJDIR)\xpidl_idl.obj \ .\$(OBJDIR)\xpidl_header.obj \ + .\$(OBJDIR)\xpidl_stub.obj \ .\$(OBJDIR)\xpidl_typelib.obj \ .\$(OBJDIR)\xpidl_doc.obj \ $(NULL) diff --git a/xpcom/tools/xpidl/xpidl.c b/xpcom/tools/xpidl/xpidl.c index 4f5c36bdb7c..da8e7a3d7b6 100644 --- a/xpcom/tools/xpidl/xpidl.c +++ b/xpcom/tools/xpidl/xpidl.c @@ -23,9 +23,10 @@ #include "xpidl.h" static ModeData modes[] = { - {"header", "Generate C++ header", "h", NULL }, - {"typelib", "Generate XPConnect typelib", "xpt", NULL }, - {"doc", "Generate HTML documentation", "html", NULL }, + {"header", "Generate C++ header", "h", xpidl_header_dispatch}, + {"stub", "Generate C++ JS API stubs", "cpp", xpidl_stub_dispatch}, + {"typelib", "Generate XPConnect typelib", "xpt", xpidl_typelib_dispatch}, + {"doc", "Generate HTML documentation", "html", xpidl_doc_dispatch}, {0} }; @@ -33,18 +34,18 @@ static ModeData * FindMode(char *mode) { int i; - for (i = 0; modes[i].mode && strcmp(modes[i].mode, mode); i++) - ; - if (modes[i].mode) - return &modes[i]; + for (i = 0; modes[i].mode; i++) { + if (!strcmp(modes[i].mode, mode)) + return &modes[i]; + } return NULL; -} +} gboolean enable_debug = FALSE; gboolean enable_warnings = FALSE; gboolean verbose_mode = FALSE; -static char xpidl_usage_str[] = +static char xpidl_usage_str[] = "Usage: %s [-m mode] [-w] [-v] [-I path] [-n] [-o basename] filename.idl\n" " -w turn on warnings (recommended)\n" " -v verbose mode (NYI)\n" @@ -52,7 +53,7 @@ static char xpidl_usage_str[] = " -o use basename (e.g. ``/tmp/nsIThing'') for output\n" " -m specify output mode:\n"; -static void +static void xpidl_usage(int argc, char *argv[]) { int i; @@ -63,25 +64,50 @@ xpidl_usage(int argc, char *argv[]) } } +static char OOM[] = "ERROR: out of memory\n"; + +void * +xpidl_malloc(size_t nbytes) +{ + void *p = malloc(nbytes); + if (!p) { + fputs(OOM, stderr); + exit(1); + } + return p; +} + +char * +xpidl_strdup(const char *s) +{ + char *ns = strdup(s); + if (!ns) { + fputs(OOM, stderr); + exit(1); + } + return ns; +} + int main(int argc, char *argv[]) { int i, idlfiles; - IncludePathEntry *inc, *inc_head = NULL; + IncludePathEntry *inc, *inc_head, **inc_tail; char *basename = NULL; ModeData *mode = NULL; - inc_head = malloc(sizeof *inc); - if (!inc_head) - return 1; + inc_head = xpidl_malloc(sizeof *inc); inc_head->directory = "."; inc_head->next = NULL; + inc_tail = &inc_head->next; +#if 0 /* initialize mode factories */ modes[0].factory = headerDispatch; modes[1].factory = typelibDispatch; modes[2].factory = docDispatch; - +#endif + for (i = 1; i < argc; i++) { if (argv[i][0] != '-') break; @@ -103,15 +129,14 @@ main(int argc, char *argv[]) xpidl_usage(argc, argv); return 1; } - inc = malloc(sizeof *inc); - if (!inc) - return 1; + inc = xpidl_malloc(sizeof *inc); inc->directory = argv[i + 1]; #ifdef DEBUG_shaver_includes fprintf(stderr, "adding %s to include path\n", inc->directory); #endif - inc->next = inc_head; - inc_head = inc; + inc->next = NULL; + *inc_tail = inc; + inc_tail = &inc->next; i++; break; case 'o': @@ -169,7 +194,7 @@ main(int argc, char *argv[]) if (argv[i][0]) idlfiles += xpidl_process_idl(argv[i], inc_head, basename, mode); } - + if (!idlfiles) return 1; diff --git a/xpcom/tools/xpidl/xpidl.h b/xpcom/tools/xpidl/xpidl.h index 17c87d6ef34..11f0ec7a535 100644 --- a/xpcom/tools/xpidl/xpidl.h +++ b/xpcom/tools/xpidl/xpidl.h @@ -49,9 +49,10 @@ typedef gboolean (*nodeHandler)(TreeState *); /* Function that produces a table of nodeHandlers for a given mode */ typedef nodeHandler *(*nodeHandlerFactory)(); -extern nodeHandler *headerDispatch(); -extern nodeHandler *typelibDispatch(); -extern nodeHandler *docDispatch(); +extern nodeHandler *xpidl_header_dispatch(); +extern nodeHandler *xpidl_stub_dispatch(); +extern nodeHandler *xpidl_typelib_dispatch(); +extern nodeHandler *xpidl_doc_dispatch(); /* * nodeHandler that reports an error. @@ -96,17 +97,18 @@ void xpidl_list_foreach(IDL_tree p, IDL_tree_func foreach, gpointer user_data); /* - * Add an output file to an internal list. Used to clean up temporary files - * in case of fatal error. + * Wrapper whines to stderr then exits after null return from malloc or strdup. */ +void * +xpidl_malloc(size_t nbytes); -void -XPIDL_add_output_file(char *fn); - -void -XPIDL_cleanup_on_error(); +char * +xpidl_strdup(const char *s); +/* + * Process an XPIDL node and its kids, if any. + */ gboolean -process_node(TreeState *state); +xpidl_process_node(TreeState *state); #endif /* __xpidl_h */ diff --git a/xpcom/tools/xpidl/xpidl_doc.c b/xpcom/tools/xpidl/xpidl_doc.c index 7b2784ae705..6b1906ec5a8 100644 --- a/xpcom/tools/xpidl/xpidl_doc.c +++ b/xpcom/tools/xpidl/xpidl_doc.c @@ -22,7 +22,7 @@ * Generates documentation from javadoc-style comments in XPIDL files. */ -nodeHandler *docDispatch() +nodeHandler *xpidl_doc_dispatch() { static nodeHandler table[IDLN_LAST]; static gboolean initialized = FALSE; diff --git a/xpcom/tools/xpidl/xpidl_header.c b/xpcom/tools/xpidl/xpidl_header.c index 17b1c70b3c3..a2094a20a18 100644 --- a/xpcom/tools/xpidl/xpidl_header.c +++ b/xpcom/tools/xpidl/xpidl_header.c @@ -148,7 +148,7 @@ interface(TreeState *state) state->tree = IDL_INTERFACE(iface).body; - if (state->tree && !process_node(state)) + if (state->tree && !xpidl_process_node(state)) return FALSE; fputs("};\n", state->file); @@ -162,7 +162,7 @@ list(TreeState *state) IDL_tree iter; for (iter = state->tree; iter; iter = IDL_LIST(iter).next) { state->tree = IDL_LIST(iter).data; - if (!process_node(state)) + if (!xpidl_process_node(state)) return FALSE; } return TRUE; @@ -310,7 +310,7 @@ param_dcls(TreeState *state) return FALSE; fputs(" ", state->file); state->tree = (IDL_tree)decl.simple_declarator; - if (!process_node(state)) + if (!xpidl_process_node(state)) return FALSE; if (IDL_LIST(iter).next) fputs(", ", state->file); @@ -364,7 +364,7 @@ static gboolean do_enum(TreeState *state) { IDL_tree enumb = state->tree, iter; - + fprintf(state->file, "enum %s {\n", IDL_IDENT(IDL_TYPE_ENUM(enumb).ident).str); @@ -491,7 +491,7 @@ codefrag(TreeState *state) return TRUE; } -nodeHandler *headerDispatch() +nodeHandler *xpidl_header_dispatch() { static nodeHandler table[IDLN_LAST]; static gboolean initialized = FALSE; @@ -508,6 +508,6 @@ nodeHandler *headerDispatch() table[IDLN_TYPE_DCL] = do_typedef; initialized = TRUE; } - - return table; + + return table; } diff --git a/xpcom/tools/xpidl/xpidl_idl.c b/xpcom/tools/xpidl/xpidl_idl.c index fc6a51363fd..27d1b4f0206 100644 --- a/xpcom/tools/xpidl/xpidl_idl.c +++ b/xpcom/tools/xpidl/xpidl_idl.c @@ -46,18 +46,19 @@ node_is_error(TreeState *state) void xpidl_list_foreach(IDL_tree p, IDL_tree_func foreach, gpointer user_data) { - IDL_tree iter = p; - for (; iter; iter = IDL_LIST(iter).next) + IDL_tree iter; + for (iter = p; iter; iter = IDL_LIST(iter).next) { if (!foreach(IDL_LIST(iter).data, IDL_tree_get_scope(IDL_LIST(iter).data), user_data)) return; + } } /* * The bulk of the generation happens here. */ gboolean -process_node(TreeState *state) +xpidl_process_node(TreeState *state) { nodeHandler *handlerp = state->dispatch, handler; gint type; @@ -86,7 +87,7 @@ process_tree(TreeState *state) if (!process_tree_pass1(state)) return FALSE; state->tree = top; /* pass1 might mutate state */ - if (!process_node(state)) + if (!xpidl_process_node(state)) return FALSE; state->tree = NULL; if (!process_tree_pass1(state)) @@ -143,7 +144,7 @@ fopen_from_includes(const char *filename, const char *mode, return stdin; for (; include_path && !file; include_path = include_path->next) { - filebuf = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", + filebuf = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", include_path->directory, filename); if (!filebuf) return NULL; @@ -161,28 +162,16 @@ fopen_from_includes(const char *filename, const char *mode, static struct input_callback_data * new_input_callback_data(const char *filename, IncludePathEntry *include_path) { - struct input_callback_data *new_data = calloc(1, sizeof *new_data); - if (!new_data) - return NULL; + struct input_callback_data *new_data = xpidl_malloc(sizeof *new_data); + memset(new_data, 0, sizeof *new_data); new_data->input = fopen_from_includes(filename, "r", include_path); if (!new_data->input) return NULL; - new_data->buf = malloc(INPUT_BUF_CHUNK + 1); /* trailing NUL */ - if (!new_data->buf) { - fclose(new_data->input); - return NULL; - } - new_data->len = 0; + new_data->buf = xpidl_malloc(INPUT_BUF_CHUNK + 1); /* trailing NUL */ new_data->point = new_data->buf; new_data->max = INPUT_BUF_CHUNK; - new_data->filename = strdup(filename); - if (!new_data->filename) { - free(new_data->buf); - fclose(new_data->input); - return NULL; - } + new_data->filename = xpidl_strdup(filename); new_data->lineno = 1; - new_data->next = NULL; return new_data; } @@ -194,7 +183,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, struct input_callback_data *data = stack->top, *new_data = NULL; int avail, copy; char *check_point, *ptr, *end_copy, *raw_start, *comment_start, - *include_start; + *include_start; switch(reason) { case IDL_INPUT_REASON_INIT: @@ -206,7 +195,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, IDL_file_set(new_data->filename, new_data->lineno); stack->top = new_data; return 0; - + case IDL_INPUT_REASON_FILL: fill_start: avail = data->buf + data->len - data->point; @@ -273,7 +262,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, #endif end_copy = comment_start; } - + /* include */ if ((include_start = strstr(check_point, "#include")) && (!raw_start || include_start < raw_start) && @@ -295,11 +284,11 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, #endif } else { #ifdef DEBUG_shaver_bufmgmt - fprintf(stderr, "already have special %d/%d/%d\n", + fprintf(stderr, "already have special %d/%d/%d\n", data->f_raw, data->f_comment, data->f_include); #endif } - + if ((end_copy == data->point || /* just found one at the start */ end_copy == data->buf + data->len /* left over */) && (data->f_raw || data->f_comment || data->f_include)) { @@ -349,7 +338,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, return -1; } data->point = ptr+1; - + *ptr = 0; ptr = strrchr(filename, '.'); @@ -359,11 +348,11 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, assert(stack->includes); if (!g_hash_table_lookup(stack->includes, filename)) { char *basename = filename; - filename = strdup(filename); + filename = xpidl_strdup(filename); ptr = strrchr(basename, '.'); if (ptr) *ptr = 0; - basename = strdup(basename); + basename = xpidl_strdup(basename); g_hash_table_insert(stack->includes, filename, basename); new_data = new_input_callback_data(filename, stack->include_path); @@ -381,22 +370,21 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, #endif /* now continue getting data from new file */ goto fill_start; - } else { - /* - * if we started with a #include, but we've already - * processed that file, we need to continue scanning - * for special sequences. - */ - data->f_include = INPUT_IN_NONE; - goto scan_for_special; } + /* + * if we started with a #include, but we've already + * processed that file, we need to continue scanning + * for special sequences. + */ + data->f_include = INPUT_IN_NONE; + goto scan_for_special; } } else { #ifdef DEBUG_shaver_bufmgmt fprintf(stderr, "no specials\n"); #endif } - + avail = MIN(data->buf + data->len, end_copy) - data->point; #ifdef DEBUG_shaver_bufmgmt fprintf(stderr, @@ -413,7 +401,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, memcpy(cb_data->fill.buffer, data->point, copy); data->point += copy; return copy; - + case IDL_INPUT_REASON_ABORT: case IDL_INPUT_REASON_FINISH: if (data->input != stdin) @@ -447,15 +435,15 @@ xpidl_process_idl(char *filename, IncludePathEntry *include_path, return 0; } - state.basename = strdup(filename); + state.basename = xpidl_strdup(filename); tmp = strrchr(state.basename, '.'); if (tmp) *tmp = '\0'; - + if (!basename) - outname = strdup(state.basename); + outname = xpidl_strdup(state.basename); else - outname = strdup(basename); + outname = xpidl_strdup(basename); /* so we don't include it again! */ g_hash_table_insert(stack.includes, filename, state.basename); @@ -475,6 +463,11 @@ xpidl_process_idl(char *filename, IncludePathEntry *include_path, return 0; } + state.basename = xpidl_strdup(filename); + tmp = strrchr(state.basename, '.'); + if (tmp) + *tmp = '\0'; + /* so we don't make a #include for it */ g_hash_table_remove(stack.includes, filename); @@ -509,6 +502,6 @@ xpidl_process_idl(char *filename, IncludePathEntry *include_path, */ IDL_ns_free(state.ns); IDL_tree_free(top); - + return 1; } diff --git a/xpcom/tools/xpidl/xpidl_stub.c b/xpcom/tools/xpidl/xpidl_stub.c new file mode 100644 index 00000000000..3d7d8aace0f --- /dev/null +++ b/xpcom/tools/xpidl/xpidl_stub.c @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* + * Generate JS API class stub functions from XPIDL. + */ + +#include "xpidl.h" + +nodeHandler *xpidl_stub_dispatch() +{ + return NULL; +} diff --git a/xpcom/tools/xpidl/xpidl_typelib.c b/xpcom/tools/xpidl/xpidl_typelib.c index a13e2c4dcef..c9dca4fa170 100644 --- a/xpcom/tools/xpidl/xpidl_typelib.c +++ b/xpcom/tools/xpidl/xpidl_typelib.c @@ -23,7 +23,7 @@ #include "xpidl.h" -nodeHandler *typelibDispatch() +nodeHandler *xpidl_typelib_dispatch() { static nodeHandler table[IDLN_LAST]; static gboolean initialized = FALSE; diff --git a/xpcom/typelib/xpidl/Makefile.in b/xpcom/typelib/xpidl/Makefile.in index 12409cb712e..42851701a0a 100644 --- a/xpcom/typelib/xpidl/Makefile.in +++ b/xpcom/typelib/xpidl/Makefile.in @@ -28,6 +28,7 @@ CSRCS = \ xpidl.c \ xpidl_idl.c \ xpidl_header.c \ + xpidl_stub.c \ xpidl_typelib.c \ xpidl_doc.c \ $(NULL) diff --git a/xpcom/typelib/xpidl/makefile.win b/xpcom/typelib/xpidl/makefile.win index c83fe73f50a..20b559347e8 100644 --- a/xpcom/typelib/xpidl/makefile.win +++ b/xpcom/typelib/xpidl/makefile.win @@ -25,6 +25,7 @@ OBJS = \ .\$(OBJDIR)\xpidl.obj \ .\$(OBJDIR)\xpidl_idl.obj \ .\$(OBJDIR)\xpidl_header.obj \ + .\$(OBJDIR)\xpidl_stub.obj \ .\$(OBJDIR)\xpidl_typelib.obj \ .\$(OBJDIR)\xpidl_doc.obj \ $(NULL) diff --git a/xpcom/typelib/xpidl/xpidl.c b/xpcom/typelib/xpidl/xpidl.c index 4f5c36bdb7c..da8e7a3d7b6 100644 --- a/xpcom/typelib/xpidl/xpidl.c +++ b/xpcom/typelib/xpidl/xpidl.c @@ -23,9 +23,10 @@ #include "xpidl.h" static ModeData modes[] = { - {"header", "Generate C++ header", "h", NULL }, - {"typelib", "Generate XPConnect typelib", "xpt", NULL }, - {"doc", "Generate HTML documentation", "html", NULL }, + {"header", "Generate C++ header", "h", xpidl_header_dispatch}, + {"stub", "Generate C++ JS API stubs", "cpp", xpidl_stub_dispatch}, + {"typelib", "Generate XPConnect typelib", "xpt", xpidl_typelib_dispatch}, + {"doc", "Generate HTML documentation", "html", xpidl_doc_dispatch}, {0} }; @@ -33,18 +34,18 @@ static ModeData * FindMode(char *mode) { int i; - for (i = 0; modes[i].mode && strcmp(modes[i].mode, mode); i++) - ; - if (modes[i].mode) - return &modes[i]; + for (i = 0; modes[i].mode; i++) { + if (!strcmp(modes[i].mode, mode)) + return &modes[i]; + } return NULL; -} +} gboolean enable_debug = FALSE; gboolean enable_warnings = FALSE; gboolean verbose_mode = FALSE; -static char xpidl_usage_str[] = +static char xpidl_usage_str[] = "Usage: %s [-m mode] [-w] [-v] [-I path] [-n] [-o basename] filename.idl\n" " -w turn on warnings (recommended)\n" " -v verbose mode (NYI)\n" @@ -52,7 +53,7 @@ static char xpidl_usage_str[] = " -o use basename (e.g. ``/tmp/nsIThing'') for output\n" " -m specify output mode:\n"; -static void +static void xpidl_usage(int argc, char *argv[]) { int i; @@ -63,25 +64,50 @@ xpidl_usage(int argc, char *argv[]) } } +static char OOM[] = "ERROR: out of memory\n"; + +void * +xpidl_malloc(size_t nbytes) +{ + void *p = malloc(nbytes); + if (!p) { + fputs(OOM, stderr); + exit(1); + } + return p; +} + +char * +xpidl_strdup(const char *s) +{ + char *ns = strdup(s); + if (!ns) { + fputs(OOM, stderr); + exit(1); + } + return ns; +} + int main(int argc, char *argv[]) { int i, idlfiles; - IncludePathEntry *inc, *inc_head = NULL; + IncludePathEntry *inc, *inc_head, **inc_tail; char *basename = NULL; ModeData *mode = NULL; - inc_head = malloc(sizeof *inc); - if (!inc_head) - return 1; + inc_head = xpidl_malloc(sizeof *inc); inc_head->directory = "."; inc_head->next = NULL; + inc_tail = &inc_head->next; +#if 0 /* initialize mode factories */ modes[0].factory = headerDispatch; modes[1].factory = typelibDispatch; modes[2].factory = docDispatch; - +#endif + for (i = 1; i < argc; i++) { if (argv[i][0] != '-') break; @@ -103,15 +129,14 @@ main(int argc, char *argv[]) xpidl_usage(argc, argv); return 1; } - inc = malloc(sizeof *inc); - if (!inc) - return 1; + inc = xpidl_malloc(sizeof *inc); inc->directory = argv[i + 1]; #ifdef DEBUG_shaver_includes fprintf(stderr, "adding %s to include path\n", inc->directory); #endif - inc->next = inc_head; - inc_head = inc; + inc->next = NULL; + *inc_tail = inc; + inc_tail = &inc->next; i++; break; case 'o': @@ -169,7 +194,7 @@ main(int argc, char *argv[]) if (argv[i][0]) idlfiles += xpidl_process_idl(argv[i], inc_head, basename, mode); } - + if (!idlfiles) return 1; diff --git a/xpcom/typelib/xpidl/xpidl.h b/xpcom/typelib/xpidl/xpidl.h index 17c87d6ef34..11f0ec7a535 100644 --- a/xpcom/typelib/xpidl/xpidl.h +++ b/xpcom/typelib/xpidl/xpidl.h @@ -49,9 +49,10 @@ typedef gboolean (*nodeHandler)(TreeState *); /* Function that produces a table of nodeHandlers for a given mode */ typedef nodeHandler *(*nodeHandlerFactory)(); -extern nodeHandler *headerDispatch(); -extern nodeHandler *typelibDispatch(); -extern nodeHandler *docDispatch(); +extern nodeHandler *xpidl_header_dispatch(); +extern nodeHandler *xpidl_stub_dispatch(); +extern nodeHandler *xpidl_typelib_dispatch(); +extern nodeHandler *xpidl_doc_dispatch(); /* * nodeHandler that reports an error. @@ -96,17 +97,18 @@ void xpidl_list_foreach(IDL_tree p, IDL_tree_func foreach, gpointer user_data); /* - * Add an output file to an internal list. Used to clean up temporary files - * in case of fatal error. + * Wrapper whines to stderr then exits after null return from malloc or strdup. */ +void * +xpidl_malloc(size_t nbytes); -void -XPIDL_add_output_file(char *fn); - -void -XPIDL_cleanup_on_error(); +char * +xpidl_strdup(const char *s); +/* + * Process an XPIDL node and its kids, if any. + */ gboolean -process_node(TreeState *state); +xpidl_process_node(TreeState *state); #endif /* __xpidl_h */ diff --git a/xpcom/typelib/xpidl/xpidl_doc.c b/xpcom/typelib/xpidl/xpidl_doc.c index 7b2784ae705..6b1906ec5a8 100644 --- a/xpcom/typelib/xpidl/xpidl_doc.c +++ b/xpcom/typelib/xpidl/xpidl_doc.c @@ -22,7 +22,7 @@ * Generates documentation from javadoc-style comments in XPIDL files. */ -nodeHandler *docDispatch() +nodeHandler *xpidl_doc_dispatch() { static nodeHandler table[IDLN_LAST]; static gboolean initialized = FALSE; diff --git a/xpcom/typelib/xpidl/xpidl_header.c b/xpcom/typelib/xpidl/xpidl_header.c index 17b1c70b3c3..a2094a20a18 100644 --- a/xpcom/typelib/xpidl/xpidl_header.c +++ b/xpcom/typelib/xpidl/xpidl_header.c @@ -148,7 +148,7 @@ interface(TreeState *state) state->tree = IDL_INTERFACE(iface).body; - if (state->tree && !process_node(state)) + if (state->tree && !xpidl_process_node(state)) return FALSE; fputs("};\n", state->file); @@ -162,7 +162,7 @@ list(TreeState *state) IDL_tree iter; for (iter = state->tree; iter; iter = IDL_LIST(iter).next) { state->tree = IDL_LIST(iter).data; - if (!process_node(state)) + if (!xpidl_process_node(state)) return FALSE; } return TRUE; @@ -310,7 +310,7 @@ param_dcls(TreeState *state) return FALSE; fputs(" ", state->file); state->tree = (IDL_tree)decl.simple_declarator; - if (!process_node(state)) + if (!xpidl_process_node(state)) return FALSE; if (IDL_LIST(iter).next) fputs(", ", state->file); @@ -364,7 +364,7 @@ static gboolean do_enum(TreeState *state) { IDL_tree enumb = state->tree, iter; - + fprintf(state->file, "enum %s {\n", IDL_IDENT(IDL_TYPE_ENUM(enumb).ident).str); @@ -491,7 +491,7 @@ codefrag(TreeState *state) return TRUE; } -nodeHandler *headerDispatch() +nodeHandler *xpidl_header_dispatch() { static nodeHandler table[IDLN_LAST]; static gboolean initialized = FALSE; @@ -508,6 +508,6 @@ nodeHandler *headerDispatch() table[IDLN_TYPE_DCL] = do_typedef; initialized = TRUE; } - - return table; + + return table; } diff --git a/xpcom/typelib/xpidl/xpidl_idl.c b/xpcom/typelib/xpidl/xpidl_idl.c index fc6a51363fd..27d1b4f0206 100644 --- a/xpcom/typelib/xpidl/xpidl_idl.c +++ b/xpcom/typelib/xpidl/xpidl_idl.c @@ -46,18 +46,19 @@ node_is_error(TreeState *state) void xpidl_list_foreach(IDL_tree p, IDL_tree_func foreach, gpointer user_data) { - IDL_tree iter = p; - for (; iter; iter = IDL_LIST(iter).next) + IDL_tree iter; + for (iter = p; iter; iter = IDL_LIST(iter).next) { if (!foreach(IDL_LIST(iter).data, IDL_tree_get_scope(IDL_LIST(iter).data), user_data)) return; + } } /* * The bulk of the generation happens here. */ gboolean -process_node(TreeState *state) +xpidl_process_node(TreeState *state) { nodeHandler *handlerp = state->dispatch, handler; gint type; @@ -86,7 +87,7 @@ process_tree(TreeState *state) if (!process_tree_pass1(state)) return FALSE; state->tree = top; /* pass1 might mutate state */ - if (!process_node(state)) + if (!xpidl_process_node(state)) return FALSE; state->tree = NULL; if (!process_tree_pass1(state)) @@ -143,7 +144,7 @@ fopen_from_includes(const char *filename, const char *mode, return stdin; for (; include_path && !file; include_path = include_path->next) { - filebuf = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", + filebuf = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", include_path->directory, filename); if (!filebuf) return NULL; @@ -161,28 +162,16 @@ fopen_from_includes(const char *filename, const char *mode, static struct input_callback_data * new_input_callback_data(const char *filename, IncludePathEntry *include_path) { - struct input_callback_data *new_data = calloc(1, sizeof *new_data); - if (!new_data) - return NULL; + struct input_callback_data *new_data = xpidl_malloc(sizeof *new_data); + memset(new_data, 0, sizeof *new_data); new_data->input = fopen_from_includes(filename, "r", include_path); if (!new_data->input) return NULL; - new_data->buf = malloc(INPUT_BUF_CHUNK + 1); /* trailing NUL */ - if (!new_data->buf) { - fclose(new_data->input); - return NULL; - } - new_data->len = 0; + new_data->buf = xpidl_malloc(INPUT_BUF_CHUNK + 1); /* trailing NUL */ new_data->point = new_data->buf; new_data->max = INPUT_BUF_CHUNK; - new_data->filename = strdup(filename); - if (!new_data->filename) { - free(new_data->buf); - fclose(new_data->input); - return NULL; - } + new_data->filename = xpidl_strdup(filename); new_data->lineno = 1; - new_data->next = NULL; return new_data; } @@ -194,7 +183,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, struct input_callback_data *data = stack->top, *new_data = NULL; int avail, copy; char *check_point, *ptr, *end_copy, *raw_start, *comment_start, - *include_start; + *include_start; switch(reason) { case IDL_INPUT_REASON_INIT: @@ -206,7 +195,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, IDL_file_set(new_data->filename, new_data->lineno); stack->top = new_data; return 0; - + case IDL_INPUT_REASON_FILL: fill_start: avail = data->buf + data->len - data->point; @@ -273,7 +262,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, #endif end_copy = comment_start; } - + /* include */ if ((include_start = strstr(check_point, "#include")) && (!raw_start || include_start < raw_start) && @@ -295,11 +284,11 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, #endif } else { #ifdef DEBUG_shaver_bufmgmt - fprintf(stderr, "already have special %d/%d/%d\n", + fprintf(stderr, "already have special %d/%d/%d\n", data->f_raw, data->f_comment, data->f_include); #endif } - + if ((end_copy == data->point || /* just found one at the start */ end_copy == data->buf + data->len /* left over */) && (data->f_raw || data->f_comment || data->f_include)) { @@ -349,7 +338,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, return -1; } data->point = ptr+1; - + *ptr = 0; ptr = strrchr(filename, '.'); @@ -359,11 +348,11 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, assert(stack->includes); if (!g_hash_table_lookup(stack->includes, filename)) { char *basename = filename; - filename = strdup(filename); + filename = xpidl_strdup(filename); ptr = strrchr(basename, '.'); if (ptr) *ptr = 0; - basename = strdup(basename); + basename = xpidl_strdup(basename); g_hash_table_insert(stack->includes, filename, basename); new_data = new_input_callback_data(filename, stack->include_path); @@ -381,22 +370,21 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, #endif /* now continue getting data from new file */ goto fill_start; - } else { - /* - * if we started with a #include, but we've already - * processed that file, we need to continue scanning - * for special sequences. - */ - data->f_include = INPUT_IN_NONE; - goto scan_for_special; } + /* + * if we started with a #include, but we've already + * processed that file, we need to continue scanning + * for special sequences. + */ + data->f_include = INPUT_IN_NONE; + goto scan_for_special; } } else { #ifdef DEBUG_shaver_bufmgmt fprintf(stderr, "no specials\n"); #endif } - + avail = MIN(data->buf + data->len, end_copy) - data->point; #ifdef DEBUG_shaver_bufmgmt fprintf(stderr, @@ -413,7 +401,7 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data, memcpy(cb_data->fill.buffer, data->point, copy); data->point += copy; return copy; - + case IDL_INPUT_REASON_ABORT: case IDL_INPUT_REASON_FINISH: if (data->input != stdin) @@ -447,15 +435,15 @@ xpidl_process_idl(char *filename, IncludePathEntry *include_path, return 0; } - state.basename = strdup(filename); + state.basename = xpidl_strdup(filename); tmp = strrchr(state.basename, '.'); if (tmp) *tmp = '\0'; - + if (!basename) - outname = strdup(state.basename); + outname = xpidl_strdup(state.basename); else - outname = strdup(basename); + outname = xpidl_strdup(basename); /* so we don't include it again! */ g_hash_table_insert(stack.includes, filename, state.basename); @@ -475,6 +463,11 @@ xpidl_process_idl(char *filename, IncludePathEntry *include_path, return 0; } + state.basename = xpidl_strdup(filename); + tmp = strrchr(state.basename, '.'); + if (tmp) + *tmp = '\0'; + /* so we don't make a #include for it */ g_hash_table_remove(stack.includes, filename); @@ -509,6 +502,6 @@ xpidl_process_idl(char *filename, IncludePathEntry *include_path, */ IDL_ns_free(state.ns); IDL_tree_free(top); - + return 1; } diff --git a/xpcom/typelib/xpidl/xpidl_stub.c b/xpcom/typelib/xpidl/xpidl_stub.c new file mode 100644 index 00000000000..3d7d8aace0f --- /dev/null +++ b/xpcom/typelib/xpidl/xpidl_stub.c @@ -0,0 +1,28 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* + * Generate JS API class stub functions from XPIDL. + */ + +#include "xpidl.h" + +nodeHandler *xpidl_stub_dispatch() +{ + return NULL; +} diff --git a/xpcom/typelib/xpidl/xpidl_typelib.c b/xpcom/typelib/xpidl/xpidl_typelib.c index a13e2c4dcef..c9dca4fa170 100644 --- a/xpcom/typelib/xpidl/xpidl_typelib.c +++ b/xpcom/typelib/xpidl/xpidl_typelib.c @@ -23,7 +23,7 @@ #include "xpidl.h" -nodeHandler *typelibDispatch() +nodeHandler *xpidl_typelib_dispatch() { static nodeHandler table[IDLN_LAST]; static gboolean initialized = FALSE;