import source from 1.3.40
[external/swig.git] / Source / Modules / swigmain.cxx
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
15 char 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
26 extern "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
52 struct 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
62 static 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
107 void 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
143 int 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 }