]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wxSWIG/SWIG/main.cxx
Since I have made several changes to SWIG over the years to accomodate
[wxWidgets.git] / wxPython / wxSWIG / SWIG / main.cxx
diff --git a/wxPython/wxSWIG/SWIG/main.cxx b/wxPython/wxSWIG/SWIG/main.cxx
new file mode 100644 (file)
index 0000000..28ca20a
--- /dev/null
@@ -0,0 +1,643 @@
+/*******************************************************************************
+ * Simplified Wrapper and Interface Generator  (SWIG)
+ *
+ * Author : David Beazley
+ *
+ * Department of Computer Science
+ * University of Chicago
+ * 1100 E 58th Street
+ * Chicago, IL  60637
+ * beazley@cs.uchicago.edu
+ *
+ * Please read the file LICENSE for the copyright and terms by which SWIG
+ * can be used and distributed.
+ *******************************************************************************/
+/***********************************************************************
+ * $Header$
+ *
+ * main.cxx
+ *
+ * The main program.
+ *
+ ***********************************************************************/
+
+#define WRAP
+
+#include "internal.h"
+#include "ascii.h"
+#include "latex.h"
+#include "html.h"
+#include "nodoc.h"
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+
+class SwigException {};
+
+static char *usage = "\
+\nDocumentation Options\n\
+     -dascii         - ASCII documentation.\n\
+     -dhtml          - HTML documentation.\n\
+     -dlatex         - LaTeX documentation.\n\
+     -dnone          - No documentation.\n\n\
+General Options\n\
+     -c              - Produce raw wrapper code (omit support code)\n\
+     -c++            - Enable C++ processing\n\
+     -ci             - Check a file into the SWIG library\n\
+     -co             - Check a file out of the SWIG library\n\
+     -d docfile      - Set name of the documentation file.\n\
+     -Dsymbol        - Define a symbol (for conditional compilation)\n\
+     -I<dir>         - Look for SWIG files in <dir>\n\
+     -l<ifile>       - Include SWIG library file.\n\
+     -make_default   - Create default constructors/destructors\n\
+     -nocomment      - Ignore all comments (for documentation).\n\
+     -o outfile      - Set name of the output file.\n\
+     -objc           - Enable Objective C processing\n\
+     -stat           - Print statistics\n\
+     -strict n       - Set pointer type-checking strictness\n\
+     -swiglib        - Report location of SWIG library and exit\n\
+     -t typemap_file - Use a typemap file.\n\
+     -v              - Run in verbose mode\n\
+     -version        - Print SWIG version number\n\
+     -help           - This output.\n\n";
+
+//-----------------------------------------------------------------
+// main()
+//
+// Main program.    Initializes the files and starts the parser.
+//-----------------------------------------------------------------
+
+char  infilename[256];
+char  filename[256];
+char  fn_header[256];
+char  fn_wrapper[256];
+char  fn_init[256];
+char  output_dir[512];
+
+#ifdef MACSWIG
+FILE  *swig_log;
+#endif
+
+char *SwigLib;
+
+//char** __argv;
+//int    __argc;
+
+int SWIG_main(int argc, char *argv[], Language *l, Documentation *d) {
+
+  int    i;
+  char   *c;
+  extern  FILE   *LEX_in;
+  extern  void   add_directory(char *);
+  extern  char   *get_time();
+  char    temp[512];
+  char    infile[512];
+
+  char   *outfile_name = 0;
+  extern  int add_iname(char *);
+  int     help = 0;
+  int     ignorecomments = 0;
+  int     checkout = 0;
+  int     checkin = 0;
+  char   *typemap_file = 0;
+  char   *includefiles[256];
+  int     includecount = 0;
+  extern  void check_suffix(char *);
+  extern  void scanner_file(FILE *);
+
+#ifdef MACSWIG
+  try {
+#endif
+
+  f_wrappers = 0;
+  f_init = 0;
+  f_header = 0;
+
+  //__argc = argc;
+  //__argv = argv;
+  lang = l;
+  doc = d;
+  Status = 0;
+  TypeStrict = 2;                   // Very strict type checking
+  Verbose = 0;
+  char    *doc_file = 0;
+
+  DataType::init_typedef();         // Initialize the type handler
+
+  // Set up some default symbols (available in both SWIG interface files
+  // and C files)
+
+  add_symbol("SWIG",0,0);            // Define the SWIG symbol
+#ifdef MACSWIG
+  add_symbol("SWIGMAC",0,0);
+#endif
+#ifdef SWIGWIN32
+  add_symbol("SWIGWIN32",0,0);
+#endif
+
+  strcpy(LibDir, getSwigLib());
+  SwigLib = copy_string(LibDir);        // Make a copy of the real library location
+#ifdef MACSWIG
+  sprintf(temp,"%s:config", LibDir);
+  add_directory(temp);
+  add_directory(":swig_lib:config");
+  add_directory(LibDir);
+  add_directory(":swig_lib");
+#else
+  sprintf(temp,"%s/config", LibDir);
+  add_directory(temp);
+  add_directory("./swig_lib/config");
+  add_directory(LibDir);
+  add_directory("./swig_lib");
+  sprintf(InitName,"init_wrap");
+#endif
+
+  sprintf(InitName,"init_wrap");
+
+  // Get options
+  for (i = 1; i < argc; i++) {
+      if (argv[i]) {
+         if (strncmp(argv[i],"-I",2) == 0) {
+           // Add a new directory search path
+           includefiles[includecount++] = copy_string(argv[i]+2);
+           mark_arg(i);
+         } else if (strncmp(argv[i],"-D",2) == 0) {
+           // Create a symbol
+           add_symbol(argv[i]+2, (DataType *) 0, (char *) 0);
+           mark_arg(i);
+         } else if (strcmp(argv[i],"-strict") == 0) {
+           if (argv[i+1]) {
+             TypeStrict = atoi(argv[i+1]);
+             mark_arg(i);
+             mark_arg(i+1);
+             i++;
+           } else {
+             arg_error();
+           }
+         } else if ((strcmp(argv[i],"-verbose") == 0) || (strcmp(argv[i],"-v") == 0)) {
+             Verbose = 1;
+             mark_arg(i);
+         } else if (strcmp(argv[i],"-dascii") == 0) {
+             doc = new ASCII;
+             mark_arg(i);
+         } else if (strcmp(argv[i],"-dnone") == 0) {
+             doc = new NODOC;
+             mark_arg(i);
+         } else if (strcmp(argv[i],"-dhtml") == 0) {
+             doc = new HTML;
+             mark_arg(i);
+         } else if (strcmp(argv[i],"-dlatex") == 0) {
+             doc = new LATEX;
+             mark_arg(i);
+         } else if (strcmp(argv[i],"-nocomment") == 0) {
+             ignorecomments = 1;
+             mark_arg(i);
+         } else if (strcmp(argv[i],"-stat") == 0) {
+             Stats=1;
+             mark_arg(i);
+         } else if (strcmp(argv[i],"-c++") == 0) {
+             CPlusPlus=1;
+             mark_arg(i);
+          } else if (strcmp(argv[i],"-objc") == 0) {
+             ObjC = 1;
+              mark_arg(i);
+         } else if (strcmp(argv[i],"-c") == 0) {
+             NoInclude=1;
+             mark_arg(i);
+          } else if (strcmp(argv[i],"-make_default") == 0) {
+           GenerateDefault = 1;
+           mark_arg(i);
+          } else if (strcmp(argv[i],"-swiglib") == 0) {
+           printf("%s\n", LibDir);
+           SWIG_exit(0);
+         } else if (strcmp(argv[i],"-o") == 0) {
+             mark_arg(i);
+             if (argv[i+1]) {
+               outfile_name = copy_string(argv[i+1]);
+               mark_arg(i+1);
+               i++;
+             } else {
+               arg_error();
+             }
+         } else if (strcmp(argv[i],"-d") == 0) {
+             mark_arg(i);
+             if (argv[i+1]) {
+               doc_file = copy_string(argv[i+1]);
+               mark_arg(i+1);
+               i++;
+             } else {
+               arg_error();
+             }
+         } else if (strcmp(argv[i],"-t") == 0) {
+             mark_arg(i);
+             if (argv[i+1]) {
+               typemap_file = copy_string(argv[i+1]);
+               mark_arg(i+1);
+               i++;
+             } else {
+               arg_error();
+             }
+         } else if (strcmp(argv[i],"-version") == 0) {
+             fprintf(stderr,"\nSWIG Version %d.%d %s\n", SWIG_MAJOR_VERSION,
+                     SWIG_MINOR_VERSION, SWIG_SPIN);
+             fprintf(stderr,"Copyright (c) 1995-98\n");
+             fprintf(stderr,"University of Utah and the Regents of the University of California\n");
+             fprintf(stderr,"\nCompiled with %s\n", SWIG_CC);
+             SWIG_exit(0);
+         } else if (strncmp(argv[i],"-l",2) == 0) {
+           // Add a new directory search path
+           library_add(argv[i]+2);
+           mark_arg(i);
+          } else if (strcmp(argv[i],"-co") == 0) {
+           checkout = 1;
+           mark_arg(i);
+         } else if (strcmp(argv[i],"-ci") == 0) {
+           checkin = 1;
+           mark_arg(i);
+         } else if (strcmp(argv[i],"-help") == 0) {
+           fputs(usage,stderr);
+           mark_arg(i);
+           help = 1;
+         }
+      }
+  }
+
+  while (includecount > 0) {
+    add_directory(includefiles[--includecount]);
+  }
+
+  // Create a new documentation handler
+
+  if (doc == 0) doc = new ASCII;
+
+  // Open up a comment handler
+
+  comment_handler = new CommentHandler();
+  comment_handler->parse_args(argc,argv);
+  if (ignorecomments) comment_handler->style("ignore",0);
+
+  // Create a new documentation entry
+
+  doctitle = new DocTitle("",0);
+  doctitle->parse_args(argc,argv);
+  doc_entry = doctitle;
+
+  // Handle documentation module options
+
+  doc->parse_args(argc,argv);
+
+  // Parse language dependent options
+
+  lang->parse_args(argc,argv);
+
+  if (help) SWIG_exit(0);              // Exit if we're in help mode
+
+  // Check all of the options to make sure we're cool.
+
+  check_options();
+
+  // If we made it this far, looks good. go for it....
+
+  // Create names of temporary files that are created
+
+  sprintf(infilename,"%s", argv[argc-1]);
+  input_file = new char[strlen(infilename)+1];
+  strcpy(input_file, infilename);
+
+  // If the user has requested to check out a file, handle that
+
+  if (checkout) {
+    int stat;
+    char *outfile = input_file;
+    if (outfile_name)
+      outfile = outfile_name;
+    stat = checkout_file(input_file,outfile);
+    if (!stat) {
+      fprintf(stderr,"%s checked out from the SWIG library\n",input_file);
+    } else {
+      FILE * f = fopen(input_file,"r");
+      if (f) {
+       fprintf(stderr,"Unable to check-out %s. File already exists.\n", input_file);
+       fclose(f);
+      } else {
+       fprintf(stderr,"Unable to check-out %s\n", input_file);
+      }
+    }
+  } else if (checkin) {
+    // Try to check-in a file to the SWIG library
+    int stat;
+    char *outname = input_file;
+    if (outfile_name)
+      outname = outfile_name;
+    stat = checkin_file(SwigLib, LibDir, input_file, outname);
+    if (!stat) {
+      fprintf(stderr,"%s checked-in to %s/%s/%s\n", input_file, SwigLib, LibDir, outname);
+    } else {
+      fprintf(stderr,"Unable to check-in %s to %s/%s\n", input_file, SwigLib, LibDir);
+    }
+  } else {
+    doctitle->file = copy_string(input_file);
+    doctitle->line_number = -1000;
+    doctitle->end_line = -1000;
+
+    // Check the suffix for a .c file.  If so, we're going to
+    // declare everything we see as "extern"
+
+    check_suffix(infilename);
+
+    // Strip off suffix
+
+    c = infilename + strlen(infilename);
+    while (c != infilename) {
+      if (*c == '.') {
+       *c = 0;
+       break;
+      } else {
+       c--;
+      }
+    }
+
+    if (!outfile_name) {
+      sprintf(fn_header,"%s_wrap.c",infilename);
+      strcpy(infile,infilename);
+      strcpy(output_dir,"");
+    } else {
+      sprintf(fn_header,"%s",outfile_name);
+      // Try to identify the output directory
+      char *cc = outfile_name;
+      char *lastc = outfile_name;
+      while (*cc) {
+#ifdef MACSWIG
+       if (*cc == ':') lastc = cc+1;
+#else
+       if (*cc == '/') lastc = cc+1;
+#endif
+       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) {
+#ifdef MACSWIG
+       if (*cc == ':') {
+         cc++;
+         break;
+       }
+#else
+       if (*cc == '/') {
+         cc++;
+         break;
+       }
+#endif
+       cc--;
+      }
+      strcpy(infile,cc);
+    }
+
+    sprintf(fn_wrapper,"%s%s_wrap.wrap",output_dir,infile);
+    sprintf(fn_init,"%s%s_wrap.init",output_dir,infile);
+
+    sprintf(title,"%s", fn_header);
+
+    // Open up files
+
+    if ((f_input = fopen(input_file,"r")) == 0) {
+      // Okay. File wasn't found right away.  Let's see if we can
+      // extract it from the SWIG library instead.
+      if ((checkout_file(input_file,input_file)) == -1) {
+       fprintf(stderr,"Unable to open %s\n", input_file);
+       SWIG_exit(0);
+      } else {
+       // Successfully checked out a file from the library, print a warning and
+        // continue
+       checkout = 1;
+       fprintf(stderr,"%s checked out from the SWIG library.\n",input_file);
+       if ((f_input = fopen(input_file,"r")) == 0) {
+         fprintf(stderr,"Unable to open %s\n", input_file);
+         SWIG_exit(0);
+       }
+      }
+    }
+
+    // Add to the include list
+
+    add_iname(infilename);
+
+    // Initialize the scanner
+
+    LEX_in = f_input;
+    scanner_file(LEX_in);
+
+//    printf("fn_header = %s\n", fn_header);
+//    printf("fn_wrapper = %s\n", fn_wrapper);
+//    printf("fn_init = %s\n", fn_init);
+
+    if((f_header = fopen(fn_header,"w")) == 0) {
+      fprintf(stderr,"Unable to open %s\n", fn_header);
+      exit(0);
+    }
+    if((f_wrappers = fopen(fn_wrapper,"w")) == 0) {
+      fprintf(stderr,"Unable to open %s\n",fn_wrapper);
+      exit(0);
+    }
+    if ((f_init = fopen(fn_init,"w")) == 0) {
+      fprintf(stderr,"Unable to open %s\n",fn_init);
+      exit(0);
+    }
+
+    // Open up documentation
+
+    if (doc_file) {
+      doc->init(doc_file);
+    } else {
+      doc_file = new char[strlen(infile)+strlen(output_dir)+8];
+      sprintf(doc_file,"%s%s_wrap",output_dir,infile);
+      doc->init(doc_file);
+    }
+
+    // Set up the typemap for handling new return strings
+    {
+      DataType *temp_t = new DataType(T_CHAR);
+      temp_t->is_pointer++;
+      if (CPlusPlus)
+       typemap_register("newfree",typemap_lang,temp_t,"","delete [] $source;\n",0);
+      else
+       typemap_register("newfree",typemap_lang,temp_t,"","free($source);\n",0);
+
+      delete temp_t;
+    }
+
+    // Define the __cplusplus symbol
+    if (CPlusPlus)
+      add_symbol("__cplusplus",0,0);
+
+
+    // Load up the typemap file if given
+
+    if (typemap_file) {
+      if (include_file(typemap_file) == -1) {
+       fprintf(stderr,"Unable to locate typemap file %s.  Aborting.\n", typemap_file);
+       SWIG_exit(1);
+      }
+    }
+
+    // If in Objective-C mode.  Load in a configuration file
+
+    if (ObjC) {
+      // Add the 'id' object type as a void *
+      /*      DataType *t = new DataType(T_VOID);
+      t->is_pointer = 1;
+      t->implicit_ptr = 0;
+      t->typedef_add("id");
+      delete t;
+      */
+    }
+
+    // Pass control over to the specific language interpreter
+
+    lang->parse();
+
+    fclose(f_wrappers);
+    fclose(f_init);
+
+    swig_append(fn_wrapper,f_header);
+    swig_append(fn_init,f_header);
+
+    fclose(f_header);
+
+    // Print out documentation.  Due to tree-like nature of documentation,
+    // printing out the title prints out everything.
+
+    while(doctitle) {
+      doctitle->output(doc);
+      doctitle = doctitle->next;
+    }
+
+    doc->close();
+
+    // Remove temporary files
+
+    remove(fn_wrapper);
+    remove(fn_init);
+
+    // If only producing documentation, remove the wrapper file as well
+
+    if (DocOnly)
+      remove(fn_header);
+
+    // Check for undefined types that were used.
+
+    if (Verbose)
+      type_undefined_check();
+
+    if (Stats) {
+      fprintf(stderr,"Wrapped %d functions\n", Stat_func);
+      fprintf(stderr,"Wrapped %d variables\n", Stat_var);
+      fprintf(stderr,"Wrapped %d constants\n", Stat_const);
+      type_undefined_check();
+    }
+
+    if (checkout) {
+      // File was checked out from the SWIG library.   Remove it now
+      remove(input_file);
+    }
+  }
+#ifdef MACSWIG
+  fclose(swig_log);
+  } catch (SwigException) {
+    fclose(swig_log);
+  }
+#else
+  exit(error_count);
+#endif
+  return(error_count);
+}
+
+// --------------------------------------------------------------------------
+// SWIG_exit()
+//
+// Fatal parser error. Exit and cleanup
+// --------------------------------------------------------------------------
+
+void SWIG_exit(int) {
+
+  if (f_wrappers) {
+    fclose(f_wrappers);
+    remove(fn_wrapper);
+  }
+  if (f_header) {
+    fclose(f_header);
+    remove(fn_header);
+  }
+  if (f_init) {
+    fclose(f_init);
+    remove(fn_init);
+  }
+#ifndef MACSWIG
+  exit(1);
+#else
+  throw SwigException();
+#endif
+}
+
+
+// --------------------------------------------------------------------------
+// swig_pragma(char *name, char *value)
+//
+// Handle pragma directives.  Not many supported right now
+// --------------------------------------------------------------------------
+
+void swig_pragma(char *name, char *value) {
+
+  if (strcmp(name,"make_default") == 0) {
+    GenerateDefault = 1;
+  }
+  if (strcmp(name,"no_default") == 0) {
+    GenerateDefault = 0;
+  }
+  if (strcmp(name,"objc_new") == 0) {
+    objc_construct = copy_string(value);
+  }
+  if (strcmp(name,"objc_delete") == 0) {
+    objc_destruct = copy_string(value);
+  }
+}
+
+
+
+char* getSwigLib() {
+  char* c;
+  char* rv;
+
+  // Check for SWIG_LIB environment variable
+  if ((c = getenv("SWIG_LIB")) != (char *) 0) {
+      rv = c;
+  } else {
+#ifdef SWIG_LIB
+      rv = SWIG_LIB;
+#else
+      // use executable location
+      static char path[256];
+      char*       last;
+      strcpy(path, __argv[0]);
+      last = strrchr(path, '/');
+      if (! last) last = strrchr(path, '\\');
+      if (last)
+          strcpy(last+1, "swig_lib");
+      else
+          strcpy(path, "swig_lib");
+      rv = path;
+#endif
+  }
+  printf("Using swig lib at: %s\n", rv);
+  return rv;
+}
+