blob: f0e941f226bfd8076531d491afec6f8620af8e2e [file] [log] [blame]
/* -----------------------------------------------------------------------------
* This file is part of SWIG, which is licensed as a whole under version 3
* (or any later version) of the GNU General Public License. Some additional
* terms also apply to certain portions of SWIG. The full details of the SWIG
* license and copyrights can be found in the LICENSE and COPYRIGHT files
* included with the SWIG source code as distributed by the SWIG developers
* and at http://www.swig.org/legal.html.
*
* main.cxx
*
* Main entry point to the SWIG core.
* ----------------------------------------------------------------------------- */
char cvsroot_main_cxx[] = "$Id$";
#include "swigconfig.h"
#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include "swigmod.h"
#include "swigwarn.h"
#include "cparse.h"
#include <ctype.h>
#include <limits.h> // for INT_MAX
// Global variables
static Language *lang = 0; // Language method
int CPlusPlus = 0;
int Extend = 0; // Extend flag
int ForceExtern = 0; // Force extern mode
int GenerateDefault = 1; // Generate default constructors
int Verbose = 0;
int AddExtern = 0;
int NoExcept = 0;
int SwigRuntime = 0; // 0 = no option, 1 = -runtime, 2 = -noruntime
/* Suppress warning messages for private inheritance, preprocessor evaluation etc...
WARN_PP_EVALUATION 202
WARN_PARSE_PRIVATE_INHERIT 309
WARN_TYPE_ABSTRACT 403
WARN_LANG_OVERLOAD_CONST 512
WARN_PARSE_BUILTIN_NAME 321
WARN_PARSE_REDUNDANT 322
*/
#define EXTRA_WARNINGS "202,309,403,512,321,322"
extern "C" {
extern String *ModuleName;
}
/* usage string split into multiple parts otherwise string is too big for some compilers */
/* naming conventions for commandline options - no underscores, no capital letters, join words together
* except when using a common prefix, then use '-' to separate, eg the debug-xxx options */
static const char *usage1 = (const char *) "\
\nGeneral Options\n\
-addextern - Add extra extern declarations\n\
-c++ - Enable C++ processing\n\
-co <file> - Check <file> out of the SWIG library\n\
-copyctor - Automatically generate copy constructors wherever possible\n\
-cpperraswarn - Treat the preprocessor #error statement as #warning (default)\n\
-copyright - Display copyright notices\n\
-debug-classes - Display information about the classes found in the interface\n\
-debug-module <n>- Display module parse tree at stages 1-4, <n> is a csv list of stages\n\
-debug-symtabs - Display symbol tables information\n\
-debug-symbols - Display target language symbols in the symbol tables\n\
-debug-csymbols - Display C symbols in the symbol tables\n\
-debug-lsymbols - Display target language layer symbols\n\
-debug-tags - Display information about the tags found in the interface\n\
-debug-template - Display information for debugging templates\n\
-debug-top <n> - Display entire parse tree at stages 1-4, <n> is a csv list of stages\n\
-debug-typedef - Display information about the types and typedefs in the interface\n\
-debug-typemap - Display typemap debugging information\n\
-debug-tmsearch - Display typemap search debugging information\n\
-debug-tmused - Display typemaps used debugging information\n\
-directors - Turn on director mode for all the classes, mainly for testing\n\
-dirprot - Turn on wrapping of protected members for director classes (default)\n\
-D<symbol> - Define a symbol <symbol> (for conditional compilation)\n\
-E - Preprocess only, does not generate wrapper code\n\
-external-runtime [file] - Export the SWIG runtime stack\n\
-fakeversion <v>- Make SWIG fake the program version number to <v>\n\
-fcompact - Compile in compact mode\n\
-features <list>- Set global features, where <list> is a comma separated list of\n\
features, eg -features directors,autodoc=1\n\
If no explicit value is given to the feature, a default of 1 is used\n\
";
static const char *usage2 = (const char *) "\
-fastdispatch - Enable fast dispatch mode to produce faster overload dispatcher code\n\
-Fmicrosoft - Display error/warning messages in Microsoft format\n\
-Fstandard - Display error/warning messages in commonly used format\n\
-fvirtual - Compile in virtual elimination mode\n\
-help - This output\n\
-I- - Don't search the current directory\n\
-I<dir> - Look for SWIG files in directory <dir>\n\
-ignoremissing - Ignore missing include files\n\
-importall - Follow all #include statements as imports\n\
-includeall - Follow all #include statements\n\
-l<ifile> - Include SWIG library file <ifile>\n\
-macroerrors - Report errors inside macros\n\
-makedefault - Create default constructors/destructors (the default)\n\
-M - List all dependencies\n\
-MD - Is equivalent to `-M -MF <file>', except `-E' is not implied\n\
-MF <file> - Generate dependencies into <file> and continue generating wrappers\n\
-MM - List dependencies, but omit files in SWIG library\n\
-MMD - Like `-MD', but omit files in SWIG library\n\
-module <name> - Set module name to <name>\n\
-MT <target> - Set the target of the rule emitted by dependency generation\n\
-nocontract - Turn off contract checking\n\
-nocpperraswarn - Do not treat the preprocessor #error statement as #warning\n\
-nodefault - Do not generate default constructors nor default destructors\n\
-nodefaultctor - Do not generate implicit default constructors\n\
-nodefaultdtor - Do not generate implicit default destructors\n\
-nodirprot - Do not wrap director protected members\n\
-noexcept - Do not wrap exception specifiers\n\
-nofastdispatch - Disable fast dispatch mode (default)\n\
-nopreprocess - Skip the preprocessor step\n\
";
static const char *usage3 = (const char *) "\
-notemplatereduce - Disable reduction of the typedefs in templates\n\
-O - Enable the optimization options: \n\
-fastdispatch -fvirtual \n\
-o <outfile> - Set name of the output file to <outfile>\n\
-oh <headfile> - Set name of the output header file to <headfile>\n\
-outcurrentdir - Set default output dir to current dir instead of input file's path\n\
-outdir <dir> - Set language specific files output directory to <dir>\n\
-small - Compile in virtual elimination & compact mode\n\
-swiglib - Report location of SWIG library and exit\n\
-templatereduce - Reduce all the typedefs in templates\n\
-v - Run in verbose mode\n\
-version - Display SWIG version number\n\
-Wall - Remove all warning suppression, also implies -Wextra\n\
-Wallkw - Enable keyword warnings for all the supported languages\n\
-Werror - Treat warnings as errors\n\
-Wextra - Adds the following additional warnings: " EXTRA_WARNINGS "\n\
-w<list> - Suppress/add warning messages, eg -w401,+321 - see Warnings.html\n\
-xmlout <file> - Write XML version of the parse tree to <file> after normal processing\n\
\n\
Options can also be defined using the SWIG_FEATURES environment variable, for example:\n\
\n\
$ SWIG_FEATURES=\"-Wall\"\n\
$ export SWIG_FEATURES\n\
$ swig -python interface.i\n\
\n\
is equivalent to: \n\
\n\
$ swig -Wall -python interface.i \n\
\n\
\n";
// Local variables
static String *LangSubDir = 0; // Target language library subdirectory
static char *SwigLib = 0; // Library directory
static String *SwigLibWin = 0; // Extra Library directory for Windows
static int freeze = 0;
static String *lang_config = 0;
static char *hpp_extension = (char *) "h";
static char *cpp_extension = (char *) "cxx";
static char *depends_extension = (char *) "d";
static String *outdir = 0;
static String *xmlout = 0;
static int outcurrentdir = 0;
static int help = 0;
static int checkout = 0;
static int cpp_only = 0;
static int no_cpp = 0;
static String *outfile_name = 0;
static String *outfile_name_h = 0;
static int tm_debug = 0;
static int dump_symtabs = 0;
static int dump_symbols = 0;
static int dump_csymbols = 0;
static int dump_lang_symbols = 0;
static int dump_tags = 0;
static int dump_module = 0;
static int dump_top = 0;
static int dump_xml = 0;
static int browse = 0;
static int dump_typedef = 0;
static int dump_classes = 0;
static int werror = 0;
static int depend = 0;
static int depend_only = 0;
static int memory_debug = 0;
static int allkw = 0;
static DOH *cpps = 0;
static String *dependencies_file = 0;
static String *dependencies_target = 0;
static int external_runtime = 0;
static String *external_runtime_name = 0;
enum { STAGE1=1, STAGE2=2, STAGE3=4, STAGE4=8, STAGEOVERFLOW=16 };
static List *libfiles = 0;
static List *all_output_files = 0;
/* -----------------------------------------------------------------------------
* check_suffix()
*
* Checks the suffix of a file to see if we should emit extern declarations.
* ----------------------------------------------------------------------------- */
static int check_suffix(String *filename) {
const char *name = Char(filename);
const char *c;
if (!name)
return 0;
c = Swig_file_suffix(name);
if ((strcmp(c, ".c") == 0) ||
(strcmp(c, ".C") == 0) || (strcmp(c, ".cc") == 0) || (strcmp(c, ".cxx") == 0) || (strcmp(c, ".c++") == 0) || (strcmp(c, ".cpp") == 0)) {
return 1;
}
return 0;
}
/* -----------------------------------------------------------------------------
* install_opts()
*
* Install all command line options as preprocessor symbols
* ----------------------------------------------------------------------------- */
static void install_opts(int argc, char *argv[]) {
int i;
int noopt = 0;
char *c;
for (i = 1; i < (argc - 1); i++) {
if (argv[i]) {
if ((*argv[i] == '-') && (!isupper(*(argv[i] + 1)))) {
String *opt = NewStringf("SWIGOPT%(upper)s", argv[i]);
Replaceall(opt, "-", "_");
c = Char(opt);
noopt = 0;
while (*c) {
if (!(isalnum(*c) || (*c == '_'))) {
noopt = 1;
break;
}
c++;
}
if (((i + 1) < (argc - 1)) && (argv[i + 1]) && (*argv[i + 1] != '-')) {
Printf(opt, " %s", argv[i + 1]);
i++;
} else {
Printf(opt, " 1");
}
if (!noopt) {
/* Printf(stdout,"%s\n", opt); */
Preprocessor_define(opt, 0);
}
Delete(opt);
}
}
}
}
/* -----------------------------------------------------------------------------
* decode_numbers_list()
*
* Decode comma separated list into a binary number of the inputs or'd together
* eg list="1,4" will return (2^0 || 2^3) = 0x1001
* ----------------------------------------------------------------------------- */
static unsigned int decode_numbers_list(String *numlist) {
unsigned int decoded_number = 0;
if (numlist) {
List *numbers = Split(numlist, ',', INT_MAX);
if (numbers && Len(numbers) > 0) {
for (Iterator it = First(numbers); it.item; it = Next(it)) {
String *numstring = it.item;
// TODO: check that it is a number
int number = atoi(Char(numstring));
if (number > 0 && number <= 16) {
decoded_number |= (1 << (number-1));
}
}
}
}
return decoded_number;
}
/* -----------------------------------------------------------------------------
* Sets the output directory for language specific (proxy) files if not set and
* corrects the directory name and adds trailing file separator if necessary.
* ----------------------------------------------------------------------------- */
static void configure_outdir(const String *c_wrapper_file_dir) {
// Use the C wrapper file's directory if the output directory has not been set by user
if (!outdir || Len(outdir) == 0)
outdir = NewString(c_wrapper_file_dir);
Swig_filename_correct(outdir);
// Add trailing file delimiter if not present in output directory name
if (Len(outdir) > 0) {
const char *outd = Char(outdir);
if (strcmp(outd + strlen(outd) - strlen(SWIG_FILE_DELIMITER), SWIG_FILE_DELIMITER) != 0)
Printv(outdir, SWIG_FILE_DELIMITER, NIL);
}
}
/* This function sets the name of the configuration file */
void SWIG_config_file(const_String_or_char_ptr filename) {
lang_config = NewString(filename);
}
/* Sets the target language subdirectory name */
void SWIG_library_directory(const char *subdirectory) {
LangSubDir = NewString(subdirectory);
}
// Returns the directory for generating language specific files (non C/C++ files)
const String *SWIG_output_directory() {
assert(outdir);
return outdir;
}
void SWIG_config_cppext(const char *ext) {
cpp_extension = (char *) ext;
}
List *SWIG_output_files() {
assert(all_output_files);
return all_output_files;
}
void SWIG_setfeature(const char *cfeature, const char *cvalue) {
Hash *features_hash = Swig_cparse_features();
String *name = NewString("");
String *fname = NewString(cfeature);
String *fvalue = NewString(cvalue);
Swig_feature_set(features_hash, name, 0, fname, fvalue, 0);
Delete(name);
Delete(fname);
Delete(fvalue);
}
void SWIG_setfeatures(const char *c) {
char feature[64];
char *fb = feature;
char *fe = fb + 63;
Hash *features_hash = Swig_cparse_features();
String *name = NewString("");
/* Printf(stderr,"all features %s\n", c); */
while (*c) {
char *f = fb;
String *fname = NewString("feature:");
String *fvalue = NewString("");
while ((f != fe) && *c != '=' && *c != ',' && *c) {
*(f++) = *(c++);
}
*f = 0;
Printf(fname, "%s", feature);
if (*c && *(c++) == '=') {
char value[64];
char *v = value;
char *ve = v + 63;
while ((v != ve) && *c != ',' && *c && !isspace(*c)) {
*(v++) = *(c++);
}
*v = 0;
Printf(fvalue, "%s", value);
} else {
Printf(fvalue, "1");
}
/* Printf(stderr,"%s %s\n", fname, fvalue); */
Swig_feature_set(features_hash, name, 0, fname, fvalue, 0);
Delete(fname);
Delete(fvalue);
}
Delete(name);
}
/* This function handles the -external-runtime command option */
static void SWIG_dump_runtime() {
String *outfile;
File *runtime;
String *s;
outfile = external_runtime_name;
if (!outfile) {
outfile = lang->defaultExternalRuntimeFilename();
if (!outfile) {
Printf(stderr, "*** Please provide a filename for the external runtime\n");
SWIG_exit(EXIT_FAILURE);
}
}
runtime = NewFile(outfile, "w", SWIG_output_files());
if (!runtime) {
FileErrorDisplay(outfile);
SWIG_exit(EXIT_FAILURE);
}
Swig_banner(runtime);
Printf(runtime, "\n");
s = Swig_include_sys("swiglabels.swg");
if (!s) {
Printf(stderr, "*** Unable to open 'swiglabels.swg'\n");
Close(runtime);
SWIG_exit(EXIT_FAILURE);
}
Printf(runtime, "%s", s);
Delete(s);
s = Swig_include_sys("swigerrors.swg");
if (!s) {
Printf(stderr, "*** Unable to open 'swigerrors.swg'\n");
Close(runtime);
SWIG_exit(EXIT_FAILURE);
}
Printf(runtime, "%s", s);
Delete(s);
s = Swig_include_sys("swigerrors.swg");
if (!s) {
Printf(stderr, "*** Unable to open 'swigerrors.swg'\n");
Close(runtime);
SWIG_exit(EXIT_FAILURE);
}
Printf(runtime, "%s", s);
s = Swig_include_sys("swigrun.swg");
if (!s) {
Printf(stderr, "*** Unable to open 'swigrun.swg'\n");
Close(runtime);
SWIG_exit(EXIT_FAILURE);
}
Printf(runtime, "%s", s);
Delete(s);
s = lang->runtimeCode();
Printf(runtime, "%s", s);
Delete(s);
s = Swig_include_sys("runtime.swg");
if (!s) {
Printf(stderr, "*** Unable to open 'runtime.swg'\n");
Close(runtime);
SWIG_exit(EXIT_FAILURE);
}
Printf(runtime, "%s", s);
Delete(s);
Close(runtime);
Delete(runtime);
SWIG_exit(EXIT_SUCCESS);
}
void SWIG_getoptions(int argc, char *argv[]) {
int i;
// Get options
for (i = 1; i < argc; i++) {
if (argv[i] && !Swig_check_marked(i)) {
if (strncmp(argv[i], "-I-", 3) == 0) {
// Don't push/pop directories
Swig_set_push_dir(0);
Swig_mark_arg(i);
} else if (strncmp(argv[i], "-I", 2) == 0) {
// Add a new directory search path
char *a = Swig_copy_string(argv[i] + 2);
Swig_add_directory((DOH *) a);
free(a);
Swig_mark_arg(i);
} else if (strncmp(argv[i], "-D", 2) == 0) {
String *d = NewString(argv[i] + 2);
Replace(d, (char *) "=", (char *) " ", DOH_REPLACE_ANY | DOH_REPLACE_FIRST);
Preprocessor_define((DOH *) d, 0);
Delete(d);
// Create a symbol
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-E") == 0) {
cpp_only = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-nopreprocess") == 0) {
no_cpp = 1;
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-verbose") == 0) || (strcmp(argv[i], "-v") == 0)) {
Verbose = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-c++") == 0) {
CPlusPlus = 1;
Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0);
Swig_cparse_cplusplus(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-fcompact") == 0) {
Wrapper_compact_print_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-fvirtual") == 0) {
Wrapper_virtual_elimination_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-fastdispatch") == 0) {
Wrapper_fast_dispatch_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-nofastdispatch") == 0) {
Wrapper_fast_dispatch_mode_set(0);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-naturalvar") == 0) {
Wrapper_naturalvar_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-nonaturalvar") == 0) {
Wrapper_naturalvar_mode_set(0);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-directors") == 0) {
SWIG_setfeature("feature:director", "1");
Wrapper_director_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-dirprot") == 0) {
Wrapper_director_protected_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-nodirprot") == 0) {
Wrapper_director_protected_mode_set(0);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-small") == 0) {
Wrapper_compact_print_mode_set(1);
Wrapper_virtual_elimination_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-runtime") == 0) { // Used to also accept -c. removed in swig-1.3.36
Swig_mark_arg(i);
Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n");
SwigRuntime = 1;
} else if (strcmp(argv[i], "-noruntime") == 0) {
Swig_mark_arg(i);
Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n");
SwigRuntime = 2;
} else if (strcmp(argv[i], "-external-runtime") == 0) {
external_runtime = 1;
Swig_mark_arg(i);
if (argv[i + 1]) {
external_runtime_name = NewString(argv[i + 1]);
Swig_mark_arg(i + 1);
i++;
}
} else if ((strcmp(argv[i], "-make_default") == 0) || (strcmp(argv[i], "-makedefault") == 0)) {
GenerateDefault = 1;
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-no_default") == 0) || (strcmp(argv[i], "-nodefault") == 0)) {
GenerateDefault = 0;
Swig_warning(WARN_DEPRECATED_NODEFAULT, "SWIG", 1, "dangerous, use -nodefaultctor, -nodefaultdtor instead.\n");
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-nodefaultctor") == 0)) {
SWIG_setfeature("feature:nodefaultctor", "1");
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-nodefaultdtor") == 0)) {
SWIG_setfeature("feature:nodefaultdtor", "1");
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-copyctor") == 0)) {
SWIG_setfeature("feature:copyctor", "1");
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-noexcept") == 0) {
NoExcept = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-noextern") == 0) {
Swig_warning(WARN_DEPRECATED_NOEXTERN, "SWIG", 1, "-noextern command line option is deprecated; extern is no longer generated by default.\n");
AddExtern = 0;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-addextern") == 0) {
AddExtern = 1;
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-debug-template") == 0) || (strcmp(argv[i], "-debug_template") == 0) || (strcmp(argv[i], "-show_templates") == 0)) {
Swig_cparse_debug_templates(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-templatereduce") == 0) {
SWIG_cparse_template_reduce(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-notemplatereduce") == 0) {
SWIG_cparse_template_reduce(0);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-macroerrors") == 0) {
Swig_cparse_follow_locators(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-swiglib") == 0) {
if (SwigLibWin)
Printf(stdout, "%s\n", SwigLibWin);
Printf(stdout, "%s\n", SwigLib);
SWIG_exit(EXIT_SUCCESS);
} else if (strcmp(argv[i], "-o") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
outfile_name = NewString(argv[i + 1]);
Swig_filename_correct(outfile_name);
if (!outfile_name_h || !dependencies_file) {
char *ext = strrchr(Char(outfile_name), '.');
String *basename = ext ? NewStringWithSize(Char(outfile_name), Char(ext) - Char(outfile_name)) : NewString(outfile_name);
if (!dependencies_file) {
dependencies_file = NewStringf("%s.%s", basename, depends_extension);
}
if (!outfile_name_h) {
Printf(basename, ".%s", hpp_extension);
outfile_name_h = NewString(basename);
}
Delete(basename);
}
Swig_mark_arg(i + 1);
i++;
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-oh") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
outfile_name_h = NewString(argv[i + 1]);
Swig_filename_correct(outfile_name_h);
Swig_mark_arg(i + 1);
i++;
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-fakeversion") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
Swig_set_fakeversion(argv[i + 1]);
Swig_mark_arg(i + 1);
i++;
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-version") == 0) {
fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version());
fprintf(stdout, "\nCompiled with %s [%s]\n", SWIG_CXX, SWIG_PLATFORM);
fprintf(stdout, "Please see %s for reporting bugs and further information\n", PACKAGE_BUGREPORT);
SWIG_exit(EXIT_SUCCESS);
} else if (strcmp(argv[i], "-copyright") == 0) {
fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version());
fprintf(stdout, "Copyright (c) 1995-1998\n");
fprintf(stdout, "University of Utah and the Regents of the University of California\n");
fprintf(stdout, "Copyright (c) 1998-2005\n");
fprintf(stdout, "University of Chicago\n");
fprintf(stdout, "Copyright (c) 2005-2006\n");
fprintf(stdout, "Arizona Board of Regents (University of Arizona)\n");
SWIG_exit(EXIT_SUCCESS);
} else if (strncmp(argv[i], "-l", 2) == 0) {
// Add a new directory search path
Append(libfiles, argv[i] + 2);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-co") == 0) {
checkout = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-features") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
SWIG_setfeatures(argv[i + 1]);
Swig_mark_arg(i + 1);
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-freeze") == 0) {
freeze = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-includeall") == 0) {
Preprocessor_include_all(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-importall") == 0) {
Preprocessor_import_all(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-ignoremissing") == 0) {
Preprocessor_ignore_missing(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-cpperraswarn") == 0) {
Preprocessor_error_as_warning(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-nocpperraswarn") == 0) {
Preprocessor_error_as_warning(0);
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-debug-typemap") == 0) || (strcmp(argv[i], "-debug_typemap") == 0) || (strcmp(argv[i], "-tm_debug") == 0)) {
tm_debug = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-debug-tmsearch") == 0) {
Swig_typemap_search_debug_set();
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-debug-tmused") == 0) {
Swig_typemap_used_debug_set();
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-module") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
ModuleName = NewString(argv[i + 1]);
Swig_mark_arg(i + 1);
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-M") == 0) {
depend = 1;
depend_only = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-MM") == 0) {
depend = 2;
depend_only = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-MF") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
dependencies_file = NewString(argv[i + 1]);
Swig_mark_arg(i + 1);
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-MD") == 0) {
depend = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-MMD") == 0) {
depend = 2;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-MT") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
if (!dependencies_target)
dependencies_target = NewString(argv[i + 1]);
else
Printf(dependencies_target, " %s", argv[i + 1]);
Swig_mark_arg(i + 1);
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-outdir") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
outdir = NewString(argv[i + 1]);
Swig_mark_arg(i + 1);
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-outcurrentdir") == 0) {
Swig_mark_arg(i);
outcurrentdir = 1;
} else if (strcmp(argv[i], "-Wall") == 0) {
Swig_mark_arg(i);
Swig_warnall();
} else if (strcmp(argv[i], "-Wallkw") == 0) {
allkw = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-Werror") == 0) {
werror = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-Wextra") == 0) {
Swig_mark_arg(i);
Swig_warnfilter(EXTRA_WARNINGS, 0);
} else if (strncmp(argv[i], "-w", 2) == 0) {
Swig_mark_arg(i);
Swig_warnfilter(argv[i] + 2, 1);
} else if (strcmp(argv[i], "-debug-symtabs") == 0) {
dump_symtabs = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-debug-symbols") == 0) {
dump_symbols = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-debug-csymbols") == 0) {
dump_csymbols = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-debug-lsymbols") == 0) {
dump_lang_symbols = 1;
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-debug-tags") == 0) || (strcmp(argv[i], "-dump_tags") == 0)) {
dump_tags = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-debug-top") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
String *dump_list = NewString(argv[i + 1]);
dump_top = decode_numbers_list(dump_list);
if (dump_top < STAGE1 || dump_top >= STAGEOVERFLOW)
Swig_arg_error();
else
Swig_mark_arg(i + 1);
Delete(dump_list);
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-debug-module") == 0) {
Swig_mark_arg(i);
if (argv[i + 1]) {
String *dump_list = NewString(argv[i + 1]);
dump_module = decode_numbers_list(dump_list);
if (dump_module < STAGE1 || dump_module >= STAGEOVERFLOW)
Swig_arg_error();
else
Swig_mark_arg(i + 1);
Delete(dump_list);
} else {
Swig_arg_error();
}
} else if ((strcmp(argv[i], "-dump_tree") == 0) || (strcmp(argv[i], "-dump_top") == 0)) {
dump_top |= STAGE4;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-dump_module") == 0) {
dump_module |= STAGE4;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-dump_parse_module") == 0) {
dump_module |= STAGE1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-dump_parse_top") == 0) {
dump_top |= STAGE1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-dump_xml") == 0) {
dump_xml = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-xmlout") == 0) {
dump_xml = 1;
Swig_mark_arg(i);
if (argv[i + 1]) {
xmlout = NewString(argv[i + 1]);
Swig_mark_arg(i + 1);
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i], "-nocontract") == 0) {
Swig_mark_arg(i);
Swig_contract_mode_set(0);
} else if (strcmp(argv[i], "-browse") == 0) {
browse = 1;
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-debug-typedef") == 0) || (strcmp(argv[i], "-dump_typedef") == 0)) {
dump_typedef = 1;
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-debug-classes") == 0) || (strcmp(argv[i], "-dump_classes") == 0)) {
dump_classes = 1;
Swig_mark_arg(i);
} else if ((strcmp(argv[i], "-debug-memory") == 0) || (strcmp(argv[i], "-dump_memory") == 0)) {
memory_debug = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-Fstandard") == 0) {
Swig_error_msg_format(EMF_STANDARD);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-Fmicrosoft") == 0) {
Swig_error_msg_format(EMF_MICROSOFT);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-O") == 0) {
Wrapper_virtual_elimination_mode_set(1);
Wrapper_fast_dispatch_mode_set(1);
Swig_mark_arg(i);
} else if (strcmp(argv[i], "-help") == 0) {
fputs(usage1, stdout);
fputs(usage2, stdout);
fputs(usage3, stdout);
Swig_mark_arg(i);
help = 1;
}
}
}
}
int SWIG_main(int argc, char *argv[], Language *l) {
char *c;
/* Initialize the SWIG core */
Swig_init();
// Default warning suppression
Swig_warnfilter(EXTRA_WARNINGS, 1);
// Initialize the preprocessor
Preprocessor_init();
lang = l;
// Set up some default symbols (available in both SWIG interface files
// and C files)
Preprocessor_define((DOH *) "SWIG 1", 0);
Preprocessor_define((DOH *) "__STDC__", 0);
// Set the SWIG version value in format 0xAABBCC from package version expected to be in format A.B.C
String *package_version = NewString(PACKAGE_VERSION); /* Note that the fakeversion has not been set at this point */
char *token = strtok(Char(package_version), ".");
String *vers = NewString("SWIG_VERSION 0x");
int count = 0;
while (token) {
int len = strlen(token);
assert(len == 1 || len == 2);
Printf(vers, "%s%s", (len == 1) ? "0" : "", token);
token = strtok(NULL, ".");
count++;
}
Delete(package_version);
assert(count == 3); // Check version format is correct
/* Turn on contracts */
Swig_contract_mode_set(1);
Preprocessor_define(vers, 0);
/* Turn off directors mode */
Wrapper_director_mode_set(0);
Wrapper_director_protected_mode_set(1);
// Create Library search directories
// Check for SWIG_LIB environment variable
if ((c = getenv("SWIG_LIB")) == (char *) 0) {
#if defined(_WIN32)
char buf[MAX_PATH];
char *p;
if (!(GetModuleFileName(0, buf, MAX_PATH) == 0 || (p = strrchr(buf, '\\')) == 0)) {
*(p + 1) = '\0';
SwigLibWin = NewStringf("%sLib", buf); // Native windows installation path
}
SwigLib = Swig_copy_string(SWIG_LIB_WIN_UNIX); // Unix installation path using a drive letter (for msys/mingw)
#else
SwigLib = Swig_copy_string(SWIG_LIB);
#endif
} else {
SwigLib = Swig_copy_string(c);
}
libfiles = NewList();
all_output_files = NewList();
/* Check for SWIG_FEATURES environment variable */
SWIG_getoptions(argc, argv);
// Define the __cplusplus symbol
if (CPlusPlus)
Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0);
// Parse language dependent options
lang->main(argc, argv);
if (help) {
Printf(stdout, "\nNote: 'swig -<lang> -help' displays options for a specific target language.\n\n");
SWIG_exit(EXIT_SUCCESS); // Exit if we're in help mode
}
// Check all of the options to make sure we're cool.
// Don't check for an input file if -external-runtime is passed
Swig_check_options(external_runtime ? 0 : 1);
install_opts(argc, argv);
// Add language dependent directory to the search path
{
String *rl = NewString("");
Printf(rl, ".%sswig_lib%s%s", SWIG_FILE_DELIMITER, SWIG_FILE_DELIMITER, LangSubDir);
Swig_add_directory(rl);
if (SwigLibWin) {
rl = NewString("");
Printf(rl, "%s%s%s", SwigLibWin, SWIG_FILE_DELIMITER, LangSubDir);
Swig_add_directory(rl);
}
rl = NewString("");
Printf(rl, "%s%s%s", SwigLib, SWIG_FILE_DELIMITER, LangSubDir);
Swig_add_directory(rl);
}
Swig_add_directory((String *) "." SWIG_FILE_DELIMITER "swig_lib");
if (SwigLibWin)
Swig_add_directory((String *) SwigLibWin);
Swig_add_directory((String *) SwigLib);
if (Verbose) {
Printf(stdout, "Language subdirectory: %s\n", LangSubDir);
Printf(stdout, "Search paths:\n");
List *sp = Swig_search_path();
Iterator s;
for (s = First(sp); s.item; s = Next(s)) {
Printf(stdout, " %s\n", s.item);
}
}
// handle the -external-runtime argument
if (external_runtime)
SWIG_dump_runtime();
// If we made it this far, looks good. go for it....
input_file = NewString(argv[argc - 1]);
Swig_filename_correct(input_file);
// If the user has requested to check out a file, handle that
if (checkout) {
DOH *s;
String *outfile = input_file;
if (outfile_name)
outfile = outfile_name;
if (Verbose)
Printf(stdout, "Handling checkout...\n");
s = Swig_include(input_file);
if (!s) {
Printf(stderr, "Unable to locate '%s' in the SWIG library.\n", input_file);
} else {
FILE *f = Swig_open(outfile);
if (f) {
fclose(f);
Printf(stderr, "File '%s' already exists. Checkout aborted.\n", outfile);
} else {
File *f_outfile = NewFile(outfile, "w", SWIG_output_files());
if (!f_outfile) {
FileErrorDisplay(outfile);
SWIG_exit(EXIT_FAILURE);
} else {
if (Verbose)
Printf(stdout, "'%s' checked out from the SWIG library.\n", outfile);
Printv(f_outfile, s, NIL);
Close(f_outfile);
}
}
}
} else {
// Run the preprocessor
if (Verbose)
Printf(stdout, "Preprocessing...\n");
{
int i;
String *fs = NewString("");
FILE *df = Swig_open(input_file);
if (!df) {
df = Swig_include_open(input_file);
if (!df) {
char *cfile = Char(input_file);
if (cfile && cfile[0] == '-') {
Printf(stderr, "Unable to find option or file '%s', ", input_file);
Printf(stderr, "use 'swig -help' for more information.\n");
} else {
Printf(stderr, "Unable to find file '%s'.\n", input_file);
}
SWIG_exit(EXIT_FAILURE);
} else {
Swig_warning(WARN_DEPRECATED_INPUT_FILE, "SWIG", 1, "Use of the include path to find the input file is deprecated and will not work with ccache. Please include the path when specifying the input file.\n"); // so that behaviour is like c/c++ compilers
}
}
if (!no_cpp) {
fclose(df);
Printf(fs, "%%include <swig.swg>\n");
if (allkw) {
Printf(fs, "%%include <allkw.swg>\n");
}
if (lang_config) {
Printf(fs, "\n%%include <%s>\n", lang_config);
}
Printf(fs, "%%include(maininput=\"%s\") \"%s\"\n", Swig_filename_escape(input_file), Swig_filename_escape(Swig_last_file()));
for (i = 0; i < Len(libfiles); i++) {
Printf(fs, "\n%%include \"%s\"\n", Swig_filename_escape(Getitem(libfiles, i)));
}
Seek(fs, 0, SEEK_SET);
cpps = Preprocessor_parse(fs);
Delete(fs);
} else {
cpps = Swig_read_file(df);
fclose(df);
}
if (Swig_error_count()) {
SWIG_exit(EXIT_FAILURE);
}
if (cpp_only) {
Printf(stdout, "%s", cpps);
SWIG_exit(EXIT_SUCCESS);
}
if (depend) {
if (!no_cpp) {
String *outfile;
File *f_dependencies_file = 0;
char *basename = Swig_file_basename(outcurrentdir ? Swig_file_filename(input_file): Char(input_file));
if (!outfile_name) {
if (CPlusPlus || lang->cplus_runtime_mode()) {
outfile = NewStringf("%s_wrap.%s", basename, cpp_extension);
} else {
outfile = NewStringf("%s_wrap.c", basename);
}
} else {
outfile = NewString(outfile_name);
}
if (dependencies_file && Len(dependencies_file) != 0) {
f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files());
if (!f_dependencies_file) {
FileErrorDisplay(dependencies_file);
SWIG_exit(EXIT_FAILURE);
}
} else if (!depend_only) {
String *filename = NewStringf("%s_wrap.%s", basename, depends_extension);
f_dependencies_file = NewFile(filename, "w", SWIG_output_files());
if (!f_dependencies_file) {
FileErrorDisplay(filename);
SWIG_exit(EXIT_FAILURE);
}
} else
f_dependencies_file = stdout;
if (dependencies_target) {
Printf(f_dependencies_file, "%s: ", dependencies_target);
} else {
Printf(f_dependencies_file, "%s: ", outfile);
}
List *files = Preprocessor_depend();
for (int i = 0; i < Len(files); i++) {
int use_file = 1;
if (depend == 2) {
if ((Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) == 0) || (SwigLibWin && (Strncmp(Getitem(files, i), SwigLibWin, Len(SwigLibWin)) == 0)))
use_file = 0;
}
if (use_file)
Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i));
}
Printf(f_dependencies_file, "\n");
if (f_dependencies_file != stdout)
Close(f_dependencies_file);
if (depend_only)
SWIG_exit(EXIT_SUCCESS);
} else {
Printf(stderr, "Cannot generate dependencies with -nopreprocess\n");
// Actually we could but it would be inefficient when just generating dependencies, as it would be done after Swig_cparse
SWIG_exit(EXIT_FAILURE);
}
}
Seek(cpps, 0, SEEK_SET);
}
/* Register a null file with the file handler */
Swig_register_filebyname("null", NewString(""));
// Pass control over to the specific language interpreter
if (Verbose) {
fprintf(stdout, "Starting language-specific parse...\n");
fflush(stdout);
}
Node *top = Swig_cparse(cpps);
if (dump_top & STAGE1) {
Printf(stdout, "debug-top stage 1\n");
Swig_print_tree(top);
}
if (dump_module & STAGE1) {
Printf(stdout, "debug-module stage 1\n");
Swig_print_tree(Getattr(top, "module"));
}
if (Verbose) {
Printf(stdout, "Processing types...\n");
}
Swig_process_types(top);
if (dump_top & STAGE2) {
Printf(stdout, "debug-top stage 2\n");
Swig_print_tree(top);
}
if (dump_module & STAGE2) {
Printf(stdout, "debug-module stage 2\n");
Swig_print_tree(Getattr(top, "module"));
}
if (Verbose) {
Printf(stdout, "C++ analysis...\n");
}
Swig_default_allocators(top);
if (dump_top & STAGE3) {
Printf(stdout, "debug-top stage 3\n");
Swig_print_tree(top);
}
if (dump_module & STAGE3) {
Printf(stdout, "debug-module stage 3\n");
Swig_print_tree(Getattr(top, "module"));
}
if (Verbose) {
Printf(stdout, "Generating wrappers...\n");
}
if (dump_classes) {
Hash *classes = Getattr(top, "classes");
if (classes) {
Printf(stdout, "Classes\n");
Printf(stdout, "------------\n");
Iterator ki;
for (ki = First(classes); ki.key; ki = Next(ki)) {
Printf(stdout, "%s\n", ki.key);
}
}
}
if (dump_typedef) {
SwigType_print_scope(0);
}
if (dump_symtabs) {
Swig_symbol_print_tables(Swig_symbol_global_scope());
Swig_symbol_print_tables_summary();
}
if (dump_symbols) {
Swig_symbol_print_symbols();
}
if (dump_csymbols) {
Swig_symbol_print_csymbols();
}
if (dump_tags) {
Swig_print_tags(top, 0);
}
if (top) {
if (!Getattr(top, "name")) {
Printf(stderr, "No module name specified using %%module or -module.\n");
SWIG_exit(EXIT_FAILURE);
} else {
/* Set some filename information on the object */
String *infile = scanner_get_main_input_file();
if (!infile) {
Printf(stderr, "Missing input file in preprocessed output.\n");
SWIG_exit(EXIT_FAILURE);
}
Setattr(top, "infile", infile); // Note: if nopreprocess then infile is the original input file, otherwise input_file
Setattr(top, "inputfile", input_file);
char *basename = Swig_file_basename(outcurrentdir ? Swig_file_filename(infile): Char(infile));
if (!outfile_name) {
if (CPlusPlus || lang->cplus_runtime_mode()) {
Setattr(top, "outfile", NewStringf("%s_wrap.%s", basename, cpp_extension));
} else {
Setattr(top, "outfile", NewStringf("%s_wrap.c", basename));
}
} else {
Setattr(top, "outfile", outfile_name);
}
if (!outfile_name_h) {
Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", basename, hpp_extension));
} else {
Setattr(top, "outfile_h", outfile_name_h);
}
configure_outdir(Swig_file_dirname(Getattr(top, "outfile")));
if (Swig_contract_mode_get()) {
Swig_contracts(top);
}
// Check the suffix for a c/c++ file. If so, we're going to declare everything we see as "extern"
ForceExtern = check_suffix(input_file);
lang->top(top);
if (browse) {
Swig_browser(top, 0);
}
}
}
if (dump_lang_symbols) {
lang->dumpSymbols();
}
if (dump_top & STAGE4) {
Printf(stdout, "debug-top stage 4\n");
Swig_print_tree(top);
}
if (dump_module & STAGE4) {
Printf(stdout, "debug-module stage 4\n");
Swig_print_tree(Getattr(top, "module"));
}
if (dump_xml && top) {
delete lang;
lang = 0;
Swig_print_xml(top, xmlout);
}
Delete(top);
}
if (tm_debug)
Swig_typemap_debug();
if (memory_debug)
DohMemoryDebug();
char *outfiles = getenv("CCACHE_OUTFILES");
if (outfiles) {
File *f_outfiles = NewFile(outfiles, "w", 0);
if (!f_outfiles) {
Printf(stderr, "Failed to write list of output files to the filename '%s' specified in CCACHE_OUTFILES environment variable - ", outfiles);
FileErrorDisplay(outfiles);
SWIG_exit(EXIT_FAILURE);
} else {
int i;
for (i = 0; i < Len(all_output_files); i++)
Printf(f_outfiles, "%s\n", Getitem(all_output_files, i));
Close(f_outfiles);
}
}
// Deletes
Delete(libfiles);
Preprocessor_delete();
while (freeze) {
}
if ((werror) && (Swig_warn_count())) {
return Swig_warn_count();
}
delete lang;
return Swig_error_count();
}
/* -----------------------------------------------------------------------------
* SWIG_exit()
*
* Cleanup and either freeze or exit
* ----------------------------------------------------------------------------- */
void SWIG_exit(int exit_code) {
while (freeze) {
}
exit(exit_code);
}