1/* ----------------------------------------------------------------------------- 2 * See the LICENSE file for information on copyright, usage and redistribution 3 * of SWIG, and the README file for authors - http://www.swig.org/release.html. 4 * 5 * Simplified Wrapper and Interface Generator (SWIG) 6 * 7 * swigmain.cxx 8 * 9 * This file is the main entry point to SWIG. It collects the command 10 * line options, registers built-in language modules, and instantiates 11 * a module for code generation. If adding new language modules 12 * to SWIG, you would modify this file. 13 * ----------------------------------------------------------------------------- */ 14 15char cvsroot_swigmain_cxx[] = "$Id: swigmain.cxx 10969 2008-12-06 23:15:20Z wsfulton $"; 16 17#include "swigmod.h" 18#include <ctype.h> 19 20/* Module factories. These functions are used to instantiate 21 the built-in language modules. If adding a new language 22 module to SWIG, place a similar function here. Make sure 23 the function has "C" linkage. This is required so that modules 24 can be dynamically loaded in future versions. */ 25 26extern "C" { 27 Language *swig_tcl(void); 28 Language *swig_python(void); 29 Language *swig_perl5(void); 30 Language *swig_ruby(void); 31 Language *swig_guile(void); 32 Language *swig_modula3(void); 33 Language *swig_mzscheme(void); 34 Language *swig_java(void); 35 Language *swig_php(void); 36 Language *swig_php4(void); 37 Language *swig_ocaml(void); 38 Language *swig_octave(void); 39 Language *swig_pike(void); 40 Language *swig_sexp(void); 41 Language *swig_xml(void); 42 Language *swig_chicken(void); 43 Language *swig_csharp(void); 44 Language *swig_allegrocl(void); 45 Language *swig_lua(void); 46 Language *swig_clisp(void); 47 Language *swig_cffi(void); 48 Language *swig_uffi(void); 49 Language *swig_r(void); 50} 51 52struct swig_module { 53 const char *name; 54 ModuleFactory fac; 55 const char *help; 56}; 57 58/* Association of command line options to language modules. 59 Place an entry for new language modules here, keeping the 60 list sorted alphabetically. */ 61 62static swig_module modules[] = { 63 {"-allegrocl", swig_allegrocl, "ALLEGROCL"}, 64 {"-chicken", swig_chicken, "CHICKEN"}, 65 {"-clisp", swig_clisp, "CLISP"}, 66 {"-cffi", swig_cffi, "CFFI"}, 67 {"-csharp", swig_csharp, "C#"}, 68 {"-guile", swig_guile, "Guile"}, 69 {"-java", swig_java, "Java"}, 70 {"-lua", swig_lua, "Lua"}, 71 {"-modula3", swig_modula3, "Modula 3"}, 72 {"-mzscheme", swig_mzscheme, "Mzscheme"}, 73 {"-ocaml", swig_ocaml, "Ocaml"}, 74 {"-octave", swig_octave, "Octave"}, 75 {"-perl", swig_perl5, "Perl"}, 76 {"-perl5", swig_perl5, 0}, 77 {"-php", swig_php, "PHP"}, 78 {"-php4", swig_php4, 0}, 79 {"-php5", swig_php, 0}, 80 {"-pike", swig_pike, "Pike"}, 81 {"-python", swig_python, "Python"}, 82 {"-r", swig_r, "R (aka GNU S)"}, 83 {"-ruby", swig_ruby, "Ruby"}, 84 {"-sexp", swig_sexp, "Lisp S-Expressions"}, 85 {"-tcl", swig_tcl, "Tcl"}, 86 {"-tcl8", swig_tcl, 0}, 87 {"-uffi", swig_uffi, "Common Lisp / UFFI"}, 88 {"-xml", swig_xml, "XML"}, 89 {NULL, NULL, NULL} 90}; 91 92#ifdef MACSWIG 93#include <console.h> 94#include <SIOUX.h> 95#endif 96 97#ifndef SWIG_LANG 98#define SWIG_LANG "-python" 99#endif 100 101//----------------------------------------------------------------- 102// main() 103// 104// Main program. Initializes the files and starts the parser. 105//----------------------------------------------------------------- 106 107void SWIG_merge_envopt(const char *env, int oargc, char *oargv[], int *nargc, char ***nargv) { 108 if (!env) { 109 *nargc = oargc; 110 *nargv = oargv; 111 return; 112 } 113 114 int argc = 1; 115 int arge = oargc + 1024; 116 char **argv = (char **) malloc(sizeof(char *) * (arge)); 117 char *buffer = (char *) malloc(2048); 118 char *b = buffer; 119 char *be = b + 1023; 120 const char *c = env; 121 while ((b != be) && *c && (argc < arge)) { 122 while (isspace(*c) && *c) 123 ++c; 124 if (*c) { 125 argv[argc] = b; 126 ++argc; 127 } 128 while ((b != be) && *c && !isspace(*c)) { 129 *(b++) = *(c++); 130 } 131 *b++ = 0; 132 } 133 134 argv[0] = oargv[0]; 135 for (int i = 1; (i < oargc) && (argc < arge); ++i, ++argc) { 136 argv[argc] = oargv[i]; 137 } 138 139 *nargc = argc; 140 *nargv = argv; 141} 142 143int main(int margc, char **margv) { 144 int i; 145 Language *dl = 0; 146 ModuleFactory fac = 0; 147 148 int argc; 149 char **argv; 150 151 SWIG_merge_envopt(getenv("SWIG_FEATURES"), margc, margv, &argc, &argv); 152 153#ifdef MACSWIG 154 SIOUXSettings.asktosaveonclose = false; 155 argc = ccommand(&argv); 156#endif 157 158 /* Register built-in modules */ 159 for (i = 0; modules[i].name; i++) { 160 Swig_register_module(modules[i].name, modules[i].fac); 161 } 162 163 Swig_init_args(argc, argv); 164 165 /* Get options */ 166 for (i = 1; i < argc; i++) { 167 if (argv[i]) { 168 fac = Swig_find_module(argv[i]); 169 if (fac) { 170 dl = (fac) (); 171 Swig_mark_arg(i); 172 } else if (strcmp(argv[i], "-nolang") == 0) { 173 dl = new Language; 174 Swig_mark_arg(i); 175 } else if ((strcmp(argv[i], "-dnone") == 0) || 176 (strcmp(argv[i], "-dhtml") == 0) || 177 (strcmp(argv[i], "-dlatex") == 0) || (strcmp(argv[i], "-dascii") == 0) || (strcmp(argv[i], "-stat") == 0)) { 178 Printf(stderr, "swig: Warning. %s option deprecated.\n", argv[i]); 179 Swig_mark_arg(i); 180 } else if ((strcmp(argv[i], "-help") == 0) || (strcmp(argv[i], "--help") == 0)) { 181 if (strcmp(argv[i], "--help") == 0) 182 strcpy(argv[i], "-help"); 183 Printf(stdout, "Target Language Options\n"); 184 for (int j = 0; modules[j].name; j++) { 185 if (modules[j].help) { 186 Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); 187 } 188 } 189 // Swig_mark_arg not called as the general -help options also need to be displayed later on 190 } 191 } 192 } 193 if (!dl) { 194 fac = Swig_find_module(SWIG_LANG); 195 if (fac) { 196 dl = (fac) (); 197 } 198 } 199 int res = SWIG_main(argc, argv, dl); 200 delete dl; 201 return res; 202} 203