diff --git a/SWIG/Source/DOH/Doh/Makefile b/SWIG/Source/DOH/Doh/Makefile index bdbe7e5b5..644b300e4 100644 --- a/SWIG/Source/DOH/Doh/Makefile +++ b/SWIG/Source/DOH/Doh/Makefile @@ -9,7 +9,7 @@ # Set your C++ compiler here. g++ works on most machines, # but you might have to change it depending on your installation. # -CC = gcc -g -Wall -DDOH_STRING_UPDATE_LINES -O2 +CC = cc prefix = /usr/local # Comment out the following line if you're on an SGI or don't have ranlib! @@ -20,9 +20,9 @@ AR = ar # Normally, you shouldn't have to change anything below this point # ######################################################################## -LIBOBJS = void.o fio.o memory.o base.o file.o list.o hash.o string.o +LIBOBJS = callable.o void.o fio.o memory.o base.o file.o list.o hash.o string.o -LIBSRCS = void.c fio.c memory.c base.c file.c list.c hash.c string.c +LIBSRCS = callable.c void.c fio.c memory.c base.c file.c list.c hash.c string.c LIBHEADERS = ../Include/doh.h LIB = ../libdoh.a diff --git a/SWIG/Source/DOH/Doh/Makefile.in b/SWIG/Source/DOH/Doh/Makefile.in index 3a66b4344..283cb18bd 100644 --- a/SWIG/Source/DOH/Doh/Makefile.in +++ b/SWIG/Source/DOH/Doh/Makefile.in @@ -19,9 +19,9 @@ AR = @AR@ # Normally, you shouldn't have to change anything below this point # ######################################################################## -LIBOBJS = void.o fio.o memory.o base.o file.o list.o hash.o string.o +LIBOBJS = callable.o void.o fio.o memory.o base.o file.o list.o hash.o string.o -LIBSRCS = void.c fio.c memory.c base.c file.c list.c hash.c string.c +LIBSRCS = callable.c void.c fio.c memory.c base.c file.c list.c hash.c string.c LIBHEADERS = ../Include/doh.h LIB = ../libdoh.a diff --git a/SWIG/Source/DOH/Doh/base.c b/SWIG/Source/DOH/Doh/base.c index 57da08ff3..8dc286e35 100644 --- a/SWIG/Source/DOH/Doh/base.c +++ b/SWIG/Source/DOH/Doh/base.c @@ -91,33 +91,6 @@ static DOH *find_internal(DOH *co) { c = (char *) co; n = NewString(c); return n; - - if (doh_debug_level) { - DohError(DOH_CONVERSION,"Unknown object '%s' being treated as 'char *'.\n", c); - } - r = root; - s = 0; - while (r) { - s = r; - /* printf("checking %s\n", r->cstr); */ - d = strcmp(r->cstr,c); - if (d == 0) return r->sstr; - if (d < 0) r = r->left; - else r = r->right; - } - r = (StringNode *) DohMalloc(sizeof(StringNode)); - r->cstr = (char *) DohMalloc(strlen(c)+1); - strcpy(r->cstr,c); - r->sstr = NewString(c); - Incref(r->sstr); - r->left = 0; - r->right = 0; - if (!s) { root = r; } - else { - if (d < 0) s->left = r; - else s->right = r; - } - return r->sstr; } /* Destroy an object */ @@ -844,6 +817,21 @@ int DohReplace(DOH *src, DOH *token, DOH *rep, int flags) { return 0; } +/* ----------------------------------------------------------------------------- + * Callable methods + * ----------------------------------------------------------------------------- */ + +DOH *DohCall(DOH *obj, DOH *args) { + DohBase *b = (DohBase *) obj; + DohError(DOH_CALLS,"DohCall %x\n",obj); + if (DohCheck(b)) { + if ((b->objinfo->doh_callable) && (b->objinfo->doh_callable->doh_call)) { + return (b->objinfo->doh_callable->doh_call)(b,args); + } + } + return 0; +} + void DohInit(DOH *b) { DohBase *bs = (DohBase *) b; bs->refcount = 1; diff --git a/SWIG/Source/DOH/Doh/callable.c b/SWIG/Source/DOH/Doh/callable.c new file mode 100644 index 000000000..94af33671 --- /dev/null +++ b/SWIG/Source/DOH/Doh/callable.c @@ -0,0 +1,86 @@ +/**************************************************************************** + * DOH (Dynamic Object Hack) + * + * 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 "dohint.h" + +/* ----------------------------------------------------------------------------- + * callable.c + * + * Callable object. + * ----------------------------------------------------------------------------- */ + +typedef struct { + DOHCOMMON; + DOH *(*func)(DOH *, DOH *); +} CallableObj; + +void Callable_delete(DOH *); +DOH *Callable_copy(DOH *); +DOH *Callable_call(DOH *, DOH *); + +static DohCallableMethods doh_callable_methods = { + Callable_call +}; + +static DohObjInfo DohCallableType = { + "CallableObj", /* objname */ + sizeof(CallableObj), /* objsize */ + Callable_delete, /* doh_del */ + Callable_copy, /* doh_copy */ + 0, /* doh_clear */ + 0, /* doh_scope */ + 0, /* doh_str */ + 0, /* doh_data */ + 0, /* doh_dump */ + 0, /* doh_load */ + 0, /* doh_len */ + 0, /* doh_hash */ + 0, /* doh_cmp */ + 0, /* doh_mapping */ + 0, /* doh_sequence */ + 0, /* doh_file */ + 0, /* doh_string */ + &doh_callable_methods, /* doh_callable */ + 0, /* reserved4 */ + 0, /* reserved5 */ + 0, /* reserved6 */ + 0, /* user1 */ + 0, /* user2 */ + 0, /* user3 */ + 0, /* user4 */ +}; + +DOH *NewCallable(DOH *(*func)(DOH *, DOH *)) { + CallableObj *c; + c = (CallableObj *) DohObjMalloc(sizeof(CallableObj)); + c->objinfo = &DohCallableType; + c->func = func; + return (DOH *) c; +} + +void Callable_delete(DOH *co) { + DohObjFree(co); +} + +DOH *Callable_copy(DOH *co) { + CallableObj *c = (CallableObj *) co; + return NewCallable(c->func); +} + +DOH *Callable_call(DOH *co, DOH *args) { + CallableObj *c = (CallableObj *) co; + return (*c->func)(c,args); +} + diff --git a/SWIG/Source/DOH/Include/doh.h b/SWIG/Source/DOH/Include/doh.h index 95d821c49..e92537e7d 100644 --- a/SWIG/Source/DOH/Include/doh.h +++ b/SWIG/Source/DOH/Include/doh.h @@ -84,7 +84,7 @@ typedef struct { /* Callable */ typedef struct { - DOH (*doh_call)(DOH *obj, DOH *args); /* Callable */ + DOH *(*doh_call)(DOH *obj, DOH *args); /* Callable */ } DohCallableMethods; @@ -200,12 +200,11 @@ extern int DohUngetc(int ch, DOH *obj); extern void DohEncoding(char *name, DOH *(*fn)(DOH *s)); extern int DohPrintf(DOH *obj, char *format, ...); extern int DohvPrintf(DOH *obj, char *format, va_list ap); -/* extern int DohScanf(DOH *obj, char *format, ...); - extern int DohvScanf(DOH *obj, char *format, va_list ap); */ - extern int DohReplace(DOH *src, DOH *token, DOH *rep, int flags); extern DOH *DohReadline(DOH *in); +extern DOH *DohCall(DOH *obj, DOH *args); + #ifndef DOH_LONG_NAMES /* Macros to invoke the above functions. Includes the location of the caller to simplify debugging if something goes wrong */ @@ -258,7 +257,7 @@ extern DOH *DohReadline(DOH *in); #define Replace DohReplace #define NewScope DohNewScope #define DelScope DohDelScope - +#define Call DohCall #endif /* -----------------------------------------------------------------------------