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