aboutsummaryrefslogtreecommitdiff
path: root/Source/Modules/swigmain.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Modules/swigmain.cxx')
-rw-r--r--Source/Modules/swigmain.cxx242
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;
}