special cases and other things in wxPython, and since I plan on making several more, I've decided to put the SWIG sources in wxPython's CVS instead of relying on maintaining patches. This effectivly becomes a fork of an obsolete version of SWIG, :-( but since SWIG 1.3 still doesn't have some things I rely on in 1.1, not to mention that my custom patches would all have to be redone, I felt that this is the easier road to take. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15307 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			300 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*******************************************************************************
 | 
						|
 * 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.
 | 
						|
 *******************************************************************************/
 | 
						|
 | 
						|
#include "internal.h"
 | 
						|
#include <limits.h>
 | 
						|
#include <ctype.h>
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// $Header$
 | 
						|
//
 | 
						|
// naming.cxx
 | 
						|
//
 | 
						|
// SWIG naming service.
 | 
						|
//
 | 
						|
// This module provides universal naming services for manufacturing function names.
 | 
						|
// All language modules use this so it provides a convenient centralized
 | 
						|
// mechanism for producing names.
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
// Structure for holding names
 | 
						|
 | 
						|
struct NamingScheme {
 | 
						|
  char            *format;
 | 
						|
  int             first;                // Scoping information
 | 
						|
  int             last;                 // Scoping information
 | 
						|
  NamingScheme    *next;
 | 
						|
  NamingScheme(char *n) {
 | 
						|
    format = copy_string(n);
 | 
						|
    first = type_id;
 | 
						|
    last = INT_MAX;
 | 
						|
    next = 0;
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
// Hash table containing naming data
 | 
						|
 | 
						|
static Hash naming_hash;
 | 
						|
 | 
						|
// Variable indicating naming scope
 | 
						|
 | 
						|
static int naming_scope = -1;
 | 
						|
 | 
						|
//-----------------------------------------------------------------
 | 
						|
// make_wrap_name(char *s)
 | 
						|
//
 | 
						|
// Takes the name at src, and converts it into a syntactically
 | 
						|
// valid identifier name.   This is a hack to get the wrapper
 | 
						|
// generator to support class member functions and other things.
 | 
						|
//
 | 
						|
// ie.  We can define a function name as obj->foo(),
 | 
						|
// but we'll need to call the wrapper function something like
 | 
						|
// _wrap_obj__foo()
 | 
						|
//-----------------------------------------------------------------
 | 
						|
 | 
						|
void make_wrap_name(char *s) {
 | 
						|
 | 
						|
  char *c1 = s;
 | 
						|
  int  i;
 | 
						|
 | 
						|
  for (i = 0; i < (int) strlen(s); i++, c1++) {
 | 
						|
    if(!isalnum(*c1)) *c1 = '_';
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// int name_scope(int scope)
 | 
						|
//
 | 
						|
// Set the scope variable.  This is used to determine what naming scheme to
 | 
						|
// use.    Returns the current value of the scope.
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
int name_scope(int scope) {
 | 
						|
  int s = naming_scope;
 | 
						|
  naming_scope = scope;
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// void name_register(char *method, char *format)
 | 
						|
//
 | 
						|
// Registers a new naming scheme.
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
void name_register(char *method, char *format) {
 | 
						|
  NamingScheme *ns, *nns;
 | 
						|
 | 
						|
  ns = (NamingScheme *) naming_hash.lookup(method);
 | 
						|
  if (ns) {
 | 
						|
    naming_hash.remove(method);
 | 
						|
  }
 | 
						|
 | 
						|
  nns = new NamingScheme(format);      // Create a new naming scheme
 | 
						|
  if (ns) ns->last = type_id;
 | 
						|
  nns->next = ns;
 | 
						|
 | 
						|
  naming_hash.add(method,nns);
 | 
						|
};
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// char *name_getformat(char *method)
 | 
						|
//
 | 
						|
// Looks up a naming scheme in the hash table.  The scope of the name should have
 | 
						|
// been set prior to calling this.  If not set, we just use the last name entered.
 | 
						|
// Returns the format string or NULL if no name has been set.
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
static char *name_getformat(char *method) {
 | 
						|
  
 | 
						|
  NamingScheme *ns;
 | 
						|
  int scope;
 | 
						|
  if (naming_scope == -1) scope = type_id;
 | 
						|
  else scope = naming_scope;
 | 
						|
 | 
						|
  ns = (NamingScheme *) naming_hash.lookup(method);
 | 
						|
  while (ns) {
 | 
						|
    if ((ns->first <= scope) && (scope < ns->last))
 | 
						|
      return ns->format;
 | 
						|
    ns = ns->next;
 | 
						|
  }
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// char *name_wrapper(char *fname, char *prefix, int suppress)
 | 
						|
//
 | 
						|
// Returns the name of a wrapper function.  The following variables are
 | 
						|
// available :
 | 
						|
//
 | 
						|
//         %f          -> fname
 | 
						|
//         %p          -> prefix
 | 
						|
//         %l          -> language
 | 
						|
//
 | 
						|
// By default a wrapper function gets the name _wrap_prefixfname.
 | 
						|
//
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
char *name_wrapper(char *fname, char *prefix, int suppress) {
 | 
						|
  static String fmt;
 | 
						|
  char   *f;
 | 
						|
 | 
						|
  f = name_getformat("wrapper");
 | 
						|
  if (!f) {
 | 
						|
    f = "_wrap_%p%f";                  // Default wrapper name
 | 
						|
  }
 | 
						|
  fmt = f;
 | 
						|
  fmt.replace("%f",fname);
 | 
						|
  fmt.replace("%l",typemap_lang);
 | 
						|
  fmt.replace("%p",prefix);
 | 
						|
  if (!suppress)
 | 
						|
    make_wrap_name(fmt);
 | 
						|
  return fmt;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// char *name_member(char *fname, char *classname, int suppress)
 | 
						|
//
 | 
						|
// Returns the name of a method function.  The following variables are
 | 
						|
// available :
 | 
						|
//
 | 
						|
//         %f          -> fname
 | 
						|
//         %c          -> classname
 | 
						|
//         %l          -> language
 | 
						|
//
 | 
						|
// By default, the name of a method is given as Classname_method.
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
char *name_member(char *fname, char *classname, int suppress) {
 | 
						|
  static String fmt;
 | 
						|
  char   *f;
 | 
						|
 | 
						|
  f = name_getformat("member");
 | 
						|
  if (!f) {
 | 
						|
    f = "%c_%f";
 | 
						|
  }
 | 
						|
  fmt = f;
 | 
						|
  fmt.replace("%f",fname);
 | 
						|
  fmt.replace("%l",typemap_lang);
 | 
						|
  fmt.replace("%c",classname);
 | 
						|
  if (!suppress)
 | 
						|
    make_wrap_name(fmt);
 | 
						|
  return fmt;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// char *name_get(char *vname, int suppress)
 | 
						|
//
 | 
						|
// Returns the name of the accessor function used to get a variable.
 | 
						|
//
 | 
						|
//         %v          -> variable name
 | 
						|
//
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
char *name_get(char *vname, int suppress) {
 | 
						|
  static String fmt;
 | 
						|
  char   *f;
 | 
						|
 | 
						|
  f = name_getformat("get");
 | 
						|
  if (!f) {
 | 
						|
    f = "%v_get";
 | 
						|
  }
 | 
						|
  fmt = f;
 | 
						|
  fmt.replace("%v",vname);
 | 
						|
  if (!suppress)
 | 
						|
    make_wrap_name(fmt);
 | 
						|
  return fmt;
 | 
						|
}
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// char *name_set(char *vname, int suppress)
 | 
						|
//
 | 
						|
// Returns the name of the accessor function used to set a variable.
 | 
						|
//
 | 
						|
//         %v          -> variable name
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
char *name_set(char *vname, int suppress) {
 | 
						|
  static String fmt;
 | 
						|
  char   *f;
 | 
						|
 | 
						|
  f = name_getformat("set");
 | 
						|
  if (!f) {
 | 
						|
    f = "%v_set";
 | 
						|
  }
 | 
						|
  fmt = f;
 | 
						|
  fmt.replace("%v",vname);
 | 
						|
  if (!suppress)
 | 
						|
    make_wrap_name(fmt);
 | 
						|
  return fmt;
 | 
						|
}
 | 
						|
  
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// char *name_construct(char *classname, int suppress)
 | 
						|
//
 | 
						|
// Returns the name of the accessor function used to create an object.
 | 
						|
// By default this is "new_classname"
 | 
						|
//
 | 
						|
//         %c          -> classname
 | 
						|
//         %l          -> language
 | 
						|
//
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
char *name_construct(char *classname, int suppress) {
 | 
						|
  static String fmt;
 | 
						|
  char   *f;
 | 
						|
 | 
						|
  f = name_getformat("construct");
 | 
						|
  if (!f) {
 | 
						|
    f = "new_%c";
 | 
						|
  }
 | 
						|
  fmt = f;
 | 
						|
  fmt.replace("%l",typemap_lang);
 | 
						|
  fmt.replace("%c",classname);
 | 
						|
  if (!suppress)
 | 
						|
    make_wrap_name(fmt);
 | 
						|
  return fmt;
 | 
						|
}
 | 
						|
  
 | 
						|
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
// char *name_destroy(char *classname, int suppress)
 | 
						|
//
 | 
						|
// Returns the name of the accessor function used to destroy an object.
 | 
						|
// By default this is "delete_classname"
 | 
						|
//
 | 
						|
//         %c          -> classname
 | 
						|
//         %l          -> language
 | 
						|
//
 | 
						|
// --------------------------------------------------------------------------------
 | 
						|
 | 
						|
char *name_destroy(char *classname, int suppress) {
 | 
						|
  static String fmt;
 | 
						|
  char   *f;
 | 
						|
 | 
						|
  f = name_getformat("destroy");
 | 
						|
  if (!f) {
 | 
						|
    f = "delete_%c";
 | 
						|
  }
 | 
						|
  fmt = f;
 | 
						|
  fmt.replace("%l",typemap_lang);
 | 
						|
  fmt.replace("%c",classname);
 | 
						|
  if (!suppress)
 | 
						|
    make_wrap_name(fmt);
 | 
						|
  return fmt;
 | 
						|
}
 |