Started conversion of Language API

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@925 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-10-18 05:06:39 +00:00
commit eb1b332e4c
19 changed files with 307 additions and 202 deletions

View file

@ -461,15 +461,15 @@ throw_unhandled_guile_type_error (SwigType *d)
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// GUILE::create_function(char *name, char *iname, SwigType *d, // GUILE::create_function()
// ParmList *l)
//
// Create a function declaration and register it with the interpreter. // Create a function declaration and register it with the interpreter.
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
void void
GUILE::create_function (char *name, char *iname, SwigType *d, ParmList *l) GUILE::function (DOH *node) {
{ char *name, *iname;
SwigType *d;
ParmList *l;
Parm *p; Parm *p;
DOHString *proc_name = 0; DOHString *proc_name = 0;
char source[256], target[256]; char source[256], target[256];
@ -484,6 +484,11 @@ GUILE::create_function (char *name, char *iname, SwigType *d, ParmList *l)
int numargs = 0; int numargs = 0;
int numopt = 0; int numopt = 0;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
d = Getattr(node,"type");
l = Getattr(node,"parms");
// Make a wrapper name for this // Make a wrapper name for this
char * wname = new char [strlen (prefix) + strlen (iname) + 2]; char * wname = new char [strlen (prefix) + strlen (iname) + 2];
sprintf (wname, "%s%s", prefix, iname); sprintf (wname, "%s%s", prefix, iname);
@ -722,7 +727,7 @@ GUILE::create_function (char *name, char *iname, SwigType *d, ParmList *l)
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// GUILE::link_variable(char *name, char *iname, SwigType *d) // GUILE::variable()
// //
// Create a link to a C variable. // Create a link to a C variable.
// This creates a single function PREFIX_var_VARNAME(). // This creates a single function PREFIX_var_VARNAME().
@ -733,13 +738,21 @@ GUILE::create_function (char *name, char *iname, SwigType *d, ParmList *l)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void void
GUILE::link_variable (char *name, char *iname, SwigType *t) GUILE::variable (DOH *node)
{ {
char *name, *iname;
SwigType *t;
DOHString *proc_name; DOHString *proc_name;
char var_name[256]; char var_name[256];
char *tm; char *tm;
Wrapper *f; Wrapper *f;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
t = Getattr(node,"type");
f = NewWrapper(); f = NewWrapper();
// evaluation function names // evaluation function names
@ -879,15 +892,18 @@ GUILE::link_variable (char *name, char *iname, SwigType *t)
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// GUILE::declare_const(char *name, char *iname, SwigType *type, char *value) // GUILE::constant()
// //
// Makes a constant. Not sure how this is really supposed to work. // Makes a constant. Not sure how this is really supposed to work.
// I'm going to fake out SWIG and create a variable instead. // I'm going to fake out SWIG and create a variable instead.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
void void
GUILE::declare_const (char *name, char *, SwigType *type, char *value) GUILE::constant(DOH *node)
{ {
char *name;
SwigType *type;
char *value;
int OldStatus = Status; // Save old status flags int OldStatus = Status; // Save old status flags
DOHString *proc_name; DOHString *proc_name;
char var_name[256]; char var_name[256];
@ -895,6 +911,10 @@ GUILE::declare_const (char *name, char *, SwigType *type, char *value)
char *tm; char *tm;
Wrapper *f; Wrapper *f;
name = GetChar(node,"name");
type = Getattr(node,"type");
value = GetChar(node,"value");
f = NewWrapper(); f = NewWrapper();
Status = STAT_READONLY; // Enable readonly mode. Status = STAT_READONLY; // Enable readonly mode.
@ -937,7 +957,10 @@ GUILE::declare_const (char *name, char *, SwigType *type, char *value)
} }
// Now create a variable declaration // Now create a variable declaration
link_variable (var_name, name, type); Hash *nnode = Copy(node);
Setattr(nnode,"name",var_name);
variable(nnode);
Delete(nnode);
Status = OldStatus; Status = OldStatus;
} }
Delete(proc_name); Delete(proc_name);

View file

@ -44,9 +44,9 @@ public :
GUILE (); GUILE ();
void parse_args (int, char *argv[]); void parse_args (int, char *argv[]);
void parse (); void parse ();
void create_function (char *, char *, SwigType *, ParmList *); void function (DOH *node);
void link_variable (char *, char *, SwigType *); void variable (DOH *node);
void declare_const (char *, char *, SwigType *, char *); void constant (DOH *node);
void initialize (); void initialize ();
void headers (void); void headers (void);
void close (void); void close (void);

View file

@ -240,8 +240,7 @@ MZSCHEME::get_pointer (String *name, int parm, SwigType *t, Wrapper *f)
"\", \"", SwigType_manglestr(t), "\", ", p, ", argc, argv);\n",0); "\", \"", SwigType_manglestr(t), "\", ", p, ", argc, argv);\n",0);
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// MZSCHEME::create_function(char *name, char *iname, SwigType *d, // MZSCHEME::create_function()
// ParmList *l)
// //
// Create a function declaration and register it with the interpreter. // Create a function declaration and register it with the interpreter.
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
@ -267,8 +266,11 @@ throw_unhandled_mzscheme_type_error (SwigType *d)
} }
void void
MZSCHEME::create_function (char *name, char *iname, SwigType *d, ParmList *l) MZSCHEME::function(DOH *node)
{ {
char *name, *iname;
SwigType *d;
ParmList *l;
Parm *p; Parm *p;
Wrapper *f = NewWrapper(); Wrapper *f = NewWrapper();
String *proc_name = NewString(""); String *proc_name = NewString("");
@ -287,6 +289,11 @@ MZSCHEME::create_function (char *name, char *iname, SwigType *d, ParmList *l)
int argout_set = 0; int argout_set = 0;
int i = 0; int i = 0;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
d = Getattr(node,"type");
l = Getattr(node,"parms");
// Make a wrapper name for this // Make a wrapper name for this
char *wname = Char(Swig_name_wrapper(iname)); char *wname = Char(Swig_name_wrapper(iname));
@ -476,7 +483,7 @@ MZSCHEME::create_function (char *name, char *iname, SwigType *d, ParmList *l)
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// MZSCHEME::link_variable(char *name, char *iname, SwigType *d) // MZSCHEME::variable()
// //
// Create a link to a C variable. // Create a link to a C variable.
// This creates a single function _wrap_swig_var_varname(). // This creates a single function _wrap_swig_var_varname().
@ -487,8 +494,10 @@ MZSCHEME::create_function (char *name, char *iname, SwigType *d, ParmList *l)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void void
MZSCHEME::link_variable (char *name, char *iname, SwigType *t) MZSCHEME::variable (DOH *node)
{ {
char *name, *iname;
SwigType *t;
String *proc_name = NewString(""); String *proc_name = NewString("");
char var_name[256]; char var_name[256];
char *tm; char *tm;
@ -496,6 +505,10 @@ MZSCHEME::link_variable (char *name, char *iname, SwigType *t)
String *argnum = NewString("0"); String *argnum = NewString("0");
String *arg = NewString("argv[0]"); String *arg = NewString("argv[0]");
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
t = Getattr(node,"type");
// evaluation function names // evaluation function names
sprintf (var_name, "_wrap_%svar_%s", prefix, iname); sprintf (var_name, "_wrap_%svar_%s", prefix, iname);
@ -604,15 +617,19 @@ MZSCHEME::link_variable (char *name, char *iname, SwigType *t)
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// MZSCHEME::declare_const(char *name, char *iname, SwigType *type, char *value) // MZSCHEME::constant()
// //
// Makes a constant. Not sure how this is really supposed to work. // Makes a constant. Not sure how this is really supposed to work.
// I'm going to fake out SWIG and create a variable instead. // I'm going to fake out SWIG and create a variable instead.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
void void
MZSCHEME::declare_const (char *name, char *, SwigType *type, char *value) MZSCHEME::constant(DOH *node)
{ {
char *name;
SwigType *type;
char *value;
int OldStatus = Status; // Save old status flags int OldStatus = Status; // Save old status flags
char var_name[256]; char var_name[256];
String *proc_name = NewString(""); String *proc_name = NewString("");
@ -620,6 +637,10 @@ MZSCHEME::declare_const (char *name, char *, SwigType *type, char *value)
String *temp = NewString(""); String *temp = NewString("");
char *tm; char *tm;
name = GetChar(node,"name");
type = Getattr(node,"type");
value = GetChar(node,"value");
Status = STAT_READONLY; // Enable readonly mode. Status = STAT_READONLY; // Enable readonly mode.
// Make a static variable; // Make a static variable;
@ -666,7 +687,10 @@ MZSCHEME::declare_const (char *name, char *, SwigType *type, char *value)
// Now create a variable declaration // Now create a variable declaration
link_variable (var_name, name, type); Hash *nnode = Copy(node);
Setattr(nnode,"name",var_name);
variable (nnode);
Delete(nnode);
Status = OldStatus; Status = OldStatus;
} }
Delete(proc_name); Delete(proc_name);

View file

@ -35,9 +35,9 @@ private:
public : public :
void parse_args (int, char *argv[]); void parse_args (int, char *argv[]);
void parse (); void parse ();
void create_function (char *, char *, SwigType *, ParmList *); void function (DOH *node);
void link_variable (char *, char *, SwigType *); void variable (DOH *node);
void declare_const (char *, char *, SwigType *, char *); void constant (DOH *node);
void initialize (); void initialize ();
void headers (void); void headers (void);
void close (void); void close (void);

View file

@ -498,8 +498,11 @@ PERL5::create_command(char *cname, char *iname) {
* PERL5::create_function() * PERL5::create_function()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void void
PERL5::create_function(char *name, char *iname, SwigType *d, ParmList *l) PERL5::function(DOH *node)
{ {
char *name, *iname;
SwigType *d;
ParmList *l;
Parm *p; Parm *p;
int pcount,i,j; int pcount,i,j;
Wrapper *f; Wrapper *f;
@ -509,6 +512,11 @@ PERL5::create_function(char *name, char *iname, SwigType *d, ParmList *l)
int numopt = 0; int numopt = 0;
int need_save, num_saved = 0; int need_save, num_saved = 0;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
d = Getattr(node,"type");
l = Getattr(node,"parms");
f = NewWrapper(); f = NewWrapper();
cleanup = NewString(""); cleanup = NewString("");
outarg = NewString(""); outarg = NewString("");
@ -843,14 +851,20 @@ PERL5::create_function(char *name, char *iname, SwigType *d, ParmList *l)
* PERL5::link_variable() * PERL5::link_variable()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void PERL5::link_variable(char *name, char *iname, SwigType *t) void PERL5::variable(DOH *node) {
{ char *name, *iname;
SwigType *t;
char set_name[256]; char set_name[256];
char val_name[256]; char val_name[256];
Wrapper *getf, *setf; Wrapper *getf, *setf;
char *tm; char *tm;
int setable = 1; int setable = 1;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
t = Getattr(node,"type");
sprintf(set_name,"_wrap_set_%s",iname); sprintf(set_name,"_wrap_set_%s",iname);
sprintf(val_name,"_wrap_val_%s",iname); sprintf(val_name,"_wrap_val_%s",iname);
@ -1073,7 +1087,7 @@ void PERL5::link_variable(char *name, char *iname, SwigType *t)
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* PERL5::declare_const() * PERL5::constant()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
/* Functions used to create constants */ /* Functions used to create constants */
@ -1131,15 +1145,21 @@ static const char *setrv = "#ifndef PERL_OBJECT\
\n}\n"; \n}\n";
void void
PERL5::declare_const(char *name, char *, SwigType *type, char *value) PERL5::constant(DOH *node)
{ {
char *name;
SwigType *type;
char *value;
char *tm; char *tm;
static int have_int_func = 0; static int have_int_func = 0;
static int have_double_func = 0; static int have_double_func = 0;
static int have_char_func = 0; static int have_char_func = 0;
static int have_ref_func = 0; static int have_ref_func = 0;
name = GetChar(node,"name");
type = Getattr(node,"type");
value = GetChar(node,"value");
if ((tm = Swig_typemap_lookup((char*)"const",type,name,value,name,0))) { if ((tm = Swig_typemap_lookup((char*)"const",type,name,value,name,0))) {
Printf(f_init,"%s\n",tm); Printf(f_init,"%s\n",tm);
} else { } else {

View file

@ -25,9 +25,9 @@ private:
public : public :
virtual void parse_args(int, char *argv[]); virtual void parse_args(int, char *argv[]);
virtual void parse(); virtual void parse();
virtual void create_function(char *, char *, SwigType *, ParmList *); virtual void function(DOH *node);
virtual void link_variable(char *, char *, SwigType *); virtual void variable(DOH *node);
virtual void declare_const(char *, char *, SwigType *, char *); virtual void constant(DOH *node);
virtual void initialize(void); virtual void initialize(void);
virtual void close(void); virtual void close(void);
virtual void set_module(char *); virtual void set_module(char *);

View file

@ -322,7 +322,11 @@ PYTHON::create_command(char *cname, char *iname) {
* PYTHON::create_function() * PYTHON::create_function()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void void
PYTHON::create_function(char *name, char *iname, SwigType *d, ParmList *l) { PYTHON::function(DOH *node) {
char *name;
char *iname;
SwigType *d;
ParmList *l;
Parm *p; Parm *p;
int pcount,i,j; int pcount,i,j;
char wname[256]; char wname[256];
@ -339,6 +343,10 @@ PYTHON::create_function(char *name, char *iname, SwigType *d, ParmList *l) {
char *tm; char *tm;
int numopt = 0; int numopt = 0;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
d = Getattr(node,"type");
l = Getattr(node,"parms");
f = NewWrapper(); f = NewWrapper();
parse_args = NewString(""); parse_args = NewString("");
arglist = NewString(""); arglist = NewString("");
@ -670,15 +678,21 @@ PYTHON::create_function(char *name, char *iname, SwigType *d, ParmList *l) {
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* PYTHON::link_variable() * PYTHON::variable()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void void
PYTHON::link_variable(char *name, char *iname, SwigType *t) { PYTHON::variable(DOH *node) {
char *name, *iname;
SwigType *t;
char *wname; char *wname;
static int have_globals = 0; static int have_globals = 0;
char *tm; char *tm;
Wrapper *getf, *setf; Wrapper *getf, *setf;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
t = Getattr(node,"type");
getf = NewWrapper(); getf = NewWrapper();
setf = NewWrapper(); setf = NewWrapper();
@ -908,12 +922,19 @@ PYTHON::link_variable(char *name, char *iname, SwigType *t) {
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* PYTHON::declare_const() * PYTHON::constant()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void void
PYTHON::declare_const(char *name, char *, SwigType *type, char *value) { PYTHON::constant(DOH *node) {
char *name;
SwigType *type;
char *value;
char *tm; char *tm;
name = GetChar(node,"name");
type = Getattr(node,"type");
value = GetChar(node,"value");
if ((tm = Swig_typemap_lookup((char*)"const",type,name,value,name,0))) { if ((tm = Swig_typemap_lookup((char*)"const",type,name,value,name,0))) {
Printf(const_code,"%s\n", tm); Printf(const_code,"%s\n", tm);
} else { } else {

View file

@ -33,9 +33,9 @@ public :
// Don't change any of this // Don't change any of this
virtual void parse_args(int, char *argv[]); virtual void parse_args(int, char *argv[]);
virtual void parse(); virtual void parse();
virtual void create_function(char *, char *, SwigType *, ParmList *); virtual void function(DOH *node);
virtual void link_variable(char *, char *, SwigType *); virtual void variable(DOH *node);
virtual void declare_const(char *, char *, SwigType *, char *); virtual void constant(DOH *node);
virtual void initialize(void); virtual void initialize(void);
virtual void close(void); virtual void close(void);
virtual void set_module(char *); virtual void set_module(char *);

View file

@ -427,22 +427,27 @@ void RUBY::create_command(char *cname, char *iname, int argc) {
} }
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
* RUBY::create_function(char *name, char *iname, SwigType *d, ParmList *l) * RUBY::function()
* *
* Create a function declaration and register it with the interpreter. * Create a function declaration and register it with the interpreter.
* name = Name of real C function
* iname = Name of function in scripting language
* t = Return datatype
* l = Function parameters
* --------------------------------------------------------------------- */ * --------------------------------------------------------------------- */
void RUBY::create_function(char *name, char *iname, SwigType *t, ParmList *l) { void RUBY::function(DOH *node) {
char *name, *iname;
SwigType *t;
ParmList *l;
char source[256], target[256]; char source[256], target[256];
char *tm; char *tm;
String *cleanup, *outarg; String *cleanup, *outarg;
Wrapper *f; Wrapper *f;
int i; int i;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
t = Getattr(node,"type");
l = Getattr(node,"parms");
/* Ruby needs no destructor wrapper */ /* Ruby needs no destructor wrapper */
if (current == DESTRUCTOR) { if (current == DESTRUCTOR) {
Wrapper *dummy = NewWrapper(); Wrapper *dummy = NewWrapper();
@ -687,20 +692,24 @@ void RUBY::create_function(char *name, char *iname, SwigType *t, ParmList *l) {
} }
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
* RUBY::link_variable(char *name, char *iname, SwigType *t) * RUBY::variable()
* *
* Create a link to a C variable. * Create a link to a C variable.
* name = Name of C variable
* iname = Name of variable in scripting language
* t = Datatype of the variable
* --------------------------------------------------------------------- */ * --------------------------------------------------------------------- */
void RUBY::link_variable(char *name, char *iname, SwigType *t) { void RUBY::variable(DOH *node) {
char *name, *iname;
SwigType *t;
char *tm, *source; char *tm, *source;
String *getfname, *setfname; String *getfname, *setfname;
Wrapper *getf, *setf; Wrapper *getf, *setf;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
t = Getattr(node,"type");
getf = NewWrapper(); getf = NewWrapper();
setf = NewWrapper(); setf = NewWrapper();
@ -848,17 +857,21 @@ char *RUBY::validate_const_name(char *name) {
} }
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
* RUBY::declare_const(char *name, char *iname, SwigType *type, char *value) * RUBY::constant()
* *
* Makes a constant. * Makes a constant.
* name = Name of the constant
* iname = Scripting language name of constant
* type = Datatype of the constant
* value = Constant value (as a string)
* --------------------------------------------------------------------- */ * --------------------------------------------------------------------- */
void RUBY::declare_const(char *name, char *iname, SwigType *type, char *value) { void RUBY::constant(DOH *node) {
char *tm; char *tm;
char *name, *iname;
SwigType *type;
char *value;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
type = Getattr(node,"type");
value = GetChar(node,"value");
if (current == CLASS_CONST) if (current == CLASS_CONST)
iname = klass->strip(iname); iname = klass->strip(iname);

View file

@ -21,9 +21,9 @@ class RUBY : public Language {
/* Virtual functions required by the SWIG parser */ /* Virtual functions required by the SWIG parser */
virtual void parse_args(int, char *argv[]); virtual void parse_args(int, char *argv[]);
virtual void parse(); virtual void parse();
virtual void create_function(char *, char *, SwigType *, ParmList *); virtual void function(DOH *node);
virtual void link_variable(char *, char *, SwigType *); virtual void variable(DOH *node);
virtual void declare_const(char *, char *, SwigType *, char *); virtual void constant(DOH *node);
virtual void initialize(void); virtual void initialize(void);
virtual void close(void); virtual void close(void);
virtual void set_module(char *); virtual void set_module(char *);

View file

@ -264,7 +264,10 @@ TCL8::create_command(char *cname, char *iname) {
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void void
TCL8::create_function(char *name, char *iname, SwigType *d, ParmList *l) { TCL8::function(DOH *node) {
char *name, *iname;
SwigType *d;
ParmList *l;
Parm *p; Parm *p;
int pcount,i,j; int pcount,i,j;
char *tm; char *tm;
@ -272,6 +275,11 @@ TCL8::create_function(char *name, char *iname, SwigType *d, ParmList *l) {
String *incode, *cleanup, *outarg, *argstr, *args; String *incode, *cleanup, *outarg, *argstr, *args;
int numopt= 0; int numopt= 0;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
d = Getattr(node,"type");
l = Getattr(node,"parms");
incode = NewString(""); incode = NewString("");
cleanup = NewString(""); cleanup = NewString("");
outarg = NewString(""); outarg = NewString("");
@ -530,14 +538,16 @@ TCL8::create_function(char *name, char *iname, SwigType *d, ParmList *l) {
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* TCL8::link_variable() * TCL8::variable()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
static Hash *setf = 0; static Hash *setf = 0;
static Hash *getf = 0; static Hash *getf = 0;
void void
TCL8::link_variable(char *name, char *iname, SwigType *t) { TCL8::variable(DOH *node) {
char *name, *iname;
SwigType *t;
String *setname; String *setname;
String *getname; String *getname;
@ -547,6 +557,10 @@ TCL8::link_variable(char *name, char *iname, SwigType *t) {
int setable = 1; int setable = 1;
int tc; int tc;
name = GetChar(node,"name");
iname = GetChar(node,"scriptname");
t = Getattr(node,"type");
if (!setf) setf = NewHash(); if (!setf) setf = NewHash();
if (!getf) getf = NewHash(); if (!getf) getf = NewHash();
@ -755,17 +769,26 @@ TCL8::link_variable(char *name, char *iname, SwigType *t) {
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* TCL8::declare_const() * TCL8::constant()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
void void
TCL8::declare_const(char *name, char *, SwigType *type, char *value) { TCL8::constant(DOH *node) {
char *name;
SwigType *type;
char *value;
int OldStatus = Status; int OldStatus = Status;
SwigType *t; SwigType *t;
char var_name[256]; char var_name[256];
char *tm; char *tm;
String *rvalue; String *rvalue;
Status = STAT_READONLY; Status = STAT_READONLY;
DOH *nnode;
name = GetChar(node,"name");
type = Getattr(node,"type");
value = GetChar(node,"value");
nnode = Copy(node);
/* Make a static variable */ /* Make a static variable */
sprintf(var_name,"_wrap_const_%s",name); sprintf(var_name,"_wrap_const_%s",name);
@ -784,7 +807,8 @@ TCL8::declare_const(char *name, char *, SwigType *type, char *value) {
switch(SwigType_type(type)) { switch(SwigType_type(type)) {
case T_BOOL: case T_INT: case T_DOUBLE: case T_BOOL: case T_INT: case T_DOUBLE:
Printf(f_header,"static %s %s = %s;\n", SwigType_str(type,0), var_name, value); Printf(f_header,"static %s %s = %s;\n", SwigType_str(type,0), var_name, value);
link_variable(var_name,name,type); Setattr(nnode,"name",var_name);
variable(nnode);
break; break;
case T_SHORT: case T_SHORT:
@ -801,7 +825,9 @@ TCL8::declare_const(char *name, char *, SwigType *type, char *value) {
sprintf(var_name,"%s_char",var_name); sprintf(var_name,"%s_char",var_name);
t = NewString("char"); t = NewString("char");
SwigType_add_pointer(t); SwigType_add_pointer(t);
link_variable(var_name,name,t); Setattr(nnode,"name",var_name);
Setattr(nnode,"type",t);
variable(nnode);
Delete(t); Delete(t);
break; break;
@ -820,25 +846,31 @@ TCL8::declare_const(char *name, char *, SwigType *type, char *value) {
sprintf(var_name,"%s_char",var_name); sprintf(var_name,"%s_char",var_name);
t = NewSwigType(T_CHAR); t = NewSwigType(T_CHAR);
SwigType_add_pointer(t); SwigType_add_pointer(t);
link_variable(var_name,name,t); Setattr(nnode,"name",var_name);
Setattr(nnode,"type",t);
variable(nnode);
Delete(t); Delete(t);
break; break;
case T_FLOAT: case T_FLOAT:
Printf(f_header,"static %s %s = (%s) (%s);\n", SwigType_lstr(type,0), var_name, SwigType_lstr(type,0), value); Printf(f_header,"static %s %s = (%s) (%s);\n", SwigType_lstr(type,0), var_name, SwigType_lstr(type,0), value);
link_variable(var_name,name,type); Setattr(nnode,"name",var_name);
variable(nnode);
break; break;
case T_CHAR: case T_CHAR:
SwigType_add_pointer(type); SwigType_add_pointer(type);
Printf(f_header,"static %s %s = \"%s\";\n", SwigType_lstr(type,0), var_name, value); Printf(f_header,"static %s %s = \"%s\";\n", SwigType_lstr(type,0), var_name, value);
link_variable(var_name,name,type); Setattr(nnode,"name",var_name);
Setattr(nnode,"type",type);
variable(nnode);
SwigType_del_pointer(type); SwigType_del_pointer(type);
break; break;
case T_STRING: case T_STRING:
Printf(f_header,"static %s %s = \"%s\";\n", SwigType_lstr(type,0), var_name, value); Printf(f_header,"static %s %s = \"%s\";\n", SwigType_lstr(type,0), var_name, value);
link_variable(var_name,name,type); Setattr(nnode,"name",var_name);
variable(nnode);
break; break;
case T_POINTER: case T_ARRAY: case T_REFERENCE: case T_POINTER: case T_ARRAY: case T_REFERENCE:
@ -855,7 +887,9 @@ TCL8::declare_const(char *name, char *, SwigType *type, char *value) {
Printf(f_init,"\t SWIG_MakePtr(%s_char, (void *) %s, SWIGTYPE%s);\n", Printf(f_init,"\t SWIG_MakePtr(%s_char, (void *) %s, SWIGTYPE%s);\n",
var_name, var_name, SwigType_manglestr(type)); var_name, var_name, SwigType_manglestr(type));
sprintf(var_name,"%s_char",var_name); sprintf(var_name,"%s_char",var_name);
link_variable(var_name,name,t); Setattr(nnode,"type",t);
Setattr(nnode,"name",var_name);
variable(nnode);
Delete(t); Delete(t);
break; break;
@ -865,6 +899,7 @@ TCL8::declare_const(char *name, char *, SwigType *type, char *value) {
} }
} }
Delete(rvalue); Delete(rvalue);
Delete(nnode);
Status = OldStatus; Status = OldStatus;
} }

View file

@ -27,9 +27,9 @@ private:
public : public :
virtual void parse_args(int, char *argv[]); virtual void parse_args(int, char *argv[]);
virtual void parse(); virtual void parse();
virtual void create_function(char *, char *, SwigType *, ParmList *); virtual void function(DOH *node);
virtual void link_variable(char *, char *, SwigType *); virtual void variable(DOH *node);
virtual void declare_const(char *, char *, SwigType *, char *); virtual void constant(DOH *node);
virtual void initialize(void); virtual void initialize(void);
virtual void close(void); virtual void close(void);
virtual void set_module(char *); virtual void set_module(char *);

View file

@ -1561,7 +1561,7 @@ void cplus_emit_member_func(char *classname, char *classtype, char *classrename,
/* Nah. Just produce a string that does the work for us */ /* Nah. Just produce a string that does the work for us */
emit_set_action(Swig_cmethod_call(mname, Wrapper_Getparms(w))); emit_set_action(Swig_cmethod_call(mname, Wrapper_Getparms(w)));
} }
lang->create_function(Wrapper_Getname(w), iname, Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w), iname, Wrapper_Gettype(w), Wrapper_Getparms(w));
DelWrapper(w); DelWrapper(w);
} else { } else {
lang->create_command(prev_wrap, iname); lang->create_command(prev_wrap, iname);
@ -1660,15 +1660,15 @@ void cplus_emit_static_func(char *classname, char *, char *classrename,
if (!prev_wrap) { if (!prev_wrap) {
if (!mode) { if (!mode) {
// Not an added method and not objective C, just wrap it // Not an added method and not objective C, just wrap it
lang->create_function(cname,iname, type, l); new_create_function(cname,iname, type, l);
} else { } else {
if (!ccode) { if (!ccode) {
strcpy(cname, Char(Swig_name_member(classname,mname))); strcpy(cname, Char(Swig_name_member(classname,mname)));
lang->create_function(cname,iname, type, l); new_create_function(cname,iname, type, l);
} else { } else {
Wrapper *w = Swig_cfunction_wrapper(cname, type, l, ccode); Wrapper *w = Swig_cfunction_wrapper(cname, type, l, ccode);
Wrapper_print(w,f_wrappers); Wrapper_print(w,f_wrappers);
lang->create_function(cname,iname, Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(cname,iname, Wrapper_Gettype(w), Wrapper_Getparms(w));
DelWrapper(w); DelWrapper(w);
} }
} }
@ -1735,15 +1735,15 @@ void cplus_emit_destructor(char *classname, char *classtype, char *classrename,
} }
if (mode && ccode) { if (mode && ccode) {
Wrapper_print(w,f_wrappers); Wrapper_print(w,f_wrappers);
lang->create_function(Wrapper_Getname(w),iname,Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w),iname,Wrapper_Gettype(w), Wrapper_Getparms(w));
} else if (mode) { } else if (mode) {
lang->create_function(Wrapper_Getname(w),iname,Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w),iname,Wrapper_Gettype(w), Wrapper_Getparms(w));
} else { } else {
if (CPlusPlus) if (CPlusPlus)
emit_set_action(Swig_cppdestructor_call()); emit_set_action(Swig_cppdestructor_call());
else else
emit_set_action(Swig_cdestructor_call()); emit_set_action(Swig_cdestructor_call());
lang->create_function(cname, iname, Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(cname, iname, Wrapper_Gettype(w), Wrapper_Getparms(w));
} }
DelWrapper(w); DelWrapper(w);
} }
@ -1803,7 +1803,7 @@ void cplus_emit_constructor(char *classname, char *classtype, char *classrename,
Wrapper_print(w,f_wrappers); Wrapper_print(w,f_wrappers);
} }
} }
lang->create_function(Wrapper_Getname(w), iname, Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w), iname, Wrapper_Gettype(w), Wrapper_Getparms(w));
DelWrapper(w); DelWrapper(w);
} }
@ -1893,7 +1893,7 @@ void cplus_emit_variable_get(char *classname, char *classtype, char *classrename
} else if (!mode) { } else if (!mode) {
emit_set_action(Swig_cmemberget_call(mname, type)); emit_set_action(Swig_cmemberget_call(mname, type));
} }
lang->create_function(Wrapper_Getname(w),iname, Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w),iname, Wrapper_Gettype(w), Wrapper_Getparms(w));
} else { } else {
// Already wrapped this function. Just patch it up // Already wrapped this function. Just patch it up
lang->create_command(prev_wrap,iname); lang->create_command(prev_wrap,iname);
@ -2002,7 +2002,7 @@ void cplus_emit_variable_set(char *classname, char *classtype, char *classrename
emit_set_action(tm); emit_set_action(tm);
Delete(target); Delete(target);
} }
lang->create_function(Wrapper_Getname(w),iname, Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w),iname, Wrapper_Gettype(w), Wrapper_Getparms(w));
} else { } else {
lang->create_command(prev_wrap,iname); lang->create_command(prev_wrap,iname);
} }

View file

@ -19,6 +19,23 @@ extern "C" {
static char cvsroot[] = "$Header$"; static char cvsroot[] = "$Header$";
/* -----------------------------------------------------------------------------
* new_create_function()
*
* Create a new function
* ----------------------------------------------------------------------------- */
void new_create_function(char *name, char *iname, SwigType *type, ParmList *l) {
Hash *h;
h = NewHash();
Setattr(h,"name",name);
Setattr(h,"scriptname",iname);
Setattr(h,"type",type);
Setattr(h,"parms",l);
lang->function(h);
Delete(h);
}
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* emit_args() * emit_args()
* *
@ -169,7 +186,7 @@ void emit_set_get(char *name, char *iname, SwigType *t) {
Wrapper_print(w,f_header); Wrapper_print(w,f_header);
new_iname = Swig_name_set(iname); new_iname = Swig_name_set(iname);
DohIncref(new_iname); DohIncref(new_iname);
lang->create_function(Wrapper_Getname(w), Char(new_iname), Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w), Char(new_iname), Wrapper_Gettype(w), Wrapper_Getparms(w));
Delete(new_iname); Delete(new_iname);
DelWrapper(w); DelWrapper(w);
} }
@ -178,7 +195,7 @@ void emit_set_get(char *name, char *iname, SwigType *t) {
Wrapper_print(w,f_header); Wrapper_print(w,f_header);
new_iname = Swig_name_get(iname); new_iname = Swig_name_get(iname);
DohIncref(new_iname); DohIncref(new_iname);
lang->create_function(Wrapper_Getname(w), Char(new_iname), Wrapper_Gettype(w), Wrapper_Getparms(w)); new_create_function(Wrapper_Getname(w), Char(new_iname), Wrapper_Gettype(w), Wrapper_Getparms(w));
Delete(new_iname); Delete(new_iname);
DelWrapper(w); DelWrapper(w);
} }

View file

@ -39,4 +39,26 @@ struct TMParm {
#define NI_NAMES 512 #define NI_NAMES 512
// Some functions for emitting some C++ helper code
extern void cplus_emit_member_func(char *classname, char *classtype, char *classrename,
char *mname, char *mrename, SwigType *type, ParmList *l,
int mode);
extern void cplus_emit_static_func(char *classname, char *classtype, char *classrename,
char *mname, char *mrename, SwigType *type, ParmList *l,
int mode);
extern void cplus_emit_destructor(char *classname, char *classtype, char *classrename,
char *name, char *iname, int mode);
extern void cplus_emit_constructor(char *classname, char *classtype, char *classrename,
char *name, char *iname, ParmList *l, int mode);
extern void cplus_emit_variable_get(char *classname, char *classtype, char *classrename,
char *name, char *iname, SwigType *type, int mode);
extern void cplus_emit_variable_set(char *classname, char *classtype, char *classrename,
char *name, char *iname, SwigType *type, int mode);
extern char *cplus_base_class(char *name);

View file

@ -337,8 +337,14 @@ void Language::cpp_declare_const(char *name, char *iname, SwigType *type, char *
} else { } else {
new_value = value; new_value = value;
} }
Hash *n;
lang->declare_const(cname,cname,type, new_value); n = NewHash();
Setattr(n,"name",cname);
Setattr(n,"scriptname",cname);
Setattr(n,"type",type);
Setattr(n,"value",new_value);
lang->constant(n);
Delete(n);
if (!value) { if (!value) {
free(new_value); free(new_value);
@ -384,7 +390,12 @@ void Language::cpp_static_var(char *name, char *iname, SwigType *t) {
/* Link with this variable */ /* Link with this variable */
lang->link_variable(mname,cname,t); Hash *n = NewHash();
Setattr(n,"name",mname);
Setattr(n,"scriptname", cname);
Setattr(n,"type",t);
lang->variable(n);
Delete(n);
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------

View file

@ -274,6 +274,7 @@ static char *make_name(char *name) {
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
void create_function(int ext, char *name, SwigType *t, ParmList *l) { void create_function(int ext, char *name, SwigType *t, ParmList *l) {
DOH *n;
if (Active_static) return; // Static declaration. Ignore if (Active_static) return; // Static declaration. Ignore
init_language(); init_language();
@ -296,8 +297,13 @@ void create_function(int ext, char *name, SwigType *t, ParmList *l) {
emit_extern_func(name, t, l, 1, f_header); emit_extern_func(name, t, l, 1, f_header);
} }
// If this function has been declared inline, produce a function n = NewHash();
lang->create_function(name, iname, t, l); Setattr(n,"name", name);
Setattr(n,"scriptname", iname);
Setattr(n,"type", t);
Setattr(n,"parms", l);
lang->function(n);
Delete(n);
} }
scanner_clear_start(); scanner_clear_start();
} }
@ -328,7 +334,13 @@ void create_variable(int ext, char *name, SwigType *t) {
} }
// Now dump it out // Now dump it out
lang->link_variable(name, iname, t); Hash *n;
n = NewHash();
Setattr(n,"name",name);
Setattr(n,"scriptname", iname);
Setattr(n,"type",t);
lang->variable(n);
Delete(n);
} }
scanner_clear_start(); scanner_clear_start();
} }
@ -362,7 +374,14 @@ void create_constant(char *name, SwigType *type, char *value) {
} else { } else {
if (!WrapExtern) { // Only wrap the constant if not in %extern mode if (!WrapExtern) { // Only wrap the constant if not in %extern mode
String *tval = NewStringf("%(escape)s",value); String *tval = NewStringf("%(escape)s",value);
lang->declare_const(name, name, type, Char(tval)); Hash *n;
n = NewHash();
Setattr(n,"name",name);
Setattr(n,"scriptname",name);
Setattr(n,"type",type);
Setattr(n,"value",tval);
lang->constant(n);
Delete(n);
Delete(tval); Delete(tval);
} }
} }

View file

@ -87,93 +87,15 @@ struct Pragma {
Pragma *next; Pragma *next;
}; };
/************************************************************************ /* Real Language Class */
* class language:
*
* This class defines the functions that need to be supported by the
* scripting language being used. The translator calls these virtual
* functions to output different types of code for different languages.
*
* By implementing this using virtual functions, hopefully it will be
* easy to support different types of scripting languages.
*
* The following functions are used :
*
* parse_args(argc, argv)
* Parse the arguments used by this language.
*
* parse()
* Entry function that starts parsing of a particular language
*
* create_function(fname, iname, rtype, parmlist)
* Creates a function wrappper.
*
* link_variable(vname, iname, type)
* Creates a link to a variable.
*
* declare_const(cname, type, value)
* Creates a constant (for #define).
*
* initialize(char *fn)
* Produces initialization code.
*
* headers()
* Produce code for headers
*
* close()
* Close up files
*
* usage_var(iname,type,string)
* Produces usage string for variable declaration.
*
* usage_func(iname,rttype, parmlist, string)
* Produces usage string for function declaration.
*
* usage_const(iname, type, value, string)
* Produces usage string for constants
*
* set_module(char *modname)
* Sets the name of the module (%module directive)
*
* add_native(char *name, char *funcname);
* Adds a native wrapper function to the initialize process
*
* --- C++ Functions ---
*
* These functions are optional additions to any of the target
* languages. SWIG handles inheritance, symbol tables, and other
* information.
*
* cpp_open_class(char *classname, char *rname)
* Open a new C++ class definition.
* cpp_close_class(char *)
* Close current C++ class
* cpp_member_func(char *name, char *rname, SwigType *rt, ParmList *l)
* Create a C++ member function
* cpp_constructor(char *name, char *iname, ParmList *l)
* Create a C++ constructor.
* cpp_destructor(char *name, char *iname)
* Create a C++ destructor
* cpp_variable(char *name, char *iname, SwigType *t)
* Create a C++ member data item.
* cpp_declare_const(char *name, char *iname, int type, char *value)
* Create a C++ constant.
* cpp_inherit(char *baseclass)
* Inherit data from baseclass.
* cpp_static_func(char *name, char *iname, SwigType *t, ParmList *l)
* A C++ static member function.
* cpp_static_var(char *name, char *iname, SwigType *t)
* A C++ static member data variable.
*
*************************************************************************/
class Language { class Language {
public: public:
virtual void parse_args(int argc, char *argv[]) = 0; virtual void parse_args(int argc, char *argv[]) = 0;
virtual void parse() = 0; virtual void parse() = 0;
virtual void create_function(char *, char *, SwigType *, ParmList *) = 0; virtual void function(DOH *node) = 0;
virtual void link_variable(char *, char *, SwigType *) = 0; virtual void variable(DOH *node) = 0;
virtual void declare_const(char *, char *, SwigType *, char *) = 0; virtual void constant(DOH *node) = 0;
virtual void initialize(void) = 0; virtual void initialize(void) = 0;
virtual void close(void) = 0; virtual void close(void) = 0;
virtual void set_module(char *mod_name) = 0; virtual void set_module(char *mod_name) = 0;
@ -215,36 +137,13 @@ public:
/* Emit functions */ /* Emit functions */
extern void new_create_function(char *, char *, SwigType *, ParmList *);
extern void emit_func_call(char *, SwigType *, ParmList *, FILE *); extern void emit_func_call(char *, SwigType *, ParmList *, FILE *);
extern void emit_set_get(char *, char *, SwigType *); extern void emit_set_get(char *, char *, SwigType *);
extern void emit_set_action(DOHString_or_char *decl); extern void emit_set_action(DOHString_or_char *decl);
extern int SWIG_main(int, char **, Language *); extern int SWIG_main(int, char **, Language *);
// Some functions for emitting some C++ helper code
extern void cplus_emit_member_func(char *classname, char *classtype, char *classrename,
char *mname, char *mrename, SwigType *type, ParmList *l,
int mode);
extern void cplus_emit_static_func(char *classname, char *classtype, char *classrename,
char *mname, char *mrename, SwigType *type, ParmList *l,
int mode);
extern void cplus_emit_destructor(char *classname, char *classtype, char *classrename,
char *name, char *iname, int mode);
extern void cplus_emit_constructor(char *classname, char *classtype, char *classrename,
char *name, char *iname, ParmList *l, int mode);
extern void cplus_emit_variable_get(char *classname, char *classtype, char *classrename,
char *name, char *iname, SwigType *type, int mode);
extern void cplus_emit_variable_set(char *classname, char *classtype, char *classrename,
char *name, char *iname, SwigType *type, int mode);
extern char *cplus_base_class(char *name);
/* These are in the new core */ /* These are in the new core */
extern "C" { extern "C" {

View file

@ -415,6 +415,7 @@ extern void Swig_except_clear();
#define Getvalue(x) Getattr(x,"value") #define Getvalue(x) Getattr(x,"value")
#define Getlname(x) Getattr(x,"lname") #define Getlname(x) Getattr(x,"lname")
#define Getignore(x) GetInt(x,"ignore") #define Getignore(x) GetInt(x,"ignore")
#define Getparms(x) Getattr(x,"parms")
#define Settype(x,v) Setattr(x,"type",x) #define Settype(x,v) Setattr(x,"type",x)
#define Setname(x,v) Setattr(x,"name",v) #define Setname(x,v) Setattr(x,"name",v)