diff options
Diffstat (limited to 'Source/Modules/swigmain.cxx')
-rw-r--r-- | Source/Modules/swigmain.cxx | 242 |
1 files changed, 153 insertions, 89 deletions
diff --git a/Source/Modules/swigmain.cxx b/Source/Modules/swigmain.cxx index 397677fc5..8d52af194 100644 --- a/Source/Modules/swigmain.cxx +++ b/Source/Modules/swigmain.cxx @@ -26,79 +26,62 @@ can be dynamically loaded in future versions. */ extern "C" { - Language *swig_tcl(void); - Language *swig_python(void); - Language *swig_perl5(void); - Language *swig_ruby(void); + Language *swig_csharp(void); + Language *swig_d(void); + Language *swig_go(void); Language *swig_guile(void); - Language *swig_modula3(void); - Language *swig_mzscheme(void); Language *swig_java(void); - Language *swig_php(void); - Language *swig_php4(void); - Language *swig_php5(void); + Language *swig_javascript(void); + Language *swig_lua(void); + Language *swig_mzscheme(void); Language *swig_ocaml(void); Language *swig_octave(void); - Language *swig_pike(void); - Language *swig_sexp(void); - Language *swig_xml(void); - Language *swig_chicken(void); - Language *swig_csharp(void); - Language *swig_allegrocl(void); - Language *swig_lua(void); - Language *swig_clisp(void); - Language *swig_cffi(void); - Language *swig_uffi(void); + Language *swig_perl5(void); + Language *swig_php(void); + Language *swig_python(void); Language *swig_r(void); + Language *swig_ruby(void); Language *swig_scilab(void); - Language *swig_go(void); - Language *swig_d(void); - Language *swig_javascript(void); + Language *swig_tcl(void); + Language *swig_xml(void); } -struct swig_module { - const char *name; - ModuleFactory fac; - const char *help; -}; - /* Association of command line options to language modules. Place an entry for new language modules here, keeping the list sorted alphabetically. */ -static swig_module modules[] = { - {"-allegrocl", swig_allegrocl, "ALLEGROCL"}, - {"-chicken", swig_chicken, "CHICKEN"}, - {"-clisp", swig_clisp, "CLISP"}, - {"-cffi", swig_cffi, "CFFI"}, - {"-csharp", swig_csharp, "C#"}, - {"-d", swig_d, "D"}, - {"-go", swig_go, "Go"}, - {"-guile", swig_guile, "Guile"}, - {"-java", swig_java, "Java"}, - {"-javascript", swig_javascript, "Javascript"}, - {"-lua", swig_lua, "Lua"}, - {"-modula3", swig_modula3, "Modula 3"}, - {"-mzscheme", swig_mzscheme, "Mzscheme"}, - {"-ocaml", swig_ocaml, "Ocaml"}, - {"-octave", swig_octave, "Octave"}, - {"-perl", swig_perl5, "Perl"}, - {"-perl5", swig_perl5, 0}, - {"-php", swig_php5, 0}, - {"-php4", swig_php4, 0}, - {"-php5", swig_php5, "PHP5"}, - {"-php7", swig_php, "PHP7"}, - {"-pike", swig_pike, "Pike"}, - {"-python", swig_python, "Python"}, - {"-r", swig_r, "R (aka GNU S)"}, - {"-ruby", swig_ruby, "Ruby"}, - {"-scilab", swig_scilab, "Scilab"}, - {"-sexp", swig_sexp, "Lisp S-Expressions"}, - {"-tcl", swig_tcl, "Tcl"}, - {"-tcl8", swig_tcl, 0}, - {"-uffi", swig_uffi, "Common Lisp / UFFI"}, - {"-xml", swig_xml, "XML"}, - {NULL, NULL, NULL} +static TargetLanguageModule modules[] = { + {"-allegrocl", NULL, "ALLEGROCL", Disabled}, + {"-chicken", NULL, "CHICKEN", Disabled}, + {"-clisp", NULL, "CLISP", Disabled}, + {"-cffi", NULL, "CFFI", Disabled}, + {"-csharp", swig_csharp, "C#", Supported}, + {"-d", swig_d, "D", Supported}, + {"-go", swig_go, "Go", Supported}, + {"-guile", swig_guile, "Guile", Supported}, + {"-java", swig_java, "Java", Supported}, + {"-javascript", swig_javascript, "Javascript", Supported}, + {"-lua", swig_lua, "Lua", Supported}, + {"-modula3", NULL, "Modula 3", Disabled}, + {"-mzscheme", swig_mzscheme, "MzScheme/Racket", Experimental}, + {"-ocaml", swig_ocaml, "OCaml", Experimental}, + {"-octave", swig_octave, "Octave", Supported}, + {"-perl", swig_perl5, NULL, Supported}, + {"-perl5", swig_perl5, "Perl 5", Supported}, + {"-php", swig_php, NULL, Supported}, + {"-php5", NULL, "PHP 5", Disabled}, + {"-php7", swig_php, "PHP 7", Supported}, + {"-pike", NULL, "Pike", Disabled}, + {"-python", swig_python, "Python", Supported}, + {"-r", swig_r, "R (aka GNU S)", Supported}, + {"-ruby", swig_ruby, "Ruby", Supported}, + {"-scilab", swig_scilab, "Scilab", Supported}, + {"-sexp", NULL, "Lisp S-Expressions", Disabled}, + {"-tcl", swig_tcl, NULL, Supported}, + {"-tcl8", swig_tcl, "Tcl 8", Supported}, + {"-uffi", NULL, "Common Lisp / UFFI", Disabled}, + {"-xml", swig_xml, "XML", Supported}, + {NULL, NULL, NULL, Disabled} }; #ifdef MACSWIG @@ -106,10 +89,6 @@ static swig_module modules[] = { #include <SIOUX.h> #endif -#ifndef SWIG_LANG -#define SWIG_LANG "-python" -#endif - //----------------------------------------------------------------- // main() // @@ -119,13 +98,14 @@ static swig_module modules[] = { void SWIG_merge_envopt(const char *env, int oargc, char *oargv[], int *nargc, char ***nargv) { if (!env) { *nargc = oargc; - *nargv = oargv; + *nargv = (char **)malloc(sizeof(char *) * (oargc + 1)); + memcpy(*nargv, oargv, sizeof(char *) * (oargc + 1)); return; } int argc = 1; int arge = oargc + 1024; - char **argv = (char **) malloc(sizeof(char *) * (arge)); + char **argv = (char **) malloc(sizeof(char *) * (arge + 1)); char *buffer = (char *) malloc(2048); char *b = buffer; char *be = b + 1023; @@ -147,49 +127,139 @@ void SWIG_merge_envopt(const char *env, int oargc, char *oargv[], int *nargc, ch for (int i = 1; (i < oargc) && (argc < arge); ++i, ++argc) { argv[argc] = oargv[i]; } + argv[argc] = NULL; *nargc = argc; *nargv = argv; } +static void insert_option(int *argc, char ***argv, int index, char const *start, char const *end) { + int new_argc = *argc; + char **new_argv = *argv; + size_t option_len = end - start; + + // Preserve the NULL pointer at argv[argc] + new_argv = (char **)realloc(new_argv, (new_argc + 2) * sizeof(char *)); + memmove(&new_argv[index + 1], &new_argv[index], sizeof(char *) * (new_argc + 1 - index)); + new_argc++; + + new_argv[index] = (char *)malloc(option_len + 1); + memcpy(new_argv[index], start, option_len); + new_argv[index][option_len] = '\0'; + + *argc = new_argc; + *argv = new_argv; +} + +static void merge_options_files(int *argc, char ***argv) { + static const int BUFFER_SIZE = 4096; + char buffer[BUFFER_SIZE]; + int i; + int insert; + char **new_argv = *argv; + int new_argc = *argc; + FILE *f; + + i = 1; + while (i < new_argc) { + if (new_argv[i] && new_argv[i][0] == '@' && (f = fopen(&new_argv[i][1], "r"))) { + char c; + char *b; + char *be = &buffer[BUFFER_SIZE]; + int quote = 0; + bool escape = false; + + new_argc--; + memmove(&new_argv[i], &new_argv[i + 1], sizeof(char *) * (new_argc - i)); + insert = i; + b = buffer; + + while ((c = fgetc(f)) != EOF) { + if (escape) { + if (b != be) { + *b = c; + ++b; + } + escape = false; + } else if (c == '\\') { + escape = true; + } else if (!quote && (c == '\'' || c == '"')) { + quote = c; + } else if (quote && c == quote) { + quote = 0; + } else if (isspace(c) && !quote) { + if (b != buffer) { + insert_option(&new_argc, &new_argv, insert, buffer, b); + insert++; + + b = buffer; + } + } else if (b != be) { + *b = c; + ++b; + } + } + if (b != buffer) + insert_option(&new_argc, &new_argv, insert, buffer, b); + fclose(f); + } else { + ++i; + } + } + + *argv = new_argv; + *argc = new_argc; +} + int main(int margc, char **margv) { int i; - Language *dl = 0; - ModuleFactory fac = 0; + const TargetLanguageModule *language_module = 0; int argc; char **argv; SWIG_merge_envopt(getenv("SWIG_FEATURES"), margc, margv, &argc, &argv); + merge_options_files(&argc, &argv); #ifdef MACSWIG SIOUXSettings.asktosaveonclose = false; argc = ccommand(&argv); #endif - /* Register built-in modules */ - for (i = 0; modules[i].name; i++) { - Swig_register_module(modules[i].name, modules[i].fac); - } - Swig_init_args(argc, argv); /* Get options */ for (i = 1; i < argc; i++) { if (argv[i]) { - fac = Swig_find_module(argv[i]); - if (fac) { - dl = (fac) (); - Swig_mark_arg(i); - } else if (strcmp(argv[i], "-nolang") == 0) { - dl = new Language; + bool is_target_language_module = false; + for (int j = 0; modules[j].name; j++) { + if (strcmp(modules[j].name, argv[i]) == 0) { + language_module = &modules[j]; + is_target_language_module = true; + break; + } + } + if (is_target_language_module) { Swig_mark_arg(i); + if (language_module->status == Disabled) { + if (language_module->help) + Printf(stderr, "Target language option %s (%s) is no longer supported.\n", language_module->name, language_module->help); + else + Printf(stderr, "Target language option %s is no longer supported.\n", language_module->name); + SWIG_exit(EXIT_FAILURE); + } } else if ((strcmp(argv[i], "-help") == 0) || (strcmp(argv[i], "--help") == 0)) { if (strcmp(argv[i], "--help") == 0) strcpy(argv[i], "-help"); - Printf(stdout, "Target Language Options\n"); + Printf(stdout, "Supported Target Language Options\n"); for (int j = 0; modules[j].name; j++) { - if (modules[j].help) { + if (modules[j].help && modules[j].status == Supported) { + Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); + } + } + Printf(stdout, "\nExperimental Target Language Options\n"); + for (int j = 0; modules[j].name; j++) { + if (modules[j].help && modules[j].status == Experimental) { Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); } } @@ -197,14 +267,8 @@ int main(int margc, char **margv) { } } } - if (!dl) { - fac = Swig_find_module(SWIG_LANG); - if (fac) { - dl = (fac) (); - } - } - int res = SWIG_main(argc, argv, dl); + int res = SWIG_main(argc, argv, language_module); return res; } |