blob: c3e221f61d4fef86d27cf1d104475225794e6856 [file] [log] [blame]
/* -----------------------------------------------------------------------------
* main.cxx
*
* Main entry point to the SWIG core.
*
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
*
* Copyright (C) 1998-2000. The University of Chicago
* Copyright (C) 1995-1998. The University of Utah and The Regents of the
* University of California.
*
* See the file LICENSE for information on usage and redistribution.
* ----------------------------------------------------------------------------- */
static char cvsroot[] = "$Header$";
#include "swig11.h"
#ifndef MACSWIG
#include "swigconfig.h"
#endif
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
extern "C" {
#include "preprocessor.h"
}
#ifndef SWIG_LANG
#define SWIG_LANG PYTHON
#endif
#include "tcl8.h"
#include "python.h"
#include "perl5.h"
#include "guile.h"
#ifdef OLD
#include "java.h"
#endif
#include "mzscheme.h"
#include "ruby.h"
#include "xml.h"
// Global variables
FILE *f_runtime = 0;
DOH *f_header = 0; // Some commonly used
DOH *f_wrappers = 0; // FILE pointers
DOH *f_init = 0;
Language *lang; // Language method
int CPlusPlus = 0;
int NewObject = 0; // NewObject flag
int ForceExtern = 0; // Force extern mode
int GenerateDefault = 0; // Generate default constructors
int NoInclude = 0;
int Verbose = 0;
String *swig_module = 0;
static char *usage = (char*)"\
\nSWIG1.1 Options\n\
";
// -----------------------------------------------------------------------------
// check_suffix(char *name)
//
// Checks the suffix of a file to see if we should emit extern declarations.
// -----------------------------------------------------------------------------
static
int
check_suffix(char *name) {
char *c;
if (!name) return 0;
if (strlen(name) == 0) return 0;
c = name+strlen(name)-1;
while (c != name) {
if (*c == '.') break;
c--;
}
if (c == name) return 0;
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;
}
//-----------------------------------------------------------------
// main()
//
// Main program. Initializes the files and starts the parser.
//-----------------------------------------------------------------
char infilename[256];
char filename[256];
char output_dir[512];
char fn_runtime[256];
static char *outfile_name = 0;
char *SwigLib;
extern "C"
int swig11_init(int argc, char *argv[]) {
int i;
char *c;
char infile[512];
int help = 0;
lang = new SWIG_LANG;
f_wrappers = 0;
f_init = 0;
f_header = 0;
// Get options
for (i = 1; i < argc; i++) {
if (argv[i]) {
if(strcmp(argv[i],"-tcl") == 0) {
fprintf(stderr,"swig: -tcl option now implies -tcl8\n");
lang = new TCL8;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-tcl8") == 0) {
lang = new TCL8;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-python") == 0) {
lang = new PYTHON;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-perl5") == 0) {
lang = new PERL5;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-guile") == 0) {
lang = new GUILE;
Swig_mark_arg(i);
#ifdef OLD
} else if (strcmp(argv[i],"-java") == 0) {
lang = new JAVA;
Swig_mark_arg(i);
#endif
} else if (strcmp(argv[i],"-mzscheme") == 0) {
lang = new MZSCHEME;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-ruby") == 0) {
lang = new RUBY;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-help") == 0) {
fputs(usage,stderr);
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-c++") == 0) {
CPlusPlus=1;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-c") == 0) {
NoInclude=1;
Preprocessor_define((void *) "SWIG_NOINCLUDE 1", 0);
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-make_default") == 0) {
GenerateDefault = 1;
Swig_mark_arg(i);
} else if(strcmp(argv[i],"-module") == 0) {
if (argv[i+1]) {
swig_module = NewString(argv[i+1]);
Swig_mark_arg(i);
Swig_mark_arg(i+1);
i++;
} else {
Swig_arg_error();
}
} else if (strcmp(argv[i],"-o") == 0) {
if (argv[i+1]) {
outfile_name = argv[i+1];
Swig_mark_arg(i);
Swig_mark_arg(i+1);
i++;
}
} else if (strcmp(argv[i],"-help") == 0) {
fputs(usage,stderr);
Swig_mark_arg(i);
help = 1;
}
}
}
// Parse language dependent options
lang->parse_args(argc,argv);
if (help) return 0;
// Create names of temporary files that are created
sprintf(infilename,"%s", argv[argc-1]);
// Check the suffix for a .c file. If so, we're going to
// declare everything we see as "extern"
ForceExtern = check_suffix(infilename);
// Strip off suffix
c = infilename + strlen(infilename);
while (c != infilename) {
if (*c == '.') {
*c = 0;
break;
} else {
c--;
}
}
if (!outfile_name) {
char *cc = infilename + strlen(infilename);
while (cc != infilename) {
if (*cc == '/') {
cc++;
break;
}
cc--;
}
sprintf(fn_runtime,"%s_wrap.c",infilename);
strcpy(infile,infilename);
outfile_name = fn_runtime;
} else {
sprintf(fn_runtime,"%s",outfile_name);
}
{
// Try to identify the output directory
char *cc = outfile_name;
char *lastc = outfile_name;
while (*cc) {
if (*cc == '/') lastc = cc+1;
cc++;
}
cc = outfile_name;
char *dd = output_dir;
while (cc != lastc) {
*dd = *cc;
dd++;
cc++;
}
*dd = 0;
// Patch up the input filename
cc = infilename + strlen(infilename);
while (cc != infilename) {
if (*cc == '/') {
cc++;
break;
}
cc--;
}
strcpy(infile,cc);
}
return 0;
}
extern void generate(DOH *top);
extern "C"
DOH *swig11_run(DOH *node) {
if ((f_runtime = fopen(fn_runtime,"w")) == 0) {
fprintf(stderr,"Unable to open %s\n", fn_runtime);
Swig_exit(1);
}
f_header = NewString("");
f_wrappers = NewString("");
f_init = NewString("");
Swig_register_filebyname("header",f_header);
Swig_register_filebyname("runtime", f_runtime);
Swig_register_filebyname("wrapper", f_wrappers);
Swig_register_filebyname("init", f_init);
// Set up the typemap for handling new return strings
if (CPlusPlus)
Swig_typemap_register((char*)"newfree",(char*)"p.char",(char*)"",(char*)"delete [] $source;\n",0);
else
Swig_typemap_register((char*)"newfree",(char*)"p.char",(char*)"",(char*)"free($source);\n",0);
generate(node);
Dump(f_header,f_runtime);
Dump(f_wrappers, f_runtime);
Wrapper_pretty_print(f_init,f_runtime);
fclose(f_runtime);
return node;
}
extern "C"
void swig11module() {
Swig_register_module("tcl8","swig:top", swig11_init, swig11_run);
Swig_register_module("python","swig:top", swig11_init, swig11_run);
Swig_register_module("perl5","swig:top", swig11_init, swig11_run);
Swig_register_module("ruby","swig:top", swig11_init, swig11_run);
Swig_register_module("guile","swig:top", swig11_init, swig11_run);
Swig_register_module("mzscheme","swig:top", swig11_init, swig11_run);
Swig_register_module("swig11","swig:top", swig11_init, swig11_run);
Swig_register_module("xml","swig:top", xml_init, xml_run);
}