(swig11module): Register xml module. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@1001 626c5289-ae23-0410-ae9c-e8d60b6d4f22
297 lines
7.3 KiB
C++
297 lines
7.3 KiB
C++
/* -----------------------------------------------------------------------------
|
|
* 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);
|
|
}
|