c90f71dd8c
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;
|
|
}
|