diff --git a/Source/Modules1.1/.cvsignore b/Source/Modules1.1/.cvsignore deleted file mode 100644 index bd5fe0696..000000000 --- a/Source/Modules1.1/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile -.deps diff --git a/Source/Modules1.1/Makefile.in b/Source/Modules1.1/Makefile.in deleted file mode 100644 index bfa308a2f..000000000 --- a/Source/Modules1.1/Makefile.in +++ /dev/null @@ -1,41 +0,0 @@ -####################################################################### -# $Header$ -####################################################################### - -srcdir = @srcdir@ -VPATH = @srcdir@ - -SHELL = /bin/sh -CXX = @CXX@ -CFLAGS = @CFLAGS@ @SWILL@ -YACC = @YACC@ -AR = @AR@ -RANLIB = @RANLIB@ - -TARGET = libmodules11.a -OBJS = main.@OBJEXT@ module.@OBJEXT@ emit.@OBJEXT@ overload.@OBJEXT@ lang.@OBJEXT@ typepass.@OBJEXT@ allocate.@OBJEXT@ browser.@OBJEXT@ contract.@OBJEXT@ swigmain.@OBJEXT@ tcl8.@OBJEXT@ python.@OBJEXT@ perl5.@OBJEXT@ guile.@OBJEXT@ ruby.@OBJEXT@ mzscheme.@OBJEXT@ java.@OBJEXT@ php4.@OBJEXT@ ocaml.@OBJEXT@ xml.@OBJEXT@ pike.@OBJEXT@ s-exp.@OBJEXT@ -SRCS = main.cxx module.cxx emit.cxx overload.cxx lang.cxx typepass.cxx allocate.cxx browser.cxx contract.cxx swigmain.cxx tcl8.cxx python.cxx perl5.cxx guile.cxx ruby.cxx mzscheme.cxx java.cxx php4.cxx ocaml.cxx xml.cxx pike.cxx s-exp.cxx - -INCLUDES = -I$(srcdir)/../Include \ - -I$(srcdir)/../DOH/Include \ - -I$(srcdir)/../Preprocessor \ - -I$(srcdir)/../Swig \ - -I../Include - -# Rules for creation of a .@OBJEXT@ file from .cxx -.SUFFIXES: .cxx -.cxx.@OBJEXT@: - $(CXX) $(INCLUDES) $(CFLAGS) -c -o $*.@OBJEXT@ $< - - -swig: $(TARGET) - -$(TARGET): $(OBJS) - $(AR) cr $(TARGET) $(OBJS) - $(RANLIB) $(TARGET) - -clean:: - rm -f *.@OBJEXT@ *~ $(TARGET) - -nuke:: - rm -f Makefile *~ diff --git a/Source/Modules1.1/README b/Source/Modules1.1/README deleted file mode 100644 index 058779d22..000000000 --- a/Source/Modules1.1/README +++ /dev/null @@ -1,9 +0,0 @@ -06/25/2002 - -This directory contains all of the SWIG language modules. Many of these -modules contain code that dates back to SWIG1.0. The module API has changed -a lot in the development releases so this is fairly messy. We're working on -cleaning it up, but you'll have to bear with us until it's done. - --- Dave - diff --git a/Source/Modules1.1/allocate.cxx b/Source/Modules1.1/allocate.cxx deleted file mode 100644 index 4d7db5fae..000000000 --- a/Source/Modules1.1/allocate.cxx +++ /dev/null @@ -1,453 +0,0 @@ -/* ----------------------------------------------------------------------------- - * allocate.cxx - * - * This module tries to figure out which classes and structures support - * default constructors and destructors in C++. There are several rules that - * define this behavior including pure abstract methods, private sections, - * and non-default constructors in base classes. See the ARM or - * Doc/Manual/SWIGPlus.html for details. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1998-2002. The University of Chicago - * Copyright (C) 1995-1998. The University of Utah and The Regents of the - * University of California. - * - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_allocate_cxx[] = "$Header$"; - -#include "swigmod.h" - -class Allocate : public Dispatcher { - Node *inclass; - enum AccessMode { PUBLIC, PRIVATE, PROTECTED }; - AccessMode cplus_mode; - int extendmode; - - /* Checks to see if a class is abstract through inheritance */ - int is_abstract_inherit(Node *n, Node *base = 0, int first = 0) { - if (!first && (base == n)) return 0; - if (!base) { - /* Root node */ - Symtab *stab = Getattr(n,"symtab"); /* Get symbol table for node */ - Symtab *oldtab = Swig_symbol_setscope(stab); - int ret = is_abstract_inherit(n,n,1); - Swig_symbol_setscope(oldtab); - return ret; - } - List *abstract = Getattr(base,"abstract"); - if (abstract) { - for (int i = 0; i < Len(abstract); i++) { - Node *nn = Getitem(abstract,i); - String *name = Getattr(nn,"name"); - String *base_decl = Getattr(nn,"decl"); - if (Strstr(name,"~")) continue; /* Don't care about destructors */ - int implemented = 0; - Node *dn = Swig_symbol_clookup(name,0); - if (!dn) { - Printf(stdout,"node: %x '%s'. base: %x '%s'. member '%s'\n", n, Getattr(n,"name"), base, Getattr(base,"name"), name); - } - assert(dn); // Assertion of doom - while (dn && !implemented) { - String *local_decl = Getattr(dn,"decl"); - if (local_decl && !Strcmp(local_decl, base_decl)) { - if (Getattr(dn,"abstract")) return 1; - implemented++; - } - dn = Getattr(dn,"csym:nextSibling"); - } - if (!implemented && (Getattr(nn,"abstract"))) { - return 1; - } - /* - if (dn && (Getattr(dn,"abstract"))) { - return 1; - } - */ - } - } - List *bases = Getattr(base,"bases"); - if (!bases) return 0; - for (int i = 0; i < Len(bases); i++) { - if (is_abstract_inherit(n,Getitem(bases,i))) { - return 1; - } - } - return 0; - } - - - /* Grab methods used by smart pointers */ - - List *smart_pointer_methods(Node *cls, List *methods) { - if (!methods) { - methods = NewList(); - } - - Node *c = firstChild(cls); - String *kind = Getattr(cls,"kind"); - int mode; - if (Strcmp(kind,"class") == 0) mode = PRIVATE; - else mode = PUBLIC; - - while (c) { - if (Getattr(c,"error") || Getattr(c,"feature:ignore")) { - c = nextSibling(c); - continue; - } - if (Strcmp(nodeType(c),"cdecl") == 0) { - if (!Getattr(c,"feature:ignore")) { - String *storage = Getattr(c,"storage"); - if (!((Cmp(storage,"static") == 0) || (Cmp(storage,"typedef") == 0))) { - String *name = Getattr(c,"name"); - String *symname = Getattr(c,"sym:name"); - Node *e = Swig_symbol_clookup_local(name,0); - if (e && !Getattr(e,"feature:ignore") && (Cmp(symname, Getattr(e,"sym:name")) == 0)) { - Swig_warning(WARN_LANG_DEREF_SHADOW,Getfile(e),Getline(e),"Declaration of '%s' shadows declaration accessible via operator->() at %s:%d\n", - name, Getfile(c),Getline(c)); - } else { - /* Make sure node with same name doesn't already exist */ - int k; - int match = 0; - for (k = 0; k < Len(methods); k++) { - e = Getitem(methods,k); - if (Cmp(symname,Getattr(e,"sym:name")) == 0) { - match = 1; - break; - } - if ((!symname || (!Getattr(e,"sym:name"))) && (Cmp(name,Getattr(e,"name")) == 0)) { - match = 1; - break; - } - } - if (!match) { - Node *cc = c; - while (cc) { - Append(methods,cc); - cc = Getattr(cc,"sym:nextSibling"); - } - } - } - } - } - } - - if (Strcmp(nodeType(c),"access") == 0) { - kind = Getattr(c,"kind"); - if (Strcmp(kind,"public") == 0) mode = PUBLIC; - else mode = PRIVATE; - } - c = nextSibling(c); - } - /* Look for methods in base classes */ - { - Node *bases = Getattr(cls,"bases"); - int k; - for (k = 0; k < Len(bases); k++) { - smart_pointer_methods(Getitem(bases,k),methods); - } - } - /* Remove protected/private members */ - { - for (int i = 0; i < Len(methods); ) { - Node *n = Getitem(methods,i); - if (checkAttribute(n,"access","protected") || checkAttribute(n,"access","private")) { - Delitem(methods,i); - continue; - } - i++; - } - } - return methods; - } - - void mark_exception_classes(ParmList *p) { - while(p) { - SwigType *ty = Getattr(p,"type"); - SwigType *t = SwigType_typedef_resolve_all(ty); - Node *c = Swig_symbol_clookup(t,0); - if (c) { - Setattr(c,"cplus:exceptionclass","1"); - } - p = nextSibling(p); - } - } - -public: - virtual int top(Node *n) { - cplus_mode = PUBLIC; - inclass = 0; - extendmode = 0; - emit_children(n); - return SWIG_OK; - } - - virtual int importDirective(Node *n) { return emit_children(n); } - virtual int includeDirective(Node *n) { return emit_children(n); } - virtual int externDeclaration(Node *n) { return emit_children(n); } - virtual int namespaceDeclaration(Node *n) { return emit_children(n); } - virtual int extendDirective(Node *n) { - extendmode = 1; - emit_children(n); - extendmode = 0; - return SWIG_OK; - } - - virtual int classDeclaration(Node *n) { - Symtab *symtab = Swig_symbol_current(); - Swig_symbol_setscope(Getattr(n,"symtab")); - - if (!CPlusPlus) { - /* Always have default constructors/destructors in C */ - Setattr(n,"allocate:default_constructor","1"); - Setattr(n,"allocate:default_destructor","1"); - } - - if (Getattr(n,"allocate:visit")) return SWIG_OK; - Setattr(n,"allocate:visit","1"); - - /* Always visit base classes first */ - { - List *bases = Getattr(n,"bases"); - if (bases) { - for (int i = 0; i < Len(bases); i++) { - Node *b = Getitem(bases,i); - classDeclaration(b); - } - } - } - - inclass = n; - String *kind = Getattr(n,"kind"); - if (Strcmp(kind,"class") == 0) { - cplus_mode = PRIVATE; - } else { - cplus_mode = PUBLIC; - } - - emit_children(n); - - /* Check if the class is abstract via inheritance. This might occur if a class didn't have - any pure virtual methods of its own, but it didn't implement all of the pure methods in - a base class */ - - if (is_abstract_inherit(n)) { - if ((!Getattr(n,"abstract")) && ((Getattr(n,"allocate:public_constructor") || (!Getattr(n,"feature:nodefault") && !Getattr(n,"allocate:has_constructor"))))) { - if (!Getattr(n,"feature:notabstract")) { - Swig_warning(WARN_TYPE_ABSTRACT,Getfile(n),Getline(n),"Class '%s' might be abstract. No constructors generated. \n", SwigType_namestr(Getattr(n,"name"))); - Setattr(n,"abstract",NewList()); - } - } - } - - if (!Getattr(n,"allocate:has_constructor")) { - /* No constructor is defined. We need to check a few things */ - /* If class is abstract. No default constructor. Sorry */ - if (Getattr(n,"abstract")) { - Delattr(n,"allocate:default_constructor"); - } - if (!Getattr(n,"allocate:default_constructor")) { - /* Check base classes */ - List *bases = Getattr(n,"bases"); - int allows_default = 1; - - for (int i = 0; i < Len(bases); i++) { - Node *n = Getitem(bases,i); - /* If base class does not allow default constructor, we don't allow it either */ - if (!Getattr(n,"allocate:default_constructor") && (!Getattr(n,"allocate:default_base_constructor"))) { - allows_default = 0; - } - } - if (allows_default) { - Setattr(n,"allocate:default_constructor","1"); - } - } - } - if (!Getattr(n,"allocate:has_destructor")) { - /* No destructor was defined. We need to check a few things here too */ - List *bases = Getattr(n,"bases"); - int allows_destruct = 1; - - for (int i = 0; i < Len(bases); i++) { - Node *n = Getitem(bases,i); - /* If base class does not allow default destructor, we don't allow it either */ - if (!Getattr(n,"allocate:default_destructor") && (!Getattr(n,"allocate:default_base_destructor"))) { - allows_destruct = 0; - } - } - if (allows_destruct) { - Setattr(n,"allocate:default_destructor","1"); - } - } - - - /* Check if base classes allow smart pointers, but might be hidden */ - if (!Getattr(n,"allocate:smartpointer")) { - Node *sp = Swig_symbol_clookup((char*)"operator ->",0); - if (sp) { - /* Look for parent */ - Node *p = parentNode(sp); - if (Strcmp(nodeType(p),"extend") == 0) { - p = parentNode(p); - } - if (Strcmp(nodeType(p),"class") == 0) { - if (Getattr(p,"feature:ignore")) { - Setattr(n,"allocate:smartpointer",Getattr(p,"allocate:smartpointer")); - } - } - } - } - - /* Only care about default behavior. Remove temporary values */ - Setattr(n,"allocate:visit","1"); - inclass = 0; - Swig_symbol_setscope(symtab); - return SWIG_OK; - } - - virtual int accessDeclaration(Node *n) { - String *kind = Getattr(n,"kind"); - if (Cmp(kind,"public") == 0) { - cplus_mode = PUBLIC; - } else if (Cmp(kind,"private") == 0) { - cplus_mode = PRIVATE; - } else if (Cmp(kind,"protected") == 0) { - cplus_mode = PROTECTED; - } - return SWIG_OK; - } - - virtual int cDeclaration(Node *n) { - - mark_exception_classes(Getattr(n,"throws")); - - if (inclass) { - String *name = Getattr(n,"name"); - if (cplus_mode != PUBLIC) { - /* Look for a private assignment operator */ - if (Strcmp(name,"operator =") == 0) { - Setattr(inclass,"allocate:noassign","1"); - } - } else { - /* Look for smart pointer operator */ - if ((Strcmp(name,"operator ->") == 0) && (!Getattr(n,"feature:ignore"))) { - /* Look for version with no parameters */ - Node *sn = n; - while (sn) { - if (!Getattr(sn,"parms")) { - SwigType *type = SwigType_typedef_resolve_all(Getattr(sn,"type")); - SwigType_push(type,Getattr(sn,"decl")); - Delete(SwigType_pop_function(type)); - SwigType *base = SwigType_base(type); - Node *sc = Swig_symbol_clookup(base, 0); - if ((sc) && (Strcmp(nodeType(sc),"class") == 0)) { - if (SwigType_check_decl(type,"p.")) { - List *methods = smart_pointer_methods(sc,0); - Setattr(inclass,"allocate:smartpointer",methods); - break; - } else { - /* Hmmm. The return value is not a pointer. If the type is a value - or reference. We're going to chase it to see if another operator->() - can be found */ - - if ((SwigType_check_decl(type,"")) || (SwigType_check_decl(type,"r."))) { - Node *nn = Swig_symbol_clookup((char*)"operator ->", Getattr(sc,"symtab")); - if (nn) { - sn = nn; - continue; - } else { - break; - } - } else { - break; - } - } - } else { - break; - } - } else { - break; - } - } - } - } - } - return SWIG_OK; - } - - virtual int constructorDeclaration(Node *n) { - if (!inclass) return SWIG_OK; - Parm *parms = Getattr(n,"parms"); - - mark_exception_classes(Getattr(n,"throws")); - if (!extendmode) { - if (!ParmList_numrequired(parms)) { - /* Class does define a default constructor */ - /* However, we had better see where it is defined */ - if (cplus_mode == PUBLIC) { - Setattr(inclass,"allocate:default_constructor","1"); - } else if (cplus_mode == PROTECTED) { - Setattr(inclass,"allocate:default_base_constructor","1"); - } - } - /* Class defines some kind of constructor. May or may not be public */ - Setattr(inclass,"allocate:has_constructor","1"); - if (cplus_mode == PUBLIC) { - Setattr(inclass,"allocate:public_constructor","1"); - } - } - - /* See if this is a copy constructor */ - if (parms && (ParmList_numrequired(parms) == 1)) { - /* Look for a few cases. X(const X &), X(X &), X(X *) */ - - String *cc = NewStringf("r.q(const).%s", Getattr(inclass,"name")); - if (Strcmp(cc,Getattr(parms,"type")) == 0) { - Setattr(n,"copy_constructor","1"); - } - Delete(cc); - cc = NewStringf("r.%s", Getattr(inclass,"name")); - if (Strcmp(cc,Getattr(parms,"type")) == 0) { - Setattr(n,"copy_constructor","1"); - } - Delete(cc); - cc = NewStringf("p.%s", Getattr(inclass,"name")); - String *ty = SwigType_strip_qualifiers(Getattr(parms,"type")); - if (Strcmp(cc,ty) == 0) { - Setattr(n,"copy_constructor","1"); - } - Delete(cc); - Delete(ty); - } - return SWIG_OK; - } - - virtual int destructorDeclaration(Node *n) { - if (!inclass) return SWIG_OK; - if (!extendmode) { - Setattr(inclass,"allocate:has_destructor","1"); - if (cplus_mode == PUBLIC) { - Setattr(inclass,"allocate:default_destructor","1"); - } else if (cplus_mode == PROTECTED) { - Setattr(inclass,"allocate:default_base_destructor","1"); - } - } - return SWIG_OK; - } -}; - -void Swig_default_allocators(Node *n) { - if (!n) return; - Allocate *a = new Allocate; - a->top(n); - delete a; -} - - - - - - - diff --git a/Source/Modules1.1/browser.cxx b/Source/Modules1.1/browser.cxx deleted file mode 100644 index da90a81b8..000000000 --- a/Source/Modules1.1/browser.cxx +++ /dev/null @@ -1,415 +0,0 @@ -/* ----------------------------------------------------------------------------- - * browser.cxx - * - * A web-base parse tree browser using SWILL. This is an optional - * feature that's normally disabled. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 2002. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_browser_cxx[] = "$Header$"; - -#include "swigmod.h" - -#ifdef SWIG_SWILL -extern "C" { -#include "swill.h" -} - -static FILE *out = 0; -static Node *view_top = 0; - -class Browser : public Dispatcher { - void show_checkbox(Node *t, Node *n) { - int v = 0; - if (Getmeta(n,"visible")) { - v = 1; - } - if (v) { - Printf(out,"[-] ", n, t, n,n); - } else { - Printf(out,"[+] ", n, t, n,n); - } - } - void show_attributes(Node *obj) { - if (!Getmeta(obj,"visible")) return; - String *os = NewString(""); - String *k; - k = Firstkey(obj); - while (k) { - if ((Cmp(k,"nodeType") == 0) || (Cmp(k,"firstChild") == 0) || (Cmp(k,"lastChild") == 0) || - (Cmp(k,"parentNode") == 0) || (Cmp(k,"nextSibling") == 0) || - (Cmp(k,"previousSibling") == 0) || (*(Char(k)) == '$')) { - /* Do nothing */ - } else if (Cmp(k,"parms") == 0) { - String *o = NewString(""); - Printf(o,"%s", ParmList_protostr(Getattr(obj,k))); - Replaceall(o,"&","&"); - Replaceall(o,"<","<"); - Replaceall(o,">",">"); - Printf(os,"? %-12s - %s\n", Getattr(obj,k), k, o); - Delete(o); - } else { - DOH *o; - char *trunc = ""; - if (DohIsString(Getattr(obj,k))) { - o = Str(Getattr(obj,k)); - if (Len(o) > 70) { - trunc = "..."; - } - Replaceall(o,"&","&"); - Replaceall(o,"<","<"); - Printf(os,"? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj,k), k, o, trunc); - Delete(o); - } else { - Printf(os,"? %-12s - 0x%x\n", Getattr(obj,k), k, Getattr(obj,k)); - } - } - k = Nextkey(obj); - } - Printf(out,"
\n%s
\n", Char(os)); - Delete(os); - } - -public: - virtual int emit_one(Node *n) { - char *tag = Char(nodeType(n)); - char *file = Char(Getfile(n)); - int line = Getline(n); - char *name = GetChar(n,"name"); - - show_checkbox(view_top, n); - Printf(out,"%s", n, tag); - if (name) { - Printf(out," (%s)", name); - } - Printf(out,". %s:%d\n", file, line); - Printf(out,"
"); - Dispatcher::emit_one(n); - return SWIG_OK; - } - virtual int emit_children(Node *n) { - if (Getmeta(n,"visible")) { - Printf(out,"
\n"); - Dispatcher::emit_children(n); - Printf(out,"
\n"); - } - return SWIG_OK; - } - virtual int defaultHandler(Node *n) { - show_attributes(n); - return SWIG_OK; - } - virtual int top(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - virtual int includeDirective(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - virtual int importDirective(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - - virtual int extendDirective(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - virtual int classDeclaration(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - - virtual int templateDeclaration(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - - virtual int enumDeclaration(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - virtual int typemapDirective(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - virtual int namespaceDeclaration(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - virtual int usingDeclaration(Node *n) { - show_attributes(n); - emit_children(n); - return SWIG_OK; - } - -}; - -static int browser_exit = 0; -static Node *tree_top = 0; -static Browser *browse = 0; - -/* ---------------------------------------------------------------------- - * exit_handler() - Force the browser to exit - * ---------------------------------------------------------------------- */ - -void exit_handler(FILE *f) { - browser_exit = 1; - Printf(f,"Terminated.\n"); -} - -/* ---------------------------------------------------------------------- - * node_handler() - Generate information about a specific node - * ---------------------------------------------------------------------- */ - -static void display(FILE *f, Node *n) { - /* Print standard HTML header */ - - Printf(f,"SWIG-%s\n", SWIG_VERSION); - Printf(f,"SWIG-%s
\n", SWIG_VERSION); - Printf(f,"[ Exit ]"); - Printf(f," [ Top ]", tree_top); - if (n != tree_top) { - Printf(f," [ Up ]", parentNode(n)); - } - Printf(f," [ Symbols ]"); - Printf(f,"

\n"); - - out = f; - - browse->emit_one(n); - - /* Print standard footer */ - Printf(f,"


\n"); - -} - -void node_handler(FILE *f) { - Node *n = 0; - if (!swill_getargs("p(node)", &n)) { - n = tree_top; - } - view_top = n; - display(f,n); -} - - -/* ---------------------------------------------------------------------- - * hide_handler() - Hide a node - * ---------------------------------------------------------------------- */ - -void hide_handler(FILE *f) { - Node *n = 0; - if (!swill_getargs("p(hn)", &n)) { - n = 0; - } - if (n) { - Delmeta(n,"visible"); - } - node_handler(f); -} - -void show_handler(FILE *f) { - Node *n = 0; - if (!swill_getargs("p(hn)", &n)) { - n = 0; - } - if (n) { - Setmeta(n,"visible","1"); - } - node_handler(f); -} - -void raw_data(FILE *out, Node *obj) { - if (!obj) return; - if (DohIsMapping(obj)) { - String *k; - String *os = NewString(""); - Printf(os,"Hash {\n"); - k = Firstkey(obj); - while (k) { - DOH *o; - const char *trunc = ""; - if (DohIsString(Getattr(obj,k))) { - o = Str(Getattr(obj,k)); - if (Len(o) > 70) { - trunc = "..."; - } - Replaceall(o,"<","<"); - Printf(os," ? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj,k), k, o, trunc); - Delete(o); - } else { - Printf(os," ? %-12s - 0x%x\n", Getattr(obj,k), k, Getattr(obj,k)); - } - k = Nextkey(obj); - } - Printf(os,"}\n"); - Printf(out,"
\n%s
\n", Char(os)); - Delete(os); - } else if (DohIsString(obj)) { - String *o = Str(obj); - Replaceall(o,"<","<"); - Printf(out,"
\n%s
\n", Char(o)); - Delete(o); - } else if (DohIsSequence(obj)) { - int i; - String *os = NewString(""); - Printf(os,"List [\n"); - for (i = 0; i < Len(obj); i++) { - DOH *o = Getitem(obj,i); - const char *trunc = ""; - if (DohIsString(o)) { - String *s = Str(o); - if (Len(s) > 70) { - trunc = "..."; - } - Replaceall(o,"<","<"); - Printf(os," ? [%d] - \"%(escape)-0.70s%s\"\n", o,i,s, trunc); - Delete(s); - } else { - Printf(os," ? [%d] - 0x%x\n", o, i, o); - } - } - Printf(os,"\n]\n"); - Printf(out,"
\n%s
\n", Char(os)); - Delete(os); - } -} - -void data_handler(FILE *f) { - DOH *n = 0; - if (!swill_getargs("p(n)", &n)) { - n = 0; - } - Printf(f,"SWIG-%s\n", SWIG_VERSION); - Printf(f,"SWIG-%s
\n", SWIG_VERSION); - Printf(f,"[ Exit ]"); - Printf(f," [ Top ]", tree_top); - Printf(f,"

\n"); - if (n) { - raw_data(f,n); - } - /* Print standard footer */ - Printf(f,"


\n"); -} - -void symbol_handler(FILE *f) { - Symtab *sym; - char *name = 0; - - Printf(f,"SWIG-%s\n", SWIG_VERSION); - Printf(f,"SWIG-%s
\n", SWIG_VERSION); - Printf(f,"[ Exit ]"); - Printf(f," [ Top ]", tree_top); - Printf(f," [ Symbols ]"); - Printf(f,"

\n"); - - if (!swill_getargs("p(sym)|s(name)", &sym, &name)) { - sym = Swig_symbol_getscope(""); - name = 0; - } - if (!sym) { - Printf(f,"No symbol table specified!\n"); - return; - } - { - String *q = Swig_symbol_qualifiedscopename(sym); - if (!Len(q)) { - Printf(f,"Symbol table: :: (global)
\n"); - } else { - Printf(f,"Symbol table: %s
\n", q); - } - Delete(q); - } - - fprintf(f,"

\n"); - fprintf(f,"Symbol lookup:
\n"); - fprintf(f,"\n", sym); - fprintf(f,"Submit : \n"); - fprintf(f,"
"); - - if (name) { - Node *n = Swig_symbol_clookup(name,sym); - Printf(f,"Symbol '%s':\n", name); - Printf(f,"
\n"); - if (!n) { - Printf(f,"Not defined!\n"); - } else { - raw_data(f,n); - } - Printf(f,"
\n"); - } - - Printf(f,"

Nested scopes
\n"); - Printf(f,"

\n");
-  {
-    Hash   *h;
-    h = firstChild(sym);
-    while (h) {
-      Printf(f,"%s\n", h, Getattr(h,"name"));
-      h = nextSibling(h);
-    }
-  }
-  Printf(f,"
\n"); - - Printf(f,"

Symbol table contents
\n"); - raw_data(f,Getattr(sym,"symtab")); - Printf(f,"


\n"); - -} -#endif - -void -Swig_browser(Node *top, int port) { -#ifdef SWIG_SWILL - int sport; - browser_exit = 0; - - /* Initialize the server */ - sport = swill_init(port); - if (sport < 0) { - Printf(stderr,"Couldn't open socket on port %d. Sorry.\n", port); - return; - } - browse = new Browser(); - Setmeta(top,"visible","1"); - tree_top = top; - - Printf(stderr,"SWIG: Tree browser listening on port %d\n", sport); - - swill_handle("exit.html", exit_handler,0); - swill_handle("index.html", node_handler, 0); - swill_handle("hide.html", hide_handler,0); - swill_handle("show.html", show_handler,0); - swill_handle("data.html", data_handler,0); - swill_handle("symbol.html", symbol_handler, 0); - swill_netscape("index.html"); - - while (!browser_exit) { - swill_serve(); - } - Printf(stderr,"Browser terminated.\n"); - swill_close(); - delete browse; - return; -#endif -} - - - - - diff --git a/Source/Modules1.1/contract.cxx b/Source/Modules1.1/contract.cxx deleted file mode 100644 index fba5827aa..000000000 --- a/Source/Modules1.1/contract.cxx +++ /dev/null @@ -1,118 +0,0 @@ -/* ----------------------------------------------------------------------------- - * contract.cxx - * - * Experimental support for contracts - * - * Author(s) : Aquinas Hobor (aahobor@cs.uchicago.edu) - * - * Copyright (C) 1999-2000. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_contract_cxx[] = "$Header$"; - -#include "swigmod.h" - -class Contracts : public Dispatcher { - -public: - virtual int top(Node *n) { - emit_children(n); - return SWIG_OK; - } - - virtual int importDirective(Node *n) { return emit_children(n); } - virtual int includeDirective(Node *n) { return emit_children(n); } // ? - virtual int externDeclaration(Node *n) { return emit_children(n); } - - String * strParms(ParmList *l) { - int comma = 0; - int i = 0; - Parm *p = l; - SwigType *pt; - String * returns = NewString(""); - while(p) { - String *pname; - pt = Getattr(p,"type"); - if ((SwigType_type(pt) != T_VOID)) { - if (comma) Printf(returns,","); - pname = Swig_cparm_name(p,i); - Printf(returns,"%s",SwigType_rcaststr(pt,pname)); - comma = 1; - i++; - } - p = nextSibling(p); - } - return returns; - } - - virtual int cDeclaration(Node *n) { - String *name = Getattr(n,"name"); - String *k = Getattr(n,"feature:contract"); - - if(k) - { - /* make the names */ - ParmList *l = Getmeta(k,"parms"); - String *params = ParmList_str(l); - String *transformed = strParms(l); - if(DohStrcmp(params,"")==0) { - DohDelete(params); - params = DohNewString("void"); - } - String *contractName = DohNewStringf("__SWIG_precontract_%s",name); - - /* make the contract */ - String *contract = DohNewStringf("int %s(%s,int rt[2])\n{\n",contractName,params); - SwigScanner * ss = NewSwigScanner(); - SwigScanner_clear(ss); - SwigScanner_push(ss,Copy(k)); - SwigScanner_token(ss); // Get rid of the '{' at the begining - - /* loop over the clauses */ - int clauseNum = 1; - int token = -1; - while(1) { - String *clause = DohNewString(""); /*BUG -- should free*/ - while((token=SwigScanner_token(ss))) { - if ((token==SWIG_TOKEN_SEMI)||(token==SWIG_TOKEN_RBRACE)) - break; - // if (token != SWIG_TOKEN_ENDLINE) - Printf(clause,"%s",SwigScanner_text(ss)); - } - if (DohStrcmp(clause,"\n") != 0) { - Printf(contract,"if (!(%s",clause); - Printf(contract,")) {\nrt[0]=__LINE__;\nrt[1]=%i;\nreturn 1;\n}\n",clauseNum); - } - if(token==SWIG_TOKEN_RBRACE) break; - clauseNum++; - } - - /* finish it off and attach it to the main tree */ - Printf(contract,"return 0;\n}\n"); - Setattr(n,"wrap:code",contract); /*BUG -- WHAT IF SOMETHING IS ALREADY THERE*/ - - /* Generate the calling code */ - String * calling = DohNewString("{\nint cfail[2];\nchar message[255];\n"); - Printf(calling,"if (%s(%s,cfail)) {\n",contractName,transformed); - Printf(calling,"sprintf(message,\"Contract %s failed on clause %%i (line %%i)!\",cfail[1],cfail[0]);\n",contractName); - Printf(calling,"PyErr_SetString(PyExc_Exception,message);return NULL;\n}\n"); - Printf(calling,"}\n"); - /* Setattr(n,"feature:preassert",calling); */ - } - /*There are two attributes "feature:preassert" and "feature:postassert".*/ - - - return SWIG_OK; - } - -}; - -void Swig_contracts(Node *n) { - Printf(stdout,"Applying contracts (experimental v0.09)\n"); - - Contracts *a = new Contracts; - a->top(n); - delete a; - -} diff --git a/Source/Modules1.1/emit.cxx b/Source/Modules1.1/emit.cxx deleted file mode 100644 index 1f4bcf8bb..000000000 --- a/Source/Modules1.1/emit.cxx +++ /dev/null @@ -1,452 +0,0 @@ -/* ----------------------------------------------------------------------------- - * emit.cxx - * - * Useful functions for emitting various pieces of code. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1998-2000. The University of Chicago - * Copyright (C) 1995-1998. The University of Utah and The Regents of the - * University of California. - * - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -#include "swigmod.h" - -char cvsroot_emit_cxx[] = "$Header$"; - -extern SwigType *cplus_value_type(SwigType *t); - -/* ----------------------------------------------------------------------------- - * emit_args() - * - * Creates a list of variable declarations for both the return value - * and function parameters. - * - * The return value is always called result and arguments arg0, arg1, arg2, etc... - * Returns the number of parameters associated with a function. - * ----------------------------------------------------------------------------- */ - -void emit_args(SwigType *rt, ParmList *l, Wrapper *f) { - - Parm *p; - String *tm; - - /* Emit function arguments */ - Swig_cargs(f, l); - - /* Handle return type */ - if (rt && (SwigType_type(rt) != T_VOID)) { - if (!CPlusPlus || (CPlusPlus && !SwigType_isclass(rt))) { - Wrapper_add_local(f,"result", SwigType_lstr(rt,"result")); - } else { - SwigType *vt = 0; - vt = cplus_value_type(rt); - if (!vt) { - Wrapper_add_local(f,"result", SwigType_lstr(rt,"result")); - } else { - Wrapper_add_local(f,"result", SwigType_lstr(vt,"result")); - Delete(vt); - } - } - } - - /* Attach typemaps to parameters */ - /* Swig_typemap_attach_parms("ignore",l,f); */ - - Swig_typemap_attach_parms("default",l,f); - Swig_typemap_attach_parms("arginit",l,f); - - /* Apply the arginit and default */ - p = l; - while (p) { - tm = Getattr(p,"tmap:arginit"); - if (tm) { - Replace(tm,"$target", Getattr(p,"lname"), DOH_REPLACE_ANY); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:arginit:next"); - } else { - p = nextSibling(p); - } - } - - /* Apply the default typemap */ - p = l; - while (p) { - tm = Getattr(p,"tmap:default"); - if (tm) { - Replace(tm,"$target", Getattr(p,"lname"), DOH_REPLACE_ANY); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:default:next"); - } else { - p = nextSibling(p); - } - } - -#ifdef DEPRECATED - /* Apply the ignore typemap */ - p = l; - while (p) { - tm = Getattr(p,"tmap:ignore"); - if (tm) { - Parm *np; - Replace(tm,"$target", Getattr(p,"lname"), DOH_REPLACE_ANY); - Printv(f->code,tm,"\n",NIL); - np = Getattr(p,"tmap:ignore:next"); - - /* Deprecate this part later */ - while (p && (p != np)) { - Setattr(p,"ignore","1"); - p = nextSibling(p); - } - /* -- end deprecate */ - - } else { - p = nextSibling(p); - } - } -#endif - return; -} - -/* ----------------------------------------------------------------------------- - * emit_attach_parmmaps() - * - * Attach the standard parameter related typemaps. - * ----------------------------------------------------------------------------- */ - -void emit_attach_parmmaps(ParmList *l, Wrapper *f) { - Swig_typemap_attach_parms("in",l,f); - Swig_typemap_attach_parms("typecheck",l,0); - Swig_typemap_attach_parms("argout",l,f); - Swig_typemap_attach_parms("check",l,f); - Swig_typemap_attach_parms("freearg",l,f); - - { - /* This is compatibility code to deal with the deprecated "ignore" typemap */ - Parm *p = l; - Parm *np; - String *tm; - while (p) { - tm = Getattr(p,"tmap:in"); - if (tm && checkAttribute(p,"tmap:in:numinputs","0")) { - Replaceall(tm,"$target", Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - np = Getattr(p,"tmap:in:next"); - while (p && (p != np)) { - Setattr(p,"ignore","1"); - p = nextSibling(p); - } - } else if (tm) { - p = Getattr(p,"tmap:in:next"); - } else { - p = nextSibling(p); - } - } - } - - /* Perform a sanity check on "in" and "freearg" typemaps. These - must exactly match to avoid chaos. If a mismatch occurs, we - nuke the freearg typemap */ - - { - Parm *p = l; - Parm *npin, *npfreearg; - while (p) { - npin = Getattr(p,"tmap:in:next"); - - /* - if (Getattr(p,"tmap:ignore")) { - npin = Getattr(p,"tmap:ignore:next"); - } else if (Getattr(p,"tmap:in")) { - npin = Getattr(p,"tmap:in:next"); - } - */ - - if (Getattr(p,"tmap:freearg")) { - npfreearg = Getattr(p,"tmap:freearg:next"); - if (npin != npfreearg) { - while (p != npin) { - Delattr(p,"tmap:freearg"); - Delattr(p,"tmap:freearg:next"); - p = nextSibling(p); - } - } - } - p = npin; - } - } - - /* Check for variable length arguments with no input typemap. - If no input is defined, we set this to ignore and print a - message. - */ - { - Parm *p = l; - Parm *lp = 0; - while (p) { - if (!checkAttribute(p,"tmap:in:numinputs","0")) { - lp = p; - p = Getattr(p,"tmap:in:next"); - continue; - } - if (SwigType_isvarargs(Getattr(p,"type"))) { - Swig_warning(WARN_LANG_VARARGS,input_file,line_number,"Variable length arguments discarded.\n"); - Setattr(p,"tmap:in",""); - } - lp = 0; - p = nextSibling(p); - } - - /* Check if last input argument is variable length argument */ - if (lp) { - p = lp; - while (p) { - if (SwigType_isvarargs(Getattr(p,"type"))) { - Setattr(l,"emit:varargs",lp); - break; - } - p = nextSibling(p); - } - } - } -} - -/* ----------------------------------------------------------------------------- - * emit_num_arguments() ** new in 1.3.10 - * - * Calculate the total number of arguments. This function is safe for use - * with multi-valued typemaps which may change the number of arguments in - * strange ways. - * ----------------------------------------------------------------------------- */ - -int emit_num_arguments(ParmList *parms) { - Parm *p = parms; - int nargs = 0; - - while (p) { - if (Getattr(p,"tmap:in")) { - nargs += GetInt(p,"tmap:in:numinputs"); - p = Getattr(p,"tmap:in:next"); - } else { - p = nextSibling(p); - } - } - -#ifdef DEPRECATED - while (p) { - /* Ignored arguments */ - if (Getattr(p,"tmap:ignore")) { - p = Getattr(p,"tmap:ignore:next"); - } else { - /* Marshalled arguments */ - nargs++; - if (Getattr(p,"tmap:in")) { - p = Getattr(p,"tmap:in:next"); - } else { - p = nextSibling(p); - } - } - } -#endif - if (parms && (p = Getattr(parms,"emit:varargs"))) { - if (!nextSibling(p)) { - nargs--; - } - } - return nargs; -} - -/* ----------------------------------------------------------------------------- - * emit_num_required() ** new in 1.3.10 - * - * Computes the number of required arguments. This is function is safe for - * use with multi-valued typemaps and knows how to skip over everything - * properly. - * ----------------------------------------------------------------------------- */ - -int emit_num_required(ParmList *parms) { - Parm *p = parms; - int nargs = 0; - - while (p) { - if (Getattr(p,"tmap:in") && checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } else { - if (Getattr(p,"value")) break; - if (Getattr(p,"tmap:default")) break; - nargs+= GetInt(p,"tmap:in:numinputs"); - if (Getattr(p,"tmap:in")) { - p = Getattr(p,"tmap:in:next"); - } else { - p = nextSibling(p); - } - } - } - - /* Print message for non-default arguments */ - while (p) { - if (Getattr(p,"tmap:in") && checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } else { - if (!Getattr(p,"value") && (!Getattr(p,"tmap:default"))) { - Swig_error(Getfile(p),Getline(p),"Error. Non-optional argument '%s' follows an optional argument.\n",Getattr(p,"name")); - } - if (Getattr(p,"tmap:in")) { - p = Getattr(p,"tmap:in:next"); - } else { - p = nextSibling(p); - } - } - } - - if (parms && (p = Getattr(parms,"emit:varargs"))) { - if (!nextSibling(p)) { - nargs--; - } - } - return nargs; -} - -/* ----------------------------------------------------------------------------- - * emit_isvarargs() - * - * Checks if a function is a varargs function - * ----------------------------------------------------------------------------- */ - -int -emit_isvarargs(ParmList *p) { - if (!p) return 0; - if (Getattr(p,"emit:varargs")) return 1; - return 0; -} - -/* ----------------------------------------------------------------------------- - * replace_args() - * ----------------------------------------------------------------------------- */ - -static -void replace_args(Parm *p, String *s) { - while (p) { - String *n = Getattr(p,"name"); - if (n) { - Replace(s,n,Getattr(p,"lname"), DOH_REPLACE_ID); - } - p = nextSibling(p); - } -} - -/* ----------------------------------------------------------------------------- - * int emit_action() - * - * Emits action code for a wrapper and checks for exception handling - * ----------------------------------------------------------------------------- */ - -void emit_action(Node *n, Wrapper *f) { - String *tm; - String *action; - String *wrap; - Parm *p; - SwigType *rt; - ParmList *throws = Getattr(n,"throws"); - - /* Look for fragments */ - { - String *f; - f = Getattr(n,"feature:fragment"); - if (f) { - char *c, *tok; - String *t = Copy(f); - c = Char(t); - tok = strtok(c,","); - while (tok) { - Swig_fragment_emit(tok); - tok = strtok(NULL,","); - } - Delete(t); - } - } - - /* Emit wrapper code (if any) */ - wrap = Getattr(n,"wrap:code"); - if (wrap && Swig_filebyname("header")!=Getattr(n,"wrap:code:done") ) { - File *f_code = Swig_filebyname("header"); - if (f_code) { - Printv(f_code,wrap,NIL); - } - Setattr(n,"wrap:code:done",f_code); - } - action = Getattr(n,"feature:action"); - if (!action) - action = Getattr(n,"wrap:action"); - assert(action); - - /* Get the return type */ - - rt = Getattr(n,"type"); - - /* Preassert -- EXPERIMENTAL */ - tm = Getattr(n,"feature:preassert"); - if (tm) { - p = Getattr(n,"parms"); - replace_args(p,tm); - Printv(f->code,tm,"\n",NIL); - } - - /* Exception handling code */ - - /* If we are in C++ mode and there is a throw specifier. We're going to - enclose the block in a try block */ - - if (throws) { - Printf(f->code,"try {\n"); - } - - /* Look for except typemap (Deprecated) */ - tm = Swig_typemap_lookup_new("except",n,"result",0); - - /* Look for except feature */ - if (!tm) { - tm = Getattr(n,"feature:except"); - if (tm) tm = Copy(tm); - } - if ((tm) && Len(tm) && (Strcmp(tm,"1") != 0)) { - Replaceall(tm,"$name",Getattr(n,"name")); - Replaceall(tm,"$symname", Getattr(n,"sym:name")); - Replaceall(tm,"$function", action); - Replaceall(tm,"$action", action); - Printv(f->code,tm,"\n", NIL); - Delete(tm); - } else { - Printv(f->code, action, "\n",NIL); - } - - if (throws) { - Printf(f->code,"}\n"); - for (Parm *ep = throws; ep; ep = nextSibling(ep)) { - String *em = Swig_typemap_lookup_new("throws",ep,"_e",0); - if (em) { - Printf(f->code,"catch(%s) {\n", SwigType_str(Getattr(ep,"type"),"&_e")); - Printv(f->code,em,"\n",NIL); - Printf(f->code,"}\n"); - } else { - Swig_warning(WARN_TYPEMAP_THROW, Getfile(n), Getline(n), - "No 'throw' typemap defined for exception type '%s'\n", SwigType_str(Getattr(ep,"type"),0)); - } - } - Printf(f->code,"catch(...) { throw; }\n"); - } - - /* Postassert - EXPERIMENTAL */ - tm = Getattr(n,"feature:postassert"); - if (tm) { - p = Getattr(n,"parms"); - replace_args(p,tm); - Printv(f->code,tm,"\n",NIL); - } -} - - - - diff --git a/Source/Modules1.1/guile.cxx b/Source/Modules1.1/guile.cxx deleted file mode 100644 index a6b53b536..000000000 --- a/Source/Modules1.1/guile.cxx +++ /dev/null @@ -1,1208 +0,0 @@ -/****************************************************************************** - * 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. - *****************************************************************************/ - -char cvsroot_guile_cxx[] = "$Header$"; - -/*********************************************************************** - * $Header$ - * - * guile.cxx - * - * Definitions for adding functions to Guile - ***********************************************************************/ - -#include "swigmod.h" - -#ifndef MACSWIG -#include "swigconfig.h" -#endif -#include - -static const char *guile_usage = (char*)"\ -Guile Options (available with -guile)\n\ - -ldflags - Print runtime libraries to link with\n\ - -prefix name - Use NAME as prefix [default \"gswig_\"]\n\ - -package name - Set the path of the module [default NULL]\n\ - -emit-setters - Emit procedures-with-setters for variables\n\ - and structure slots.\n\ - -linkage lstyle - Use linkage protocol LSTYLE [default `module']\n\ - -procdoc file - Output procedure documentation to FILE\n\ - -procdocformat format - Output procedure documentation in FORMAT;\n\ - one of `guile-1.4', `plain', `texinfo'\n\ - -scmstub file - Output Scheme FILE with module declaration and\n\ - exports; only with `passive' and `simple' linkage\n\ -\n\ - When unspecified, the default LSTYLE is `simple'. For native Guile\n\ - module linking (for Guile versions >=1.5.0), use `module'. Other\n\ - LSTYLE values are: `passive' for passive linking (no C-level\n\ - module-handling code), `ltdlmod' for Guile's old dynamic module\n\ - convention (versions <= 1.4), or `hobbit' for hobbit modules.\n\ -\n"; - -static File *f_runtime = 0; -static File *f_header = 0; -static File *f_wrappers = 0; -static File *f_init = 0; - - -static char *prefix = (char *) "gswig_"; -static char *module = 0; -static char *package = 0; -static enum { - GUILE_LSTYLE_SIMPLE, // call `SWIG_init()' - GUILE_LSTYLE_PASSIVE, // passive linking (no module code) - GUILE_LSTYLE_MODULE, // native guile module linking (Guile >= 1.4.1) - GUILE_LSTYLE_LTDLMOD_1_4, // old (Guile <= 1.4) dynamic module convention - GUILE_LSTYLE_HOBBIT // use (hobbit4d link) -} linkage = GUILE_LSTYLE_SIMPLE; - -static File *procdoc = 0; -static File *scmstub = 0; -static String *scmtext; - -static enum { - GUILE_1_4, - PLAIN, - TEXINFO -} docformat = GUILE_1_4; - -static int emit_setters = 0; -static int struct_member = 0; - -static String *beforereturn = 0; -static String *return_nothing_doc = 0; -static String *return_one_doc = 0; -static String *return_multi_doc = 0; - -static String *exported_symbols = 0; - -class GUILE : public Language { -public: - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main (int argc, char *argv[]) { - int i, orig_len; - - SWIG_library_directory("guile"); - SWIG_typemap_lang("guile"); - - // Look for certain command line options - for (i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp (argv[i], "-help") == 0) { - fputs (guile_usage, stderr); - SWIG_exit (EXIT_SUCCESS); - } - else if (strcmp (argv[i], "-prefix") == 0) { - if (argv[i + 1]) { - prefix = new char[strlen (argv[i + 1]) + 2]; - strcpy (prefix, argv[i + 1]); - Swig_mark_arg (i); - Swig_mark_arg (i + 1); - i++; - } else { - Swig_arg_error(); - } - } - else if (strcmp (argv[i], "-package") == 0) { - if (argv[i + 1]) { - package = new char[strlen (argv[i + 1]) + 2]; - strcpy (package, argv [i + 1]); - Swig_mark_arg (i); - Swig_mark_arg (i + 1); - i++; - } else { - Swig_arg_error(); - } - } - else if (strcmp (argv[i], "-ldflags") == 0) { - printf("%s\n", SWIG_GUILE_RUNTIME); - SWIG_exit (EXIT_SUCCESS); - } - else if (strcmp (argv[i], "-Linkage") == 0 - || strcmp (argv[i], "-linkage") == 0) { - if (argv[i + 1]) { - if (0 == strcmp (argv[i + 1], "ltdlmod")) - linkage = GUILE_LSTYLE_LTDLMOD_1_4; - else if (0 == strcmp (argv[i + 1], "hobbit")) - linkage = GUILE_LSTYLE_HOBBIT; - else if (0 == strcmp (argv[i + 1], "simple")) - linkage = GUILE_LSTYLE_SIMPLE; - else if (0 == strcmp (argv[i + 1], "passive")) - linkage = GUILE_LSTYLE_PASSIVE; - else if (0 == strcmp (argv[i + 1], "module")) - linkage = GUILE_LSTYLE_MODULE; - else - Swig_arg_error (); - Swig_mark_arg (i); - Swig_mark_arg (i + 1); - i++; - } else { - Swig_arg_error(); - } - } - else if (strcmp (argv[i], "-procdoc") == 0) { - if (argv[i + 1]) { - procdoc = NewFile(argv[i + 1], (char *) "w"); - Swig_mark_arg (i); - Swig_mark_arg (i + 1); - i++; - } else { - Swig_arg_error(); - } - } - else if (strcmp (argv[i], "-procdocformat") == 0) { - if (strcmp(argv[i+1], "guile-1.4") == 0) - docformat = GUILE_1_4; - else if (strcmp(argv[i+1], "plain") == 0) - docformat = PLAIN; - else if (strcmp(argv[i+1], "texinfo") == 0) - docformat = TEXINFO; - else Swig_arg_error(); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } - else if (strcmp (argv[i], "-emit-setters") == 0) { - emit_setters = 1; - Swig_mark_arg (i); - } - else if (strcmp (argv[i], "-scmstub") == 0) { - if (argv[i + 1]) { - scmstub = NewFile(argv[i + 1], (char *) "w"); - Swig_mark_arg (i); - Swig_mark_arg (i + 1); - i++; - } else { - Swig_arg_error(); - } - } - } - } - - // Make sure `prefix' ends in an underscore - - orig_len = strlen (prefix); - if (prefix[orig_len - 1] != '_') { - prefix[1 + orig_len] = 0; - prefix[orig_len] = '_'; - } - - /* Add a symbol for this module */ - Preprocessor_define ("SWIGGUILE 1",0); - /* Read in default typemaps */ - SWIG_config_file("guile.i"); - allow_overloading(); - - } - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("init",f_init); - - scmtext = NewString(""); - Swig_register_filebyname("scheme", scmtext); - exported_symbols = NewString(""); - - Printf(f_runtime, "/* -*- buffer-read-only: t -*- vi: set ro: */\n"); - Swig_banner (f_runtime); - - Printf (f_runtime, "/* Implementation : GUILE */\n\n"); - - /* Write out directives and declarations */ - - if (NoInclude) { - Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); - } - - module = Swig_copy_string(Char(Getattr(n,"name"))); - - if (CPlusPlus) { - Printf(f_runtime, "extern \"C\" {\n\n"); - } - - switch (linkage) { - case GUILE_LSTYLE_SIMPLE: - /* Simple linkage; we have to export the SWIG_init function. The user can - rename the function by a #define. */ - Printf (f_runtime, "extern void\nSWIG_init (void)\n;\n"); - Printf (f_init, "extern void\nSWIG_init (void)\n{\n"); - break; - default: - /* Other linkage; we make the SWIG_init function static */ - Printf (f_runtime, "static void\nSWIG_init (void)\n;\n"); - Printf (f_init, "static void\nSWIG_init (void)\n{\n"); - break; - } - Printf (f_init, "\tSWIG_Guile_Init();\n"); - if (CPlusPlus) { - Printf(f_runtime, "\n}\n"); - } - - Language::top(n); - - /* Close module */ - - Printf(f_wrappers,"#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); - - SwigType_emit_type_table (f_runtime, f_wrappers); - - Printf(f_wrappers,"#ifdef __cplusplus\n}\n#endif\n"); - - Printf (f_init, "SWIG_Guile_RegisterTypes(swig_types, swig_types_initial);\n"); - Printf (f_init, "}\n\n"); - char module_name[256]; - - if (!module) - sprintf(module_name, "swig"); - else { - if (package) - sprintf(module_name,"%s/%s", package,module); - else - strcpy(module_name,module); - } - emit_linkage (module_name); - - if (procdoc) { - Delete(procdoc); - procdoc = NULL; - } - if (scmstub) { - Delete(scmstub); - scmstub = NULL; - } - - /* Close all of the files */ - Dump(f_header,f_runtime); - Dump(f_wrappers,f_runtime); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - Delete(f_runtime); - return SWIG_OK; - } - - void emit_linkage (char *module_name) { - String *module_func = NewString(""); - - if (CPlusPlus) { - Printf(f_init, "extern \"C\" {\n\n"); - } - - Printv(module_func,module_name,NIL); - Replaceall(module_func,"-", "_"); - - switch (linkage) { - case GUILE_LSTYLE_SIMPLE: - Printf (f_init, "\n/* Linkage: simple */\n"); - break; - case GUILE_LSTYLE_PASSIVE: - Printf (f_init, "\n/* Linkage: passive */\n"); - Replaceall(module_func,"/", "_"); - Insert(module_func,0, "scm_init_"); - Append(module_func,"_module"); - - Printf (f_init, "SCM\n%s (void)\n{\n", module_func); - Printf (f_init, " SWIG_init();\n"); - Printf (f_init, " return SCM_UNSPECIFIED;\n"); - Printf (f_init, "}\n"); - break; - case GUILE_LSTYLE_LTDLMOD_1_4: - Printf (f_init, "\n/* Linkage: ltdlmod */\n"); - Replaceall(module_func,"/", "_"); - Insert(module_func,0, "scm_init_"); - Append(module_func,"_module"); - Printf (f_init, "SCM\n%s (void)\n{\n", module_func); - { - String *mod = NewString(module_name); - Replaceall(mod,"/", " "); - Printf (f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", - mod); - Printf (f_init, " return SCM_UNSPECIFIED;\n"); - Delete(mod); - } - Printf (f_init, "}\n"); - break; - case GUILE_LSTYLE_MODULE: - Printf (f_init, "\n/* Linkage: module */\n"); - Replaceall(module_func,"/", "_"); - Insert(module_func,0, "scm_init_"); - Append(module_func,"_module"); - - Printf (f_init, "static void SWIG_init_helper(void *data)\n"); - Printf (f_init, "{\n SWIG_init();\n"); - if (Len(exported_symbols) > 0) - Printf (f_init, " scm_c_export(%sNULL);", - exported_symbols); - Printf (f_init, "\n}\n\n"); - - Printf (f_init, "SCM\n%s (void)\n{\n", module_func); - { - String *mod = NewString(module_name); - Replaceall(mod,"/", " "); - Printf(f_init, " SCM module = scm_c_define_module(\"%s\",\n", mod); - Printf(f_init, " SWIG_init_helper, NULL);\n"); - Printf(f_init, " return SCM_UNSPECIFIED;\n"); - Delete(mod); - } - Printf (f_init, "}\n"); - break; - case GUILE_LSTYLE_HOBBIT: - Printf (f_init, "\n/* Linkage: hobbit */\n"); - Replaceall(module_func,"/", "_slash_"); - Insert(module_func,0, "scm_init_"); - Printf (f_init, "SCM\n%s (void)\n{\n", module_func); - { - String *mod = NewString(module_name); - Replaceall(mod,"/", " "); - Printf (f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", - mod); - Printf (f_init, " return SCM_UNSPECIFIED;\n"); - Delete(mod); - } - Printf (f_init, "}\n"); - break; - default: - abort(); // for now - } - - if (scmstub) { - /* Emit Scheme stub if requested */ - String *mod = NewString(module_name); - Replaceall(mod, "/", " "); - Printf (scmstub, ";;; -*- buffer-read-only: t -*- vi: set ro: */\n"); - Printf (scmstub, ";;; Automatically generated by SWIG; do not edit.\n\n"); - if (linkage == GUILE_LSTYLE_SIMPLE - || linkage == GUILE_LSTYLE_PASSIVE) - Printf (scmstub, "(define-module (%s))\n\n", mod); - Delete(mod); - Printf (scmstub, "%s", scmtext); - if ((linkage == GUILE_LSTYLE_SIMPLE - || linkage == GUILE_LSTYLE_PASSIVE) - && Len(exported_symbols) > 0) { - String *ex = NewString(exported_symbols); - Replaceall(ex, ", ", "\n "); - Replaceall(ex, "\"", ""); - Chop(ex); - Printf(scmstub, "\n(export %s)\n", ex); - Delete(ex); - } - } - - Delete(module_func); - if (CPlusPlus) { - Printf(f_init, "\n}\n"); - } - } - - /* Return true iff T is a pointer type */ - - int is_a_pointer (SwigType *t) { - return SwigType_ispointer(SwigType_typedef_resolve_all(t)); - } - - /* Report an error handling the given type. */ - - void throw_unhandled_guile_type_error (SwigType *d) { - Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, - "Unable to handle type %s.\n", SwigType_str(d,0)); - } - - /* Write out procedure documentation */ - - void write_doc(const String *proc_name, - const String *signature, - const String *doc, - const String *signature2 = NULL) { - switch (docformat) { - case GUILE_1_4: - Printv(procdoc, "\f\n", NIL); - Printv(procdoc, "(", signature, ")\n", NIL); - if (signature2) - Printv(procdoc, "(", signature2, ")\n", NIL); - Printv(procdoc, doc, "\n", NIL); - break; - case PLAIN: - Printv(procdoc, "\f", proc_name, "\n\n", NIL); - Printv(procdoc, "(", signature, ")\n", NIL); - if (signature2) - Printv(procdoc, "(", signature2, ")\n", NIL); - Printv(procdoc, doc, "\n\n", NIL); - break; - case TEXINFO: - Printv(procdoc, "\f", proc_name, "\n", NIL); - Printv(procdoc, "@deffn primitive ", signature, "\n", NIL); - if (signature2) - Printv(procdoc, "@deffnx primitive ", signature2, "\n", NIL); - Printv(procdoc, doc, "\n", NIL); - Printv(procdoc, "@end deffn\n\n", NIL); - break; - } - } - - /* returns false if the typemap is an empty string */ - bool handle_documentation_typemap(String *output, - const String *maybe_delimiter, - Parm *p, - const String *typemap, - const String *default_doc) - { - String *tmp = NewString(""); - String *tm; - if (!(tm = Getattr(p, typemap))) { - Printf(tmp, "%s", default_doc); - tm = tmp; - } - bool result = (Len(tm) > 0); - if (maybe_delimiter && Len(output) > 0 && Len(tm) > 0) { - Printv(output, maybe_delimiter, NIL); - } - String *pn = Getattr(p,"name"); - String *pt = Getattr(p,"type"); - Replaceall(tm, "$name", pn); // legacy for $parmname - Replaceall(tm, "$type", SwigType_str(pt,0)); - /* $NAME is like $name, but marked-up as a variable. */ - String *ARGNAME = NewString(""); - if (docformat == TEXINFO) - Printf(ARGNAME, "@var{%s}", pn); - else Printf(ARGNAME, "%(upper)s", pn); - Replaceall(tm, "$NAME", ARGNAME); - Replaceall(tm, "$PARMNAME", ARGNAME); - Printv(output,tm,NIL); - Delete(tmp); - return result; - } - - /* ------------------------------------------------------------ - * functionWrapper() - * Create a function declaration and register it with the interpreter. - * ------------------------------------------------------------ */ - - virtual int functionWrapper(Node *n) { - String *iname = Getattr(n,"sym:name"); - SwigType *d = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - Parm *p; - String *proc_name = 0; - char source[256], target[256]; - Wrapper *f = NewWrapper();; - String *cleanup = NewString(""); - String *outarg = NewString(""); - String *signature = NewString(""); - String *doc_body = NewString(""); - String *returns = NewString(""); - int num_results = 1; - String *tmp = NewString(""); - String *tm; - int i; - int numargs = 0; - int numreq = 0; - String *overname = 0; - int args_passed_as_array = 0; - - // Make a wrapper name for this - String *wname = Swig_name_wrapper(iname); - if (Getattr(n,"sym:overloaded")) { - overname = Getattr(n,"sym:overname"); - args_passed_as_array = 1; - } else { - if (!addSymbol(iname,n)) return SWIG_ERROR; - } - if (overname) { - Append(wname, overname); - } - Setattr(n,"wrap:name",wname); - - // Build the name for scheme. - proc_name = NewString(iname); - Replaceall(proc_name,"_", "-"); - - /* Emit locals etc. into f->code; figure out which args to ignore */ - emit_args (d, l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - - /* Get number of required and total arguments */ - numargs = emit_num_arguments(l); - numreq = emit_num_required(l); - - /* Declare return variable */ - - Wrapper_add_local (f,"gswig_result", "SCM gswig_result"); - Wrapper_add_local (f,"gswig_list_p", "int gswig_list_p = 0"); - - /* Get the output typemap so we can start generating documentation. Don't - worry, the returned string is saved as 'tmap:out' */ - - Swig_typemap_lookup_new("out",n,"result",0); - - if ((tm = Getattr(n,"tmap:out:doc"))) { - Printv(returns,tm,NIL); - if (Len(tm) > 0) num_results = 1; - else num_results = 0; - } else { - String *s = SwigType_str(d,0); - Chop(s); - Printf(returns,"<%s>",s); - Delete(s); - num_results = 1; - } - - /* Open prototype and signature */ - - Printv(f->def, "static SCM\n", wname," (", NIL); - if (args_passed_as_array) { - Printv(f->def, "int argc, SCM *argv", NIL); - } - Printv(signature, proc_name, NIL); - - /* Now write code to extract the parameters */ - - for (i = 0, p = l; i < numargs; i++) { - - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *ln = Getattr(p,"lname"); - int opt_p = (i >= numreq); - - // Produce names of source and target - if (args_passed_as_array) - sprintf(source, "argv[%d]", i); - else - sprintf(source,"s_%d",i); - sprintf(target,"%s", Char(ln)); - - if (!args_passed_as_array) { - if (i!=0) Printf(f->def,", "); - Printf(f->def,"SCM s_%d", i); - } - if (opt_p) { - Printf(f->code," if (%s != GH_NOT_PASSED) {\n", source); - } - if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$source",source); - Replaceall(tm,"$target",target); - Replaceall(tm,"$input",source); - Setattr(p,"emit:input", source); - Printv(f->code,tm,"\n",NIL); - - if (procdoc) { - /* Add to signature (arglist) */ - handle_documentation_typemap(signature, " ", p, "tmap:in:arglist", - "$name"); - /* Document the type of the arg in the documentation body */ - handle_documentation_typemap(doc_body, ", ", p, "tmap:in:doc", - "$NAME is of type <$type>"); - } - p = Getattr(p,"tmap:in:next"); - } else { - throw_unhandled_guile_type_error (pt); - p = nextSibling(p); - } - if (opt_p) - Printf(f->code," }\n"); - } - if (Len(doc_body) > 0) - Printf(doc_body, ".\n"); - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - /* Pass output arguments back to the caller. */ - - /* Insert argument output code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$target",Getattr(p,"lname")); - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - if (procdoc) { - if (handle_documentation_typemap(returns, ", ", - p, "tmap:argout:doc", - "$NAME (of type $type)")) { - /* A documentation typemap that is not the empty string - indicates that a value is returned to Scheme. */ - num_results++; - } - } - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Close prototype */ - - Printf(f->def, ")\n{\n"); - - /* Define the scheme name in C. This define is used by several Guile - macros. */ - Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); - - // Now write code to make the function call - Printv(f->code, tab4, "gh_defer_ints();\n", NIL); - emit_action(n,f); - Printv(f->code, tab4, "gh_allow_ints();\n", NIL); - - // Now have return value, figure out what to do with it. - - if ((tm = Getattr(n,"tmap:out"))) { - Replaceall(tm,"$result","gswig_result"); - Replaceall(tm,"$target","gswig_result"); - Replaceall(tm,"$source","result"); - Printv(f->code,tm,"\n",NIL); - } - else { - throw_unhandled_guile_type_error (d); - } - - // Dump the argument output code - Printv(f->code,outarg,NIL); - - // Dump the argument cleanup code - Printv(f->code,cleanup,NIL); - - // Look for any remaining cleanup - - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printv(f->code,tm,"\n",NIL); - } - } - - // Free any memory allocated by the function being wrapped.. - if ((tm = Swig_typemap_lookup_new("ret",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printv(f->code,tm,"\n",NIL); - } - - // Wrap things up (in a manner of speaking) - - if (beforereturn) - Printv(f->code, beforereturn, "\n", NIL); - Printv(f->code, "return gswig_result;\n", NIL); - - // Undefine the scheme name - - Printf(f->code, "#undef FUNC_NAME\n"); - Printf(f->code, "}\n"); - - Wrapper_print (f, f_wrappers); - - if (!Getattr(n, "sym:overloaded")) { - if (numargs > 10) { - int i; - /* gh_new_procedure would complain: too many args */ - /* Build a wrapper wrapper */ - Printv(f_wrappers, "static SCM\n", wname,"_rest (SCM rest)\n", NIL); - Printv(f_wrappers, "{\n", NIL); - Printf(f_wrappers, "SCM arg[%d];\n", numargs); - Printf(f_wrappers, "SWIG_Guile_GetArgs (arg, rest, %d, %d, \"%s\");\n", - numreq, numargs-numreq, proc_name); - Printv(f_wrappers, "return ", wname, "(", NIL); - Printv(f_wrappers, "arg[0]", NIL); - for (i = 1; i3) { - int len = Len(proc_name); - const char *pc = Char(proc_name); - /* MEMBER-set and MEMBER-get functions. */ - int is_setter = (pc[len - 3] == 's'); - if (is_setter) { - Printf(f_init, "SCM setter = "); - struct_member = 2; /* have a setter */ - } - else Printf(f_init, "SCM getter = "); - Printf (f_init, "gh_new_procedure(\"%s\", (swig_guile_proc) %s, %d, %d, 0);\n", - proc_name, wname, numreq, numargs-numreq); - if (!is_setter) { - /* Strip off "-get" */ - char *pws_name = (char*) malloc(sizeof(char) * (len - 3)); - strncpy(pws_name, pc, len - 3); - pws_name[len - 4] = 0; - if (struct_member==2) { - /* There was a setter, so create a procedure with setter */ - Printf (f_init, "gh_define(\"%s\", " - "scm_make_procedure_with_setter(getter, setter));\n", - pws_name); - } - else { - /* There was no setter, so make an alias to the getter */ - Printf (f_init, "gh_define(\"%s\", getter);\n", - pws_name); - } - Printf (exported_symbols, "\"%s\", ", pws_name); - free(pws_name); - } - } - else { - /* Register the function */ - Printf (f_init, "gh_new_procedure(\"%s\", (swig_guile_proc) %s, %d, %d, 0);\n", - proc_name, wname, numreq, numargs-numreq); - } - } - else { /* overloaded function; don't export the single methods */ - if (!Getattr(n,"sym:nextSibling")) { - /* Emit overloading dispatch function */ - - int maxargs; - String *dispatch = Swig_overload_dispatch(n,"return %s(argc,argv);",&maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *df = NewWrapper(); - String *dname = Swig_name_wrapper(iname); - - Printv(df->def, - "static SCM\n", dname, - "(SCM rest)\n{\n", - NIL); - Printf(df->code, "SCM argv[%d];\n", maxargs); - Printf(df->code, "int argc = SWIG_Guile_GetArgs (argv, rest, %d, %d, \"%s\");\n", - 0, maxargs, proc_name); - Printv(df->code,dispatch,"\n",NIL); - Printf(df->code,"scm_misc_error(\"%s\", \"No matching method for generic function `%s'\", SCM_EOL);\n", proc_name, iname); - Printv(df->code,"}\n",NIL); - Wrapper_print(df,f_wrappers); - Printf(f_init, "gh_new_procedure(\"%s\", (swig_guile_proc) %s, 0, 0, 1);\n", - proc_name, dname); - DelWrapper(df); - Delete(dispatch); - Delete(dname); - } - } - Printf (exported_symbols, "\"%s\", ", proc_name); - if (procdoc) { - String *returns_text = NewString(""); - if (num_results == 0) Printv(returns_text, return_nothing_doc, NIL); - else if (num_results == 1) Printv(returns_text, return_one_doc, NIL); - else Printv(returns_text, return_multi_doc, NIL); - /* Substitute documentation variables */ - static const char *numbers[] = {"zero", "one", "two", "three", - "four", "five", "six", "seven", - "eight", "nine", "ten", "eleven", - "twelve"}; - if (num_results <= 12) - Replaceall(returns_text, "$num_values", numbers[num_results]); - else { - String *num_results_str = NewStringf("%d", num_results); - Replaceall(returns_text, "$num_values", num_results_str); - Delete(num_results_str); - } - Replaceall(returns_text, "$values", returns); - Printf(doc_body, "\n%s", returns_text); - write_doc(proc_name, signature, doc_body); - Delete(returns_text); - } - - Delete(proc_name); - Delete(outarg); - Delete(cleanup); - Delete(signature); - Delete(doc_body); - Delete(returns); - Delete(tmp); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * variableWrapper() - * - * Create a link to a C variable. - * This creates a single function PREFIX_var_VARNAME(). - * This function takes a single optional argument. If supplied, it means - * we are setting this variable to some value. If omitted, it means we are - * simply evaluating this variable. Either way, we return the variables - * value. - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - - String *proc_name; - char var_name[256]; - Wrapper *f; - String *tm; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - f = NewWrapper(); - // evaluation function names - - strcpy(var_name, Char(Swig_name_wrapper(iname))); - - // Build the name for scheme. - proc_name = NewString(iname); - Replaceall(proc_name,"_", "-"); - - if (1 || (SwigType_type(t) != T_USER) || (is_a_pointer(t))) { - - Printf (f->def, "static SCM\n%s(SCM s_0)\n{\n", var_name); - - /* Define the scheme name in C. This define is used by several Guile - macros. */ - Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); - - Wrapper_add_local (f, "gswig_result", "SCM gswig_result"); - - if (!Getattr(n,"feature:immutable")) { - /* Check for a setting of the variable value */ - Printf (f->code, "if (s_0 != GH_NOT_PASSED) {\n"); - if ((tm = Swig_typemap_lookup_new("varin",n,name,0))) { - Replaceall(tm,"$source","s_0"); - Replaceall(tm,"$input","s_0"); - Replaceall(tm,"$target",name); - Printv(f->code,tm,"\n",NIL); - } - else { - throw_unhandled_guile_type_error (t); - } - Printf (f->code, "}\n"); - } - - // Now return the value of the variable (regardless - // of evaluating or setting) - - if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { - Replaceall(tm,"$source",name); - Replaceall(tm,"$target","gswig_result"); - Replaceall(tm,"$result", "gswig_result"); - Printv(f->code,tm,"\n",NIL); - } - else { - throw_unhandled_guile_type_error (t); - } - Printf (f->code, "\nreturn gswig_result;\n"); - Printf (f->code, "#undef FUNC_NAME\n"); - Printf (f->code, "}\n"); - - Wrapper_print (f, f_wrappers); - - // Now add symbol to the Guile interpreter - - if (!emit_setters - || Getattr(n,"feature:immutable")) { - /* Read-only variables become a simple procedure returning the - value; read-write variables become a simple procedure with - an optional argument. */ - Printf (f_init, "\t gh_new_procedure(\"%s\", (swig_guile_proc) %s, 0, %d, 0);\n", - proc_name, var_name, Getattr(n,"feature:immutable") ? 0 : 1); - } - else { - /* Read/write variables become a procedure with setter. */ - Printf (f_init, "\t{ SCM p = gh_new_procedure(\"%s\", (swig_guile_proc) %s, 0, 1, 0);\n", - proc_name, var_name); - Printf (f_init, "\t gh_define(\"%s\", " - "scm_make_procedure_with_setter(p, p)); }\n", - proc_name); - } - Printf (exported_symbols, "\"%s\", ", proc_name); - - if (procdoc) { - /* Compute documentation */ - String *signature = NewString(""); - String *signature2 = NULL; - String *doc = NewString(""); - - if (Getattr(n,"feature:immutable")) { - Printv(signature, proc_name, NIL); - Printv(doc, "Returns constant ", NIL); - if ((tm = Getattr(n,"tmap:varout:doc"))) { - Printv(doc,tm,NIL); - } else { - String *s = SwigType_str(t,0); - Chop(s); - Printf(doc,"<%s>",s); - Delete(s); - } - } - else if (emit_setters) { - Printv(signature, proc_name, NIL); - signature2 = NewString(""); - Printv(signature2, "set! (", proc_name, ") ", NIL); - handle_documentation_typemap(signature2, NIL, n, "tmap:varin:arglist", - "new-value"); - Printv(doc, "Get or set the value of the C variable, \n", NIL); - Printv(doc, "which is of type ", NIL); - handle_documentation_typemap(doc, NIL, n, "tmap:varout:doc", - "$1_type"); - Printv(doc, "."); - } - else { - Printv(signature, proc_name, - " #:optional ", NIL); - if ((tm = Getattr(n,"tmap:varin:doc"))) { - Printv(signature,tm,NIL); - } else { - String *s = SwigType_str(t,0); - Chop(s); - Printf(signature,"new-value <%s>",s); - Delete(s); - } - - Printv(doc, "If NEW-VALUE is provided, " - "set C variable to this value.\n", NIL); - Printv(doc, "Returns variable value ", NIL); - if ((tm = Getattr(n,"tmap:varout:doc"))) { - Printv(doc,tm,NIL); - } else { - String *s = SwigType_str(t,0); - Chop(s); - Printf(doc,"<%s>",s); - Delete(s); - } - } - write_doc(proc_name, signature, doc, signature2); - Delete(signature); - if (signature2) Delete(signature2); - Delete(doc); - } - - } else { - Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, - "Unsupported variable type %s (ignored).\n", SwigType_str(t,0)); - } - Delete(proc_name); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantWrapper() - * - * We create a read-only variable. - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - - String *proc_name; - char var_name[256]; - String *rvalue; - Wrapper *f; - SwigType *nctype; - String *tm; - - f = NewWrapper(); - - // Make a static variable; - - sprintf (var_name, "%sconst_%s", prefix, iname); - - // Strip const qualifier from type if present - - nctype = NewString(type); - if (SwigType_isconst(nctype)) { - Delete(SwigType_pop(nctype)); - } - - // Build the name for scheme. - proc_name = NewString(iname); - Replaceall(proc_name,"_", "-"); - - if ((SwigType_type(nctype) == T_USER) && (!is_a_pointer(nctype))) { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, - "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } - - // See if there's a typemap - - if (SwigType_type(nctype) == T_STRING) { - rvalue = NewStringf("\"%s\"", value); - } else if (SwigType_type(nctype) == T_CHAR) { - rvalue = NewStringf("\'%s\'", value); - } else { - rvalue = NewString(value); - } - - if ((tm = Swig_typemap_lookup_new("constant",n,name,0))) { - Replaceall(tm,"$source",rvalue); - Replaceall(tm,"$value",rvalue); - Replaceall(tm,"$target",name); - Printv(f_header,tm,"\n",NIL); - } else { - // Create variable and assign it a value - Printf (f_header, "static %s = %s;\n", SwigType_lstr(nctype,var_name), - rvalue); - } - { - /* Hack alert: will cleanup later -- Dave */ - Node *n = NewHash(); - Setattr(n,"name",var_name); - Setattr(n,"sym:name",iname); - Setattr(n,"type", nctype); - Setattr(n,"feature:immutable", "1"); - variableWrapper(n); - Delete(n); - } - Delete(nctype); - Delete(proc_name); - Delete(rvalue); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * membervariableHandler() - * ------------------------------------------------------------ */ - virtual int membervariableHandler(Node *n) { - if (emit_setters) { - struct_member = 1; - Printf(f_init, "{\n"); - Language::membervariableHandler(n); - Printf(f_init, "}\n"); - struct_member = 0; - } - else { - /* Only emit traditional VAR-get and VAR-set procedures */ - Language::membervariableHandler(n); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * pragmaDirective() - * ------------------------------------------------------------ */ - - virtual int pragmaDirective(Node *n) - { - if (!ImportMode) { - String *lang = Getattr(n,"lang"); - String *cmd = Getattr(n,"name"); - String *value = Getattr(n,"value"); - -# define store_pragma(PRAGMANAME) \ - if (Strcmp(cmd, #PRAGMANAME) == 0) { \ - if (PRAGMANAME) Delete(PRAGMANAME); \ - PRAGMANAME = value ? NewString(value) : NULL; \ - } - - if (Strcmp(lang,"guile") == 0) { - store_pragma(beforereturn) - store_pragma(return_nothing_doc) - store_pragma(return_one_doc) - store_pragma(return_multi_doc); -# undef store_pragma - } - } - return Language::pragmaDirective(n); - } - - /* ------------------------------------------------------------ - * validIdentifier() - * ------------------------------------------------------------ */ - - virtual int validIdentifier(String *s) { - char *c = Char(s); - /* Check whether we have an R5RS identifier. Guile supports a - superset of R5RS identifiers, but it's probably a bad idea to use - those. */ - /* --> * | */ - /* --> | */ - if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~'))) { - /* --> + | - | ... */ - if ((strcmp(c, "+") == 0) - || strcmp(c, "-") == 0 - || strcmp(c, "...") == 0) return 1; - else return 0; - } - /* --> | | */ - while (*c) { - if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') - || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; - c++; - } - return 1; - } -}; - -/* ----------------------------------------------------------------------------- - * swig_guile() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language * -swig_guile(void) { - return new GUILE(); -} diff --git a/Source/Modules1.1/java.cxx b/Source/Modules1.1/java.cxx deleted file mode 100644 index 499a58b24..000000000 --- a/Source/Modules1.1/java.cxx +++ /dev/null @@ -1,1900 +0,0 @@ -/* ----------------------------------------------------------------------------- - * java.cxx - * - * Java wrapper module. - * - * Author(s) : Harco de Hilster - * William Fulton - * - * Copyright (C) 1999-2002. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_java_cxx[] = "$Header$"; - -#include -#include // for INT_MAX -#include "swigmod.h" - -class JAVA : public Language { - static const char *usage; - const String *empty_string; - - Hash *swig_types_hash; - File *f_runtime; - File *f_header; - File *f_wrappers; - File *f_init; - - bool proxy_flag; // Flag for generating shadow classes - bool have_default_constructor_flag; - bool native_function_flag; // Flag for when wrapping a native function - bool enum_constant_flag; // Flag for when wrapping an enum or constant - bool static_flag; // Flag for when wrapping a static functions or member variables - bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable - bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const - bool global_variable_flag; // Flag for when wrapping a global variable - - String *jniclass_name; // JNI class name - String *module_class_name; // module class name - String *jniclass_class_code; // JNI class Java code - that is the native methods - String *shadow_classdef; - String *shadow_code; - String *module_class_code; - String *shadow_classname; - String *variable_name; //Name of a variable being wrapped - String *shadow_constants_code; - String *module_constants_code; - String *package; // Package name - String *jnipackage; // JNI package name - String *jniclass_imports; //jniclass imports from %pragma - String *module_imports; //module imports from %pragma - String *jniclass_baseclass; //inheritance for jniclass class from %pragma - String *module_baseclass; //inheritance for module class from %pragma - String *jniclass_interfaces; //interfaces for jniclass class from %pragma - String *module_interfaces; //interfaces for module class from %pragma - String *jniclass_class_modifiers; //class modifiers for jniclass class overriden by %pragma - String *module_class_modifiers; //class modifiers for module class overriden by %pragma - String *wrapper_conversion_code; //C++ casts for inheritance hierarchies JNI code - String *jniclass_cppcasts_code; //C++ casts up inheritance hierarchies JNI class Java code - String *destructor_call; //Destructor (delete) call if any - - enum type_additions {none, pointer, reference}; - - public: - - /* ----------------------------------------------------------------------------- - * JAVA() - * ----------------------------------------------------------------------------- */ - - JAVA() : - empty_string(NewString("")), - - swig_types_hash(NULL), - f_runtime(NULL), - f_header(NULL), - f_wrappers(NULL), - f_init(NULL), - - proxy_flag(true), - have_default_constructor_flag(false), - native_function_flag(false), - enum_constant_flag(false), - static_flag(false), - variable_wrapper_flag(false), - wrapping_member_flag(false), - global_variable_flag(false), - - jniclass_name(NULL), - module_class_name(NULL), - jniclass_class_code(NULL), - shadow_classdef(NULL), - shadow_code(NULL), - module_class_code(NULL), - shadow_classname(NULL), - variable_name(NULL), - shadow_constants_code(NULL), - module_constants_code(NULL), - package(NULL), - jnipackage(NULL), - jniclass_imports(NULL), - module_imports(NULL), - jniclass_baseclass(NULL), - module_baseclass(NULL), - jniclass_interfaces(NULL), - module_interfaces(NULL), - jniclass_class_modifiers(NULL), - module_class_modifiers(NULL), - wrapper_conversion_code(NULL), - jniclass_cppcasts_code(NULL), - destructor_call(NULL) - - { - } - - /* ----------------------------------------------------------------------------- - * is_shadow() - * - * Test to see if a type corresponds to something wrapped with a shadow/proxy class - * Return NULL if not otherwise the shadow name - * ----------------------------------------------------------------------------- */ - - String *is_shadow(SwigType *t) { - if (proxy_flag) { - Node *n = classLookup(t); - if (n) { - return Getattr(n,"sym:name"); - } - } - return NULL; - } - - /* ----------------------------------------------------------------------------- - * makeValidJniName() - * ----------------------------------------------------------------------------- */ - - String *makeValidJniName(const String *name) { - String *valid_jni_name = NewString(name); - Replaceall(valid_jni_name,"_","_1"); - return valid_jni_name; - } - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main(int argc, char *argv[]) { - - SWIG_library_directory("java"); - - // Look for certain command line options - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp(argv[i],"-package") == 0) { - if (argv[i+1]) { - package = NewString(""); - Printf(package, argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if ((strcmp(argv[i],"-shadow") == 0) || ((strcmp(argv[i],"-proxy") == 0))) { - Printf(stderr,"Deprecated command line option: %s. Proxy classes are now generated by default.\n", argv[i]); - Swig_mark_arg(i); - proxy_flag = true; - } else if ((strcmp(argv[i],"-noproxy") == 0)) { - Swig_mark_arg(i); - proxy_flag = false; - } else if (strcmp(argv[i],"-jnic") == 0) { - Swig_mark_arg(i); - Printf(stderr,"Deprecated command line option: -jnic. C JNI calling convention now used when -c++ not specified.\n"); - } else if (strcmp(argv[i],"-nofinalize") == 0) { - Swig_mark_arg(i); - Printf(stderr,"Deprecated command line option: -nofinalize. Use the new javafinalize typemaps instead.\n"); - } else if (strcmp(argv[i],"-jnicpp") == 0) { - Swig_mark_arg(i); - Printf(stderr,"Deprecated command line option: -jnicpp. C++ JNI calling convention now used when -c++ specified.\n"); - } else if (strcmp(argv[i],"-help") == 0) { - Printf(stderr,"%s\n", usage); - } - } - } - - // Add a symbol to the parser for conditional compilation - Preprocessor_define("SWIGJAVA 1",0); - - // Add typemap definitions - SWIG_typemap_lang("java"); - SWIG_config_file("java.swg"); - - allow_overloading(); - } - - /* --------------------------------------------------------------------- - * top() - * --------------------------------------------------------------------- */ - - virtual int top(Node *n) { - - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"Unable to open %s\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("init",f_init); - swig_types_hash = NewHash(); - - // Make the JNI class and module class names. The jniclassname can be set in the module directive. - Node* optionsnode = Getattr( Getattr(n,"module") ,"options"); - if (optionsnode) - if (Getattr(optionsnode,"jniclassname")) - jniclass_name = Copy(Getattr(optionsnode,"jniclassname")); - if (!jniclass_name) { - jniclass_name = NewStringf("%sJNI", Getattr(n,"name")); - module_class_name = Copy(Getattr(n,"name")); - } else { - // Rename the module name if it is the same as JNI class name - a backwards compatibility solution - if (Cmp(jniclass_name, Getattr(n,"name")) == 0) - module_class_name = NewStringf("%sModule", Getattr(n,"name")); - else - module_class_name = Copy(Getattr(n,"name")); - } - - - jniclass_class_code = NewString(""); - shadow_classdef = NewString(""); - shadow_code = NewString(""); - module_constants_code = NewString(""); - jniclass_baseclass = NewString(""); - jniclass_interfaces = NewString(""); - jniclass_class_modifiers = NewString(""); // package access only to the JNI class by default - module_class_code = NewString(""); - module_baseclass = NewString(""); - module_interfaces = NewString(""); - module_imports = NewString(""); - module_class_modifiers = NewString("public"); - jniclass_imports = NewString(""); - jniclass_cppcasts_code = NewString(""); - wrapper_conversion_code = NewString(""); - if (!package) package = NewString(""); - jnipackage = NewString(""); - - Swig_banner(f_runtime); // Print the SWIG banner message - - if (NoInclude) { - Printf(f_runtime,"#define SWIG_NOINCLUDE\n"); - } - - String *wrapper_name = NewString(""); - - if(Len(package)) { - String *jniname = makeValidJniName(package); - Printv(jnipackage, jniname, NIL); - Delete(jniname); - Replaceall(jnipackage,".","_"); - Append(jnipackage, "_"); - } - String *jniname = makeValidJniName(jniclass_name); - Printf(wrapper_name, "Java_%s%s_%%f", Char(jnipackage), jniname); - Delete(jniname); - - Swig_name_register((char*)"wrapper", Char(wrapper_name)); - Swig_name_register((char*)"set", (char*)"set_%v"); - Swig_name_register((char*)"get", (char*)"get_%v"); - Swig_name_register((char*)"member", (char*)"%c_%m"); - - Delete(wrapper_name); - - Printf(f_wrappers,"#ifdef __cplusplus\n"); - Printf(f_wrappers,"extern \"C\" {\n"); - Printf(f_wrappers,"#endif\n"); - - /* Emit code */ - Language::top(n); - - // Generate the Java JNI class - { - String *filen = NewStringf("%s.java", jniclass_name); - File *f_java = NewFile(filen,"w"); - if(!f_java) { - Printf(stderr,"Unable to open %s\n", filen); - SWIG_exit(EXIT_FAILURE); - } - Delete(filen); filen = NULL; - - // Start writing out the Java JNI class - if(Len(package) > 0) - Printf(f_java, "package %s;\n\n", package); - - emitBanner(f_java); - if(jniclass_imports) - Printf(f_java, "%s\n", jniclass_imports); - - if (Len(jniclass_class_modifiers) > 0) - Printf(f_java, "%s ", jniclass_class_modifiers); - Printf(f_java, "class %s ", jniclass_name); - - if (jniclass_baseclass && *Char(jniclass_baseclass)) - Printf(f_java, "extends %s ", jniclass_baseclass); - if (Len(jniclass_interfaces) > 0) - Printv(f_java, "implements ", jniclass_interfaces, " ", NIL); - Printf(f_java, "{\n"); - - // Add the native methods - Printv(f_java, jniclass_class_code, NIL); - Printv(f_java, jniclass_cppcasts_code, NIL); - - // Finish off the Java class - Printf(f_java, "}\n"); - Close(f_java); - } - - // Generate the Java module class - { - String *filen = NewStringf("%s.java", module_class_name); - File *f_module = NewFile(filen,"w"); - if(!f_module) { - Printf(stderr,"Unable to open %s\n", filen); - SWIG_exit(EXIT_FAILURE); - } - Delete(filen); filen = NULL; - - // Start writing out the Java module class - if(Len(package) > 0) - Printf(f_module, "package %s;\n\n", package); - - emitBanner(f_module); - if(module_imports) - Printf(f_module, "%s\n", module_imports); - - if (Len(module_class_modifiers) > 0) - Printf(f_module, "%s ", module_class_modifiers); - Printf(f_module, "class %s ", module_class_name); - - if (module_baseclass && *Char(module_baseclass)) - Printf(f_module, "extends %s ", module_baseclass); - if (Len(module_interfaces) > 0) - Printv(f_module, "implements ", module_interfaces, " ", NIL); - Printf(f_module, "{\n"); - - // Add the wrapper methods - Printv(f_module, module_class_code, NIL); - - // Write out all the enums constants - if (Len(module_constants_code) != 0 ) - Printv(f_module, " // enums and constants\n", module_constants_code, NIL); - - // Finish off the Java class - Printf(f_module, "}\n"); - Close(f_module); - } - - if(wrapper_conversion_code) - Printv(f_wrappers,wrapper_conversion_code,NIL); - - Printf(f_wrappers,"#ifdef __cplusplus\n"); - Printf(f_wrappers,"}\n"); - Printf(f_wrappers,"#endif\n"); - - // Output a Java class for each SWIG type - for (String *swig_type = Firstkey(swig_types_hash); swig_type; swig_type = Nextkey(swig_types_hash)) { - emitJavaClass(swig_type, Getattr(swig_types_hash, swig_type)); - } - - Delete(swig_types_hash); swig_types_hash = NULL; - Delete(jniclass_name); jniclass_name = NULL; - Delete(jniclass_class_code); jniclass_class_code = NULL; - Delete(shadow_classdef); shadow_classdef = NULL; - Delete(shadow_code); shadow_code = NULL; - Delete(module_constants_code); module_constants_code = NULL; - Delete(jniclass_baseclass); jniclass_baseclass = NULL; - Delete(jniclass_interfaces); jniclass_interfaces = NULL; - Delete(jniclass_class_modifiers); jniclass_class_modifiers = NULL; - Delete(module_class_name); module_class_name = NULL; - Delete(module_class_code); module_class_code = NULL; - Delete(module_baseclass); module_baseclass = NULL; - Delete(module_interfaces); module_interfaces = NULL; - Delete(module_imports); module_imports = NULL; - Delete(module_class_modifiers); module_class_modifiers = NULL; - Delete(jniclass_imports); jniclass_imports = NULL; - Delete(jniclass_cppcasts_code); jniclass_cppcasts_code = NULL; - Delete(wrapper_conversion_code); wrapper_conversion_code = NULL; - Delete(package); package = NULL; - Delete(jnipackage); jnipackage = NULL; - - /* Close all of the files */ - Dump(f_header,f_runtime); - Dump(f_wrappers,f_runtime); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - Delete(f_runtime); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * emitBanner() - * ----------------------------------------------------------------------------- */ - - void emitBanner(File *f) { - Printf(f, "/* ----------------------------------------------------------------------------\n"); - Printf(f, " * This file was automatically generated by SWIG (http://www.swig.org).\n"); - Printf(f, " * Version: %s\n", SWIG_VERSION); - Printf(f, " *\n"); - Printf(f, " * Do not make changes to this file unless you know what you are doing--modify\n"); - Printf(f, " * the SWIG interface file instead.\n"); - Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); - } - - /* ---------------------------------------------------------------------- - * nativeWrapper() - * ---------------------------------------------------------------------- */ - - virtual int nativeWrapper(Node *n) { - String *wrapname = Getattr(n,"wrap:name"); - - if (!addSymbol(wrapname,n)) return SWIG_ERROR; - - if (Getattr(n,"type")) { - Swig_save(&n,"name",NIL); - Setattr(n,"name", wrapname); - native_function_flag = true; - functionWrapper(n); - Swig_restore(&n); - native_function_flag = false; - } else { - Printf(stderr,"%s : Line %d. No return type for %%native method %s.\n", input_file, line_number, Getattr(n,"wrap:name")); - } - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * functionWrapper() - * ---------------------------------------------------------------------- */ - - virtual int functionWrapper(Node *n) { - String *symname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - String *tm; - Parm *p; - int i; - String *jnirettype = NewString(""); - String *javarettype = NewString(""); - String *cleanup = NewString(""); - String *outarg = NewString(""); - String *body = NewString(""); - String *javaParameterSignature = NewString(""); - int num_arguments = 0; - int num_required = 0; - bool is_void_return; - String *overloaded_name = getOverloadedName(n); - - if (!Getattr(n,"sym:overloaded")) { - if (!addSymbol(Getattr(n,"sym:name"),n)) return SWIG_ERROR; - } - - /* - Generate the java class wrapper function ie the java shadow class. Only done for public - member variables. That is this generates the getters/setters for member variables. - Not for enums and constants. - */ - if(proxy_flag && wrapping_member_flag && !enum_constant_flag) { - // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name - String *getter_setter_name = NewString(""); - if(Cmp(symname, Swig_name_set(Swig_name_member(shadow_classname, variable_name))) == 0) - Printf(getter_setter_name,"set"); - else - Printf(getter_setter_name,"get"); - Putc(toupper((int) *Char(variable_name)), getter_setter_name); - Printf(getter_setter_name, "%s", Char(variable_name)+1); - - Setattr(n,"java:shadowfuncname", getter_setter_name); - Setattr(n,"java:funcname", symname); - - javaShadowFunctionHandler(n); - - Delete(getter_setter_name); - } - - /* - The rest of this function deals with generating the java wrapper function (that wraps - a c/c++ function) and generating the JNI c code. Each java wrapper function has a - matching JNI c function call. - */ - - // A new wrapper function object - Wrapper *f = NewWrapper(); - - // Make a wrapper name for this function - String *jniname = makeValidJniName(overloaded_name); - String *wname = Swig_name_wrapper(jniname); - Delete(jniname); - - /* Attach the non-standard typemaps to the parameter list. */ - Swig_typemap_attach_parms("jni", l, f); - Swig_typemap_attach_parms("jtype", l, f); - - /* Get Java return types */ - if ((tm = Swig_typemap_lookup_new("jni",n,"",0))) { - Printf(jnirettype,"%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, - "No jni typemap defined for %s\n", SwigType_str(t,0)); - } - - if ((tm = Swig_typemap_lookup_new("jtype",n,"",0))) { - Printf(javarettype,"%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, - "No jtype typemap defined for %s\n", SwigType_str(t,0)); - } - - is_void_return = (Cmp(jnirettype, "void") == 0); - if (!is_void_return) - Wrapper_add_localv(f,"jresult", jnirettype, "jresult = 0",NIL); - - Printf(jniclass_class_code, " public final static native %s %s(", javarettype, overloaded_name); - - Printv(f->def, "JNIEXPORT ", jnirettype, " JNICALL ", wname, "(JNIEnv *jenv, jclass jcls", NIL); - - // Usually these function parameters are unused - The code below ensures that compilers do not issue such a warning if configured to do so. - Printv(f->code," (void)jenv;\n",NIL); - Printv(f->code," (void)jcls;\n",NIL); - - // Emit all of the local variables for holding arguments. - emit_args(t,l,f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - - /* Get number of required and total arguments */ - num_arguments = emit_num_arguments(l); - num_required = emit_num_required(l); - - int gencomma = 0; - - // Now walk the function parameter list and generate code to get arguments - for (i = 0, p=l; i < num_arguments; i++) { - - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *ln = Getattr(p,"lname"); - String *javaparamtype = NewString(""); - String *jni_param_type = NewString(""); - String *arg = NewString(""); - - Printf(arg,"j%s", ln); - - /* Get the jni types of the parameter */ - if ((tm = Getattr(p,"tmap:jni"))) { - Printv(jni_param_type, tm, NIL); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, - "No jni typemap defined for %s\n", SwigType_str(pt,0)); - } - - /* Get the java types of the parameter */ - if ((tm = Getattr(p,"tmap:jtype"))) { - Printv(javaparamtype, tm, NIL); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, - "No jtype typemap defined for %s\n", SwigType_str(pt,0)); - } - - /* Add to java function header */ - if(gencomma) Printf(jniclass_class_code, ", "); - Printf(jniclass_class_code, "%s %s", javaparamtype, arg); - - gencomma = 1; - - // Add to Jni function header - Printv(f->def, ", ", jni_param_type, " ", arg, NIL); - - // Get typemap for this argument - if ((tm = Getattr(p,"tmap:in"))) { - addThrows(n, "tmap:in", p); - Replaceall(tm,"$source",arg); /* deprecated */ - Replaceall(tm,"$target",ln); /* deprecated */ - Replaceall(tm,"$arg",arg); /* deprecated? */ - Replaceall(tm,"$input", arg); - Setattr(p,"emit:input", arg); - Printf(f->code,"%s\n", tm); - p = Getattr(p,"tmap:in:next"); - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, - "Unable to use type %s as a function argument.\n",SwigType_str(pt,0)); - p = nextSibling(p); - } - Delete(javaparamtype); - Delete(jni_param_type); - Delete(arg); - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - addThrows(n, "tmap:check", p); - Replaceall(tm,"$target",Getattr(p,"lname")); /* deprecated */ - Replaceall(tm,"$arg",Getattr(p,"emit:input")); /* deprecated? */ - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:freearg"))) { - addThrows(n, "tmap:freearg", p); - Replaceall(tm,"$source",Getattr(p,"emit:input")); /* deprecated */ - Replaceall(tm,"$arg",Getattr(p,"emit:input")); /* deprecated? */ - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:argout"))) { - addThrows(n, "tmap:argout", p); - Replaceall(tm,"$source",Getattr(p,"emit:input")); /* deprecated */ - Replaceall(tm,"$target",Getattr(p,"lname")); /* deprecated */ - Replaceall(tm,"$arg",Getattr(p,"emit:input")); /* deprecated? */ - Replaceall(tm,"$result","jresult"); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - // Get any Java exception classes in the throw typemap - if (ParmList *throw_parm_list = Getattr(n,"throws")) { - Swig_typemap_attach_parms("throws", throw_parm_list, f); - for (p = throw_parm_list; p; p=nextSibling(p)) { - if ((tm = Getattr(p,"tmap:throws"))) { - addThrows(n, "tmap:throws", p); - } - } - } - - if (Cmp(nodeType(n), "constant") == 0) { - // Wrapping a constant hack - Swig_save(&n,"wrap:action",NIL); - - // below based on Swig_VargetToFunction() - SwigType *ty = Swig_wrapped_var_type(Getattr(n,"type")); - Setattr(n,"wrap:action", NewStringf("result = (%s) %s;\n", SwigType_lstr(ty,0), Getattr(n, "value"))); - } - - // Now write code to make the function call - if(!native_function_flag) - emit_action(n,f); - - if (Cmp(nodeType(n), "constant") == 0) - Swig_restore(&n); - - /* Return value if necessary */ - if(!native_function_flag) { - if ((tm = Swig_typemap_lookup_new("out",n,"result",0))) { - addThrows(n, "tmap:out", n); - Replaceall(tm,"$source", "result"); /* deprecated */ - Replaceall(tm,"$target", "jresult"); /* deprecated */ - Replaceall(tm,"$result","jresult"); - Printf(f->code,"%s", tm); - if (Len(tm)) - Printf(f->code,"\n"); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, - "Unable to use return type %s in function %s.\n", SwigType_str(t,0), Getattr(n,"name")); - } - } - - /* Output argument output code */ - Printv(f->code,outarg,NIL); - - /* Output cleanup code */ - Printv(f->code,cleanup,NIL); - - /* Look to see if there is any newfree cleanup code */ - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); /* deprecated */ - Printf(f->code,"%s\n",tm); - } - } - - /* See if there is any return cleanup code */ - if(!native_function_flag) { - if ((tm = Swig_typemap_lookup_new("ret", n, "result", 0))) { - Replaceall(tm,"$source","result"); /* deprecated */ - Printf(f->code,"%s\n",tm); - } - } - - /* Finish JNI C function and JNI class native function definitions */ - Printf(jniclass_class_code, ")"); - generateThrowsClause(n, jniclass_class_code); - Printf(jniclass_class_code, ";\n"); - Printf(f->def,") {"); - - if(!is_void_return) - Printv(f->code, " return jresult;\n", NIL); - Printf(f->code, "}\n"); - - /* Substitute the cleanup code */ - Replaceall(f->code,"$cleanup",cleanup); - - if(!is_void_return) - Replaceall(f->code,"$null","0"); - else - Replaceall(f->code,"$null",""); - - /* Dump the function out */ - if(!native_function_flag) - Wrapper_print(f,f_wrappers); - - Setattr(n,"wrap:name", wname); - - /* Emit warnings for the few cases that can't be overloaded in Java */ - if (Getattr(n,"sym:overloaded")) { - if (!Getattr(n,"sym:nextSibling")) - Swig_overload_rank(n); - } - - if(!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { - moduleClassFunctionHandler(n); - } - - Delete(jnirettype); - Delete(javarettype); - Delete(cleanup); - Delete(outarg); - Delete(body); - Delete(javaParameterSignature); - Delete(overloaded_name); - DelWrapper(f); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------- - * variableWrapper() - * - * Create a JAVA link to a C variable. - * ----------------------------------------------------------------------- */ - - virtual int variableWrapper(Node *n) { - Language::variableWrapper(n); /* Default to functions */ - return SWIG_OK; - } - - /* ----------------------------------------------------------------------- - * globalvariableHandler() - * ------------------------------------------------------------------------ */ - - virtual int globalvariableHandler(Node *n) { - - variable_name = Getattr(n,"sym:name"); - global_variable_flag = true; - int ret = Language::globalvariableHandler(n); - global_variable_flag = false; - return ret; - } - - /* ----------------------------------------------------------------------- - * constantWrapper() - * ------------------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - String *symname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - String *tm; - String *shadowrettype = NewString(""); - String *constants_code = NewString(""); - - if (!addSymbol(symname,n)) return SWIG_ERROR; - - /* Attach the non-standard typemaps to the parameter list. */ - Swig_typemap_attach_parms("jstype", l, NULL); - - /* Get Java return types */ - bool is_return_type_java_class = false; - if ((tm = Swig_typemap_lookup_new("jstype",n,"",0))) { - is_return_type_java_class = substituteJavaclassname(t, tm); - Printf(shadowrettype, "%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, - "No jstype typemap defined for %s\n", SwigType_str(t,0)); - } - - // Add the stripped quotes back in - String *new_value = NewString(""); - Swig_save(&n,"value",NIL); - if(SwigType_type(t) == T_STRING) { - Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); - Setattr(n, "value", new_value); - } - else if(SwigType_type(t) == T_CHAR) { - Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); - Setattr(n, "value", new_value); - } - - // enums are wrapped using a public final static int in java. - // Other constants are wrapped using a public final static [jstype] in Java. - Printf(constants_code, " public final static %s %s = ", shadowrettype, ((proxy_flag && wrapping_member_flag) ? variable_name : symname)); - - // The %javaconst directive determines how the constant value is obtained - String *javaconst = Getattr(n,"feature:java:const"); - if (Cmp(nodeType(n), "enumitem") == 0 || !javaconst || Cmp(javaconst, "0") == 0) { - // Enums and default constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. - - if(is_return_type_java_class) // This handles function pointers using the %constant directive - Printf(constants_code, "new %s(%s.%s(), false);\n", shadowrettype, jniclass_name, Swig_name_get(symname)); - else - Printf(constants_code, "%s.%s();\n", jniclass_name, Swig_name_get(symname)); - - // Each constant and enum value is wrapped with a separate JNI function call - enum_constant_flag = true; - variableWrapper(n); - enum_constant_flag = false; - } else { - // Alternative constant handling will use the C syntax to make a true Java constant and hope that it compiles as Java code - Printf(constants_code, "%s;\n", Getattr(n,"value")); - } - - if(proxy_flag && wrapping_member_flag) - Printv(shadow_constants_code, constants_code, NIL); - else - Printv(module_constants_code, constants_code, NIL); - - Swig_restore(&n); - Delete(new_value); - Delete(shadowrettype); - Delete(constants_code); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * pragmaDirective() - * - * Valid Pragmas: - * jniclassbase - base (extends) for the JNI class - * jniclassclassmodifiers - class modifiers for the JNI class - * jniclasscode - text (java code) is copied verbatim to the JNI class - * jniclassimports - import statements for the JNI class - * jniclassinterfaces - interface (implements) for the JNI class - * - * modulebase - base (extends) for the module class - * moduleclassmodifiers - class modifiers for the module class - * modulecode - text (java code) is copied verbatim to the module class - * moduleimports - import statements for the module class - * moduleinterfaces - interface (implements) for the module class - * - * ----------------------------------------------------------------------------- */ - - virtual int pragmaDirective(Node *n) { - if (!ImportMode) { - String *lang = Getattr(n,"lang"); - String *code = Getattr(n,"name"); - String *value = Getattr(n,"value"); - - if(Strcmp(lang, "java") == 0) { - - String *strvalue = NewString(value); - Replaceall(strvalue,"\\\"", "\""); - - if(Strcmp(code, "jniclassbase") == 0) { - Delete(jniclass_baseclass); - jniclass_baseclass = Copy(strvalue); - } - else if(Strcmp(code, "jniclassclassmodifiers") == 0) { - Delete(jniclass_class_modifiers); - jniclass_class_modifiers = Copy(strvalue); - } - else if(Strcmp(code, "jniclasscode") == 0) { - Printf(jniclass_class_code, "%s\n", strvalue); - } - else if(Strcmp(code, "jniclassimports") == 0) { - Delete(jniclass_imports); - jniclass_imports = Copy(strvalue); - } - else if(Strcmp(code, "jniclassinterfaces") == 0) { - Delete(jniclass_interfaces); - jniclass_interfaces = Copy(strvalue); - } - else if(Strcmp(code, "modulebase") == 0) { - Delete(module_baseclass); - module_baseclass = Copy(strvalue); - } - else if(Strcmp(code, "moduleclassmodifiers") == 0) { - Delete(module_class_modifiers); - module_class_modifiers = Copy(strvalue); - } - else if(Strcmp(code, "modulecode") == 0) { - Printf(module_class_code, "%s\n", strvalue); - } - else if(Strcmp(code, "moduleimports") == 0) { - Delete(module_imports); - module_imports = Copy(strvalue); - } - else if(Strcmp(code, "moduleinterfaces") == 0) { - Delete(module_interfaces); - module_interfaces = Copy(strvalue); - } - else if(Strcmp(code, "moduleimport") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use the moduleimports pragma.\n", input_file, line_number); - } - else if(Strcmp(code, "moduleinterface") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use the moduleinterfaces pragma.\n", input_file, line_number); - } - else if(Strcmp(code, "modulemethodmodifiers") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %javamethodmodifiers.\n", input_file, line_number); - } - else if(Strcmp(code, "allshadowimport") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javaimports).\n", input_file, line_number); - } - else if(Strcmp(code, "allshadowcode") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javacode).\n", input_file, line_number); - } - else if(Strcmp(code, "allshadowbase") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javabase).\n", input_file, line_number); - } - else if(Strcmp(code, "allshadowinterface") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javainterfaces).\n", input_file, line_number); - } - else if(Strcmp(code, "allshadowclassmodifiers") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javaclassmodifiers).\n", input_file, line_number); - } - else if (proxy_flag) { - if (Strcmp(code,"shadowcode") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javacode).\n", input_file, line_number); - } - else if (Strcmp(code,"shadowimport") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javaimports).\n", input_file, line_number); - } - else if (Strcmp(code,"shadowbase") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javabase).\n", input_file, line_number); - } - else if (Strcmp(code,"shadowinterface") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javainterfaces).\n", input_file, line_number); - } - else if (Strcmp(code,"shadowclassmodifiers") == 0) { - Printf(stderr,"%s : Line %d. Ignored: Deprecated pragma. Please use %typemap(javaclassmodifiers).\n", input_file, line_number); - } else { - Printf(stderr,"%s : Line %d. Unrecognized pragma.\n", input_file, line_number); - } - } else { - Printf(stderr,"%s : Line %d. Unrecognized pragma.\n", input_file, line_number); - } - Delete(strvalue); - } - } - return Language::pragmaDirective(n); - } - - /* ----------------------------------------------------------------------------- - * emitShadowClassDefAndCPPCasts() - * ----------------------------------------------------------------------------- */ - - void emitShadowClassDefAndCPPCasts(Node *n) { - String *c_classname = SwigType_namestr(Getattr(n,"name")); - String *c_baseclass = NULL; - String *baseclass = NULL; - String *c_baseclassname = NULL; - - /* Deal with inheritance */ - List *baselist = Getattr(n,"bases"); - if (baselist) { - Node *base = Firstitem(baselist); - c_baseclassname = Getattr(base,"name"); - baseclass = Copy(is_shadow(c_baseclassname)); - if (baseclass){ - c_baseclass = SwigType_namestr(Getattr(base,"name")); - } - base = Nextitem(baselist); - if (base) { - Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, input_file, line_number, - "Warning for %s: Base %s ignored. Multiple inheritance is not supported in Java.\n", shadow_classname, Getattr(base,"name")); - } - } - - bool derived = baseclass && is_shadow(c_baseclassname); - if (!baseclass) - baseclass = NewString(""); - - // Inheritance from pure Java classes - const String *pure_java_baseclass = javaTypemapLookup("javabase", shadow_classname, WARN_NONE); - if (Len(pure_java_baseclass) > 0 && Len(baseclass) > 0) { - Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, input_file, line_number, - "Warning for %s: Base %s ignored. Multiple inheritance is not supported in Java.\n", shadow_classname, pure_java_baseclass); - } - - // Pure Java interfaces - const String *pure_java_interfaces = javaTypemapLookup("javainterfaces", shadow_classname, WARN_NONE); - - // Start writing the shadow class - Printv(shadow_classdef, - javaTypemapLookup("javaimports", shadow_classname, WARN_NONE), // Import statements - "\n", - javaTypemapLookup("javaclassmodifiers", shadow_classname, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers - " class $javaclassname", // Class name and bases - (derived || *Char(pure_java_baseclass)) ? - " extends " : - "", - baseclass, - pure_java_baseclass, - *Char(pure_java_interfaces) ? // Pure Java interfaces - " implements " : - "", - pure_java_interfaces, - " {\n", - " private long swigCPtr;\n", // Member variables for memory handling - derived ? - "" : - " protected boolean swigCMemOwn;\n", - "\n", - " ", - javaTypemapLookup("javaptrconstructormodifiers", shadow_classname, WARN_JAVA_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers - " $javaclassname(long cPtr, boolean cMemoryOwn) {\n", // Constructor used for wrapping pointers - derived ? - " super($jniclassname.SWIG$javaclassnameTo$baseclass(cPtr), cMemoryOwn);\n" : - " swigCMemOwn = cMemoryOwn;\n", - " swigCPtr = cPtr;\n", - " }\n", - NIL); - - if(!have_default_constructor_flag) { // All Java classes need a constructor - Printv(shadow_classdef, - "\n", - " protected $javaclassname() {\n", - " this(0, false);\n", - " }\n", - NIL); - } - - Printv(shadow_classdef, - javaTypemapLookup("javafinalize", shadow_classname, WARN_NONE), // finalize method - "\n", - *Char(destructor_call) ? - " public void delete() {\n" : - " protected void delete() {\n", - " if(swigCPtr != 0 && swigCMemOwn) {\n", - destructor_call, - "", - " swigCMemOwn = false;\n", - derived ? // Zero all pointers up any inheritance hierarchy - " super.delete();\n" : - "", - " }\n", - " swigCPtr = 0;\n", - " }\n", - javaTypemapLookup("javagetcptr", shadow_classname, WARN_JAVA_TYPEMAP_GETCPTR_UNDEF), // getCPtr method - javaTypemapLookup("javacode", shadow_classname, WARN_NONE), // extra Java code - "\n", - NIL); - - // Substitute various strings into the above template - Replaceall(shadow_code, "$javaclassname", shadow_classname); - Replaceall(shadow_classdef, "$javaclassname", shadow_classname); - - Replaceall(shadow_classdef, "$baseclass", baseclass); - Replaceall(shadow_code, "$baseclass", baseclass); - - Replaceall(shadow_classdef, "$jniclassname", jniclass_name); - Replaceall(shadow_code, "$jniclassname", jniclass_name); - - // Add JNI code to do C++ casting to base class (only for classes in an inheritance hierarchy) - if(derived){ - Printv(jniclass_cppcasts_code," public final static native long ", - "SWIG$javaclassnameTo$baseclass(long jarg1);\n", - NIL); - - Replaceall(jniclass_cppcasts_code, "$javaclassname", shadow_classname); - Replaceall(jniclass_cppcasts_code, "$baseclass", baseclass); - - Printv(wrapper_conversion_code, - "JNIEXPORT jlong JNICALL Java_$jnipackage$jnijniclass_SWIG$jniclazznameTo$jnibaseclass", - "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", - " jlong baseptr = 0;\n" - " (void)jenv;\n" - " (void)jcls;\n" - " *($cbaseclass **)&baseptr = *($cclass **)&jarg1;\n" - " return baseptr;\n" - "}\n", - "\n", - NIL); - - String *jnijniclass = makeValidJniName(jniclass_name); - String *jniclazzname = makeValidJniName(shadow_classname); - String *jnibaseclass = makeValidJniName(baseclass); - Replaceall(wrapper_conversion_code, "$jnibaseclass",jnibaseclass); - Replaceall(wrapper_conversion_code, "$cbaseclass", c_baseclass); - Replaceall(wrapper_conversion_code, "$jniclazzname",jniclazzname); - Replaceall(wrapper_conversion_code, "$cclass", c_classname); - Replaceall(wrapper_conversion_code, "$jnipackage", jnipackage); - Replaceall(wrapper_conversion_code, "$jnijniclass", jnijniclass); - - Delete(jnibaseclass); - Delete(jniclazzname); - Delete(jnijniclass); - } - Delete(baseclass); - } - - /* ---------------------------------------------------------------------- - * classHandler() - * ---------------------------------------------------------------------- */ - - virtual int classHandler(Node *n) { - - File *f_shadow = NULL; - if (proxy_flag) { - shadow_classname = NewString(Getattr(n,"sym:name")); - - if (!addSymbol(shadow_classname,n)) return SWIG_ERROR; - - if (Cmp(shadow_classname, jniclass_name) == 0) { - Printf(stderr, "Class name cannot be equal to JNI class name: %s\n", shadow_classname); - SWIG_exit(EXIT_FAILURE); - } - - if (Cmp(shadow_classname, module_class_name) == 0) { - Printf(stderr, "Class name cannot be equal to module class name: %s\n", shadow_classname); - SWIG_exit(EXIT_FAILURE); - } - - String *filen = NewStringf("%s.java", shadow_classname); - f_shadow = NewFile(filen,"w"); - if(!f_shadow) { - Printf(stderr, "Unable to create proxy class file: %s\n", filen); - SWIG_exit(EXIT_FAILURE); - } - Delete(filen); filen = NULL; - - emitBanner(f_shadow); - - if(Len(package) > 0) - Printf(f_shadow, "package %s;\n\n", package); - - Clear(shadow_classdef); - Clear(shadow_code); - - have_default_constructor_flag = false; - destructor_call = NewString(""); - shadow_constants_code = NewString(""); - } - Language::classHandler(n); - - if (proxy_flag) { - - emitShadowClassDefAndCPPCasts(n); - - Printv(f_shadow, shadow_classdef, shadow_code, NIL); - - // Write out all the enums and constants - if (Len(shadow_constants_code) != 0 ) - Printv(f_shadow, " // enums and constants\n", shadow_constants_code, NIL); - - Printf(f_shadow, "}\n"); - Close(f_shadow); - f_shadow = NULL; - - Delete(shadow_classname); shadow_classname = NULL; - Delete(destructor_call); destructor_call = NULL; - Delete(shadow_constants_code); shadow_constants_code = NULL; - } - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * memberfunctionHandler() - * ---------------------------------------------------------------------- */ - - virtual int memberfunctionHandler(Node *n) { - Language::memberfunctionHandler(n); - - if (proxy_flag) { - String *overloaded_name = getOverloadedName(n); - String *java_function_name = Swig_name_member(shadow_classname, overloaded_name); - Setattr(n,"java:shadowfuncname", Getattr(n, "sym:name")); - Setattr(n,"java:funcname", java_function_name); - javaShadowFunctionHandler(n); - Delete(overloaded_name); - } - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * staticmemberfunctionHandler() - * ---------------------------------------------------------------------- */ - - virtual int staticmemberfunctionHandler(Node *n) { - - static_flag = true; - Language::staticmemberfunctionHandler(n); - - if (proxy_flag) { - String *overloaded_name = getOverloadedName(n); - String *java_function_name = Swig_name_member(shadow_classname, overloaded_name); - Setattr(n,"java:shadowfuncname", Getattr(n,"sym:name")); - Setattr(n,"java:funcname", java_function_name); - javaShadowFunctionHandler(n); - Delete(overloaded_name); - } - static_flag = false; - - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * javaShadowFunctionHandler() - * - * Function called for creating a java class wrapper function around a c++ function in the - * java wrapper class. Used for both static and non static functions. - * C++ static functions map to java static functions. - * Two extra attributes in the Node must be available. These are "java:shadowfuncname" - the name of the java class shadow - * function, which in turn will call "java:funcname" - the java native function name which wraps the c++ function. - * ----------------------------------------------------------------------------- */ - - void javaShadowFunctionHandler(Node *n) { - SwigType *t = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - String *java_function_name = Getattr(n,"java:funcname"); - String *java_shadow_function_name = Getattr(n,"java:shadowfuncname"); - String *tm; - Parm *p; - int i; - String *nativecall = NewString(""); - String *shadowrettype = NewString(""); - String *user_arrays = NewString(""); - - if(!proxy_flag) return; - - if (l) { - if (SwigType_type(Getattr(l,"type")) == T_VOID) { - l = nextSibling(l); - } - } - - /* Attach the non-standard typemaps to the parameter list */ - Swig_typemap_attach_parms("in", l, NULL); - Swig_typemap_attach_parms("jstype", l, NULL); - Swig_typemap_attach_parms("javain", l, NULL); - - /* Get Java return types */ - if ((tm = Swig_typemap_lookup_new("jstype",n,"",0))) { - substituteJavaclassname(t, tm); - Printf(shadowrettype, "%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, - "No jstype typemap defined for %s\n", SwigType_str(t,0)); - } - - /* Start generating the shadow function */ - Printf(shadow_code, " %s ", Getattr(n,"feature:java:methodmodifiers")); - if (static_flag) - Printf(shadow_code, "static "); - Printf(shadow_code, "%s %s(", shadowrettype, java_shadow_function_name); - - Printv(nativecall, jniclass_name, ".", java_function_name, "(", NIL); - if (!static_flag) - Printv(nativecall, "swigCPtr", NIL); - - int gencomma = !static_flag; - - /* Output each parameter */ - for (i = 0, p=l; p; i++) { - - /* Ignored parameters */ - if (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - continue; - } - - /* Ignore the 'this' argument for variable wrappers */ - if (!(variable_wrapper_flag && i==0)) - { - SwigType *pt = Getattr(p,"type"); - String *javaparamtype = NewString(""); - - /* Get the java type of the parameter */ - if ((tm = Getattr(p,"tmap:jstype"))) { - substituteJavaclassname(pt, tm); - Printf(javaparamtype, "%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, - "No jstype typemap defined for %s\n", SwigType_str(pt,0)); - } - - if (gencomma) - Printf(nativecall, ", "); - - String *arg = makeParameterName(n, p, i); - - // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in native function (in JNI class) - if ((tm = Getattr(p,"tmap:javain"))) { - substituteJavaclassname(pt, tm); - Replaceall(tm, "$javainput", arg); - Printv(nativecall, tm, NIL); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, - "No javain typemap defined for %s\n", SwigType_str(pt,0)); - } - - /* Add to java shadow function header */ - if (gencomma >= 2) - Printf(shadow_code, ", "); - gencomma = 2; - Printf(shadow_code, "%s %s", javaparamtype, arg); - - Delete(arg); - Delete(javaparamtype); - } - p = Getattr(p,"tmap:in:next"); - } - - Printf(nativecall, ")"); - Printf(shadow_code, ")"); - generateThrowsClause(n, shadow_code); - - // Transform return type used in native function (in JNI class) to type used in Java wrapper function (in proxy class) - if ((tm = Swig_typemap_lookup_new("javaout",n,"",0))) { - if (Getattr(n,"feature:new")) - Replaceall(tm,"$owner","true"); - else - Replaceall(tm,"$owner","false"); - substituteJavaclassname(t, tm); - Replaceall(tm, "$jnicall", nativecall); - Printf(shadow_code, " %s\n\n", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, - "No javaout typemap defined for %s\n", SwigType_str(t,0)); - } - - Delete(shadowrettype); - Delete(nativecall); - Delete(user_arrays); - } - - /* ---------------------------------------------------------------------- - * constructorHandler() - * ---------------------------------------------------------------------- */ - - virtual int constructorHandler(Node *n) { - - ParmList *l = Getattr(n,"parms"); - String *tm; - Parm *p; - int i; - String *user_arrays = NewString(""); - - Language::constructorHandler(n); - - if(proxy_flag) { - String *overloaded_name = getOverloadedName(n); - String *nativecall = NewString(""); - - Printf(shadow_code, " %s %s(", Getattr(n,"feature:java:methodmodifiers"), shadow_classname); - Printv(nativecall, "this(", jniclass_name, ".", Swig_name_construct(overloaded_name), "(", NIL); - - /* Attach the non-standard typemaps to the parameter list */ - Swig_typemap_attach_parms("in", l, NULL); - Swig_typemap_attach_parms("jstype", l, NULL); - Swig_typemap_attach_parms("javain", l, NULL); - - int gencomma = 0; - - /* Output each parameter */ - for (i = 0, p=l; p; i++) { - - /* Ignored parameters */ - if (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - continue; - } - - SwigType *pt = Getattr(p,"type"); - String *javaparamtype = NewString(""); - - /* Get the java type of the parameter */ - if ((tm = Getattr(p,"tmap:jstype"))) { - substituteJavaclassname(pt, tm); - Printf(javaparamtype, "%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, - "No jstype typemap defined for %s\n", SwigType_str(pt,0)); - } - - if (gencomma) - Printf(nativecall, ", "); - - String *arg = makeParameterName(n, p, i); - - // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in native function (in JNI class) - if ((tm = Getattr(p,"tmap:javain"))) { - substituteJavaclassname(pt, tm); - Replaceall(tm, "$javainput", arg); - Printv(nativecall, tm, NIL); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, - "No javain typemap defined for %s\n", SwigType_str(pt,0)); - } - - /* Add to java shadow function header */ - if(gencomma) - Printf(shadow_code, ", "); - Printf(shadow_code, "%s %s", javaparamtype, arg); - gencomma = 1; - - Delete(arg); - Delete(javaparamtype); - p = Getattr(p,"tmap:in:next"); - } - - Printf(nativecall, "), true);\n"); - - Printf(shadow_code, ")"); - generateThrowsClause(n, shadow_code); - Printf(shadow_code, " {\n"); - Printv(shadow_code, user_arrays, NIL); - Printf(shadow_code, " %s", nativecall); - Printf(shadow_code, " }\n\n"); - - if(!gencomma) // We must have a default constructor - have_default_constructor_flag = true; - - Delete(overloaded_name); - Delete(nativecall); - } - - Delete(user_arrays); - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * destructorHandler() - * ---------------------------------------------------------------------- */ - - virtual int destructorHandler(Node *n) { - Language::destructorHandler(n); - String *symname = Getattr(n,"sym:name"); - - if(proxy_flag) { - Printv(destructor_call, " ", jniclass_name, ".", Swig_name_destroy(symname), "(swigCPtr);\n", NIL); - } - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * membervariableHandler() - * ---------------------------------------------------------------------- */ - - virtual int membervariableHandler(Node *n) { - variable_name = Getattr(n,"sym:name"); - wrapping_member_flag = true; - variable_wrapper_flag = true; - Language::membervariableHandler(n); - wrapping_member_flag = false; - variable_wrapper_flag = false; - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * staticmembervariableHandler() - * ---------------------------------------------------------------------- */ - - virtual int staticmembervariableHandler(Node *n) { - variable_name = Getattr(n,"sym:name"); - wrapping_member_flag = true; - static_flag = true; - Language::staticmembervariableHandler(n); - wrapping_member_flag = false; - static_flag = false; - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * memberconstantHandler() - * ---------------------------------------------------------------------- */ - - virtual int memberconstantHandler(Node *n) { - variable_name = Getattr(n,"sym:name"); - wrapping_member_flag = true; - Language::memberconstantHandler(n); - wrapping_member_flag = false; - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * getOverloadedName() - * ----------------------------------------------------------------------------- */ - - String *getOverloadedName(Node *n) { - - /* Although the JNI is designed to handle overloaded Java functions, a Java long is used for all classes in the SWIG - * JNI native interface. The JNI native interface function is thus mangled when overloaded to give a unique name. */ - String *overloaded_name = NewStringf("%s", Getattr(n,"sym:name")); - - if (Getattr(n,"sym:overloaded")) { - Printv(overloaded_name, Getattr(n,"sym:overname"), NIL); - } - - return overloaded_name; - } - - /* ----------------------------------------------------------------------------- - * moduleClassFunctionHandler() - * ----------------------------------------------------------------------------- */ - - void moduleClassFunctionHandler(Node *n) { - SwigType *t = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - String *tm; - Parm *p; - int i; - String *nativecall = NewString(""); - String *shadowrettype = NewString(""); - String *user_arrays = NewString(""); - int num_arguments = 0; - int num_required = 0; - String *overloaded_name = getOverloadedName(n); - String *func_name = NULL; - - if (l) { - if (SwigType_type(Getattr(l,"type")) == T_VOID) { - l = nextSibling(l); - } - } - - /* Attach the non-standard typemaps to the parameter list */ - Swig_typemap_attach_parms("jstype", l, NULL); - Swig_typemap_attach_parms("javain", l, NULL); - - /* Get Java return types */ - if ((tm = Swig_typemap_lookup_new("jstype",n,"",0))) { - substituteJavaclassname(t, tm); - Printf(shadowrettype, "%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, - "No jstype typemap defined for %s\n", SwigType_str(t,0)); - } - - /* Change function name for global variables */ - if (proxy_flag && global_variable_flag) { - // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name - func_name = NewString(""); - if(Cmp(Getattr(n,"sym:name"), Swig_name_set(variable_name)) == 0) - Printf(func_name,"set"); - else - Printf(func_name,"get"); - Putc(toupper((int) *Char(variable_name)), func_name); - Printf(func_name, "%s", Char(variable_name)+1); - } else { - func_name = Copy(Getattr(n,"sym:name")); - } - - /* Start generating the function */ - Printf(module_class_code, " %s static %s %s(", Getattr(n,"feature:java:methodmodifiers"), shadowrettype, func_name); - Printv(nativecall, jniclass_name, ".", overloaded_name, "(", NIL); - - /* Get number of required and total arguments */ - num_arguments = emit_num_arguments(l); - num_required = emit_num_required(l); - - int gencomma = 0; - - /* Output each parameter */ - for (i = 0, p=l; i < num_arguments; i++) { - - /* Ignored parameters */ - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *javaparamtype = NewString(""); - - /* Get the java type of the parameter */ - if ((tm = Getattr(p,"tmap:jstype"))) { - substituteJavaclassname(pt, tm); - Printf(javaparamtype, "%s", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, - "No jstype typemap defined for %s\n", SwigType_str(pt,0)); - } - - if (gencomma) - Printf(nativecall, ", "); - - String *arg = makeParameterName(n, p, i); - - // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in native function (in JNI class) - if ((tm = Getattr(p,"tmap:javain"))) { - substituteJavaclassname(pt, tm); - Replaceall(tm, "$javainput", arg); - Printv(nativecall, tm, NIL); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, - "No javain typemap defined for %s\n", SwigType_str(pt,0)); - } - - /* Add to java shadow function header */ - if (gencomma >= 2) - Printf(module_class_code, ", "); - gencomma = 2; - Printf(module_class_code, "%s %s", javaparamtype, arg); - - p = Getattr(p,"tmap:in:next"); - Delete(arg); - Delete(javaparamtype); - } - - Printf(nativecall, ")"); - Printf(module_class_code, ")"); - generateThrowsClause(n, module_class_code); - - // Transform return type used in native function (in JNI class) to type used in Java wrapper function (in module class) - if ((tm = Swig_typemap_lookup_new("javaout",n,"",0))) { - if (Getattr(n,"feature:new")) - Replaceall(tm,"$owner","true"); - else - Replaceall(tm,"$owner","false"); - substituteJavaclassname(t, tm); - Replaceall(tm, "$jnicall", nativecall); - Printf(module_class_code, " %s\n\n", tm); - } else { - Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, - "No javaout typemap defined for %s\n", SwigType_str(t,0)); - } - - Delete(shadowrettype); - Delete(nativecall); - Delete(user_arrays); - Delete(func_name); - } - - /* ----------------------------------------------------------------------------- - * substituteJavaclassname() - * - * Substitute $javaclassname with either the shadow class name for classes/structs/unions that SWIG knows about. - * Otherwise use the $descriptor name for the Java class name. Note that the $&javaclassname substitution - * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. - * Inputs: - * pt - parameter type - * tm - jstype typemap - * Outputs: - * tm - jstype typemap with $javaclassname substitution - * Return: - * is_java_class - flag indicating if a substitution was performed - * ----------------------------------------------------------------------------- */ - - bool substituteJavaclassname(SwigType *pt, String *tm) { - bool is_java_class = false; - if (Strstr(tm, "$javaclassname") || Strstr(tm,"$&javaclassname")) { - String *javaclassname = is_shadow(pt); - if (javaclassname) { - Replaceall(tm,"$&javaclassname", javaclassname); // is_shadow() works for pointers to classes too - Replaceall(tm,"$javaclassname", javaclassname); - } - else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. - String *descriptor = NULL; - SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); - - if (Strstr(tm, "$&javaclassname")) { - SwigType_add_pointer(type); - descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); - Replaceall(tm, "$&javaclassname", descriptor); - } - else { // $javaclassname - descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); - Replaceall(tm, "$javaclassname", descriptor); - } - - // Add to hash table so that the SWIGTYPE Java classes can be created later - Setattr(swig_types_hash, descriptor, type); - Delete(descriptor); - Delete(type); - } - is_java_class = true; - } - return is_java_class; - } - - /* ----------------------------------------------------------------------------- - * makeParameterName() - * - * Inputs: - * n - Node - * p - parameter node - * arg_num - parameter argument number - * Return: - * arg - a unique parameter name - * ----------------------------------------------------------------------------- */ - - String *makeParameterName(Node *n, Parm *p, int arg_num) { - - // Use C parameter name unless it is a duplicate or an empty parameter name - String *pn = Getattr(p,"name"); - int count = 0; - ParmList *plist = Getattr(n,"parms"); - while (plist) { - if ((Cmp(pn, Getattr(plist,"name")) == 0)) - count++; - plist = nextSibling(plist); - } - String *arg = (!pn || (count > 1)) ? NewStringf("arg%d",arg_num) : Copy(Getattr(p,"name")); - - return arg; - } - - /* ----------------------------------------------------------------------------- - * emitJavaClass() - * ----------------------------------------------------------------------------- */ - - void emitJavaClass(String *javaclassname, SwigType *type) { - String *filen = NewStringf("%s.java", javaclassname); - File *f_swigtype = NewFile(filen,"w"); - String *swigtype = NewString(""); - - // Emit banner and package name - emitBanner(f_swigtype); - if(Len(package) > 0) - Printf(f_swigtype, "package %s;\n\n", package); - - // Pure Java baseclass and interfaces - const String *pure_java_baseclass = javaTypemapLookup("javabase", type, WARN_NONE); - const String *pure_java_interfaces = javaTypemapLookup("javainterfaces", type, WARN_NONE); - - // Emit the class - Printv(swigtype, - javaTypemapLookup("javaimports", type, WARN_NONE), // Import statements - "\n", - javaTypemapLookup("javaclassmodifiers", type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers - " class $javaclassname", // Class name and bases - *Char(pure_java_baseclass) ? - " extends " : - "", - pure_java_baseclass, - *Char(pure_java_interfaces) ? // Pure Java interfaces - " implements " : - "", - pure_java_interfaces, - " {\n", - " private long swigCPtr;\n", - "\n", - " ", - javaTypemapLookup("javaptrconstructormodifiers", type, WARN_JAVA_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers - " $javaclassname(long cPtr, boolean bFutureUse) {\n", // Constructor used for wrapping pointers - " swigCPtr = cPtr;\n", - " }\n", - "\n", - " protected $javaclassname() {\n", // Default constructor - " swigCPtr = 0;\n", - " }\n", - javaTypemapLookup("javagetcptr", type, WARN_JAVA_TYPEMAP_GETCPTR_UNDEF), // getCPtr method - javaTypemapLookup("javacode", type, WARN_NONE), // extra Java code - "}\n", - "\n", - NIL); - - Replaceall(swigtype, "$javaclassname", javaclassname); - Printv(f_swigtype, swigtype, NIL); - - Close(f_swigtype); - Delete(filen); - Delete(swigtype); - } - - /* ----------------------------------------------------------------------------- - * javaTypemapLookup() - * ----------------------------------------------------------------------------- */ - - const String *javaTypemapLookup(const String *op, String *type, int warning) { - String *tm = NULL; - const String *code = NULL; - - if((tm = Swig_typemap_search(op, type, NULL, NULL))) { - code = Getattr(tm,"code"); - } - - if (!code) { - code = empty_string; - if (warning != WARN_NONE) - Swig_warning(warning, input_file, line_number, "No %s typemap defined for %s\n", op, type); - } - - return code ? code : empty_string; - } - - /* ----------------------------------------------------------------------------- - * addThrows() - * ----------------------------------------------------------------------------- */ - - void addThrows(Node *n, const String *typemap, Node *parameter) { - // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in - String *throws_attribute = NewStringf("%s:throws", typemap); - String *throws = Getattr(parameter,throws_attribute); - - if (throws) { - String *throws_list = Getattr(n,"java:throwslist"); - if (!throws_list) { - throws_list = NewList(); - Setattr(n,"java:throwslist", throws_list); - } - - // Put the exception classes in the throws clause into a temporary List - List *temp_classes_list = Split(throws,',',INT_MAX); - - // Add the exception classes to the node throws list, but don't duplicate if already in list - if (temp_classes_list && Len(temp_classes_list) > 0) { - for (String *cls = Firstitem(temp_classes_list); cls; cls = Nextitem(temp_classes_list)) { - String *javacls = NewString(cls); - Replaceall(javacls," ",""); // remove spaces - Replaceall(javacls,"\t",""); // remove tabs - if (Len(javacls) > 0) { - // $javaclassname substitution - SwigType *pt = Getattr(parameter,"type"); - substituteJavaclassname(pt, javacls); - - // Don't duplicate the Java class in the throws clause - bool found_flag = false; - for (String *item = Firstitem(throws_list); item; item = Nextitem(throws_list)) { - if (Strcmp(item, javacls) == 0) - found_flag = true; - } - if (!found_flag) - Append(throws_list, javacls); - } - Delete(javacls); - } - } - Delete(temp_classes_list); - } - Delete(throws_attribute); - } - - /* ----------------------------------------------------------------------------- - * generateThrowsClause() - * ----------------------------------------------------------------------------- */ - - void generateThrowsClause(Node *n, String *code) { - // Add the throws clause into code - List *throws_list = Getattr(n,"java:throwslist"); - if (throws_list) { - String *cls = Firstitem(throws_list); - Printf(code, " throws %s", cls); - while ( (cls = Nextitem(throws_list)) ) - Printf(code, ", %s", cls); - } - } - -}; /* class JAVA */ - -/* ----------------------------------------------------------------------------- - * swig_java() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language * -swig_java(void) { - return new JAVA(); -} - -/* ----------------------------------------------------------------------------- - * Static member variables - * ----------------------------------------------------------------------------- */ - -const char *JAVA::usage = (char*)"\ -Java Options (available with -java)\n\ - -package - set name of the Java package\n\ - -noproxy - Generate the low-level functional interface instead of proxy classes\n"; - - diff --git a/Source/Modules1.1/lang.cxx b/Source/Modules1.1/lang.cxx deleted file mode 100644 index 4245b7193..000000000 --- a/Source/Modules1.1/lang.cxx +++ /dev/null @@ -1,1853 +0,0 @@ -/* ----------------------------------------------------------------------------- - * lang.cxx - * - * Language base class functions. Default C++ handling is also implemented here. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1998-2000. The University of Chicago - * Copyright (C) 1995-1998. The University of Utah and The Regents of the - * University of California. - * - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_lang_cxx[] = "$Header$"; - -#include "swigmod.h" -#include - -/* Some status variables used during parsing */ - -static int InClass = 0; /* Parsing C++ or not */ -static String *ClassName = 0; /* This is the real name of the current class */ -static String *ClassPrefix = 0; /* Class prefix */ -static String *ClassType = 0; /* Fully qualified type name to use */ -int Abstract = 0; -int ImportMode = 0; -int IsVirtual = 0; -static String *AttributeFunctionGet = 0; -static String *AttributeFunctionSet = 0; -static int cplus_mode = 0; -static Node *CurrentClass = 0; -int line_number = 0; -char *input_file = 0; -int SmartPointer = 0; - -extern int GenerateDefault; -extern int ForceExtern; -extern int NoExtern; - -/* import modes */ - -#define IMPORT_MODE 1 -#define IMPORT_MODULE 2 - -/* C++ access modes */ - -#define CPLUS_PUBLIC 0 -#define CPLUS_PROTECTED 1 -#define CPLUS_PRIVATE 2 - -/* ---------------------------------------------------------------------- - * Dispatcher::emit_one() - * - * Dispatch a single node - * ---------------------------------------------------------------------- */ - -int Dispatcher::emit_one(Node *n) { - String *wrn; - int ret = SWIG_OK; - - char *tag = Char(nodeType(n)); - if (!tag) { - Printf(stderr,"SWIG: Fatal internal error. Malformed parse tree node!\n"); - return SWIG_ERROR; - } - - /* Do not proceed if marked with an error */ - - if (Getattr(n,"error")) return SWIG_OK; - - /* Look for warnings */ - wrn = Getattr(n,"feature:warnfilter"); - if (wrn) { - Swig_warnfilter(wrn,1); - } - - /* ============================================================ - * C/C++ parsing - * ============================================================ */ - - if (strcmp(tag,"extern") == 0) { - ret = externDeclaration(n); - } else if (strcmp(tag,"cdecl") == 0) { - ret = cDeclaration(n); - } else if (strcmp(tag,"enum") == 0) { - ret = enumDeclaration(n); - } else if (strcmp(tag,"enumitem") == 0) { - ret = enumvalueDeclaration(n); - } else if (strcmp(tag,"class") == 0) { - ret = classDeclaration(n); - } else if (strcmp(tag,"classforward") == 0) { - ret = classforwardDeclaration(n); - } else if (strcmp(tag,"constructor") == 0) { - ret = constructorDeclaration(n); - } else if (strcmp(tag,"destructor") == 0) { - ret = destructorDeclaration(n); - } else if (strcmp(tag,"access") == 0) { - ret = accessDeclaration(n); - } else if (strcmp(tag,"using") == 0) { - ret = usingDeclaration(n); - } else if (strcmp(tag,"namespace") == 0) { - ret = namespaceDeclaration(n); - } else if (strcmp(tag,"template") == 0) { - ret = templateDeclaration(n); - } - - /* =============================================================== - * SWIG directives - * =============================================================== */ - - else if (strcmp(tag,"top") == 0) { - ret = top(n); - } else if (strcmp(tag,"extend") == 0) { - ret = extendDirective(n); - } else if (strcmp(tag,"apply") == 0) { - ret = applyDirective(n); - } else if (strcmp(tag,"clear") == 0) { - ret = clearDirective(n); - } else if (strcmp(tag,"constant") == 0) { - ret = constantDirective(n); - } else if (strcmp(tag,"fragment") == 0) { - ret = fragmentDirective(n); - } else if (strcmp(tag,"import") == 0) { - ret = importDirective(n); - } else if (strcmp(tag,"include") == 0) { - ret = includeDirective(n); - } else if (strcmp(tag,"insert") == 0) { - ret = insertDirective(n); - } else if (strcmp(tag,"module") == 0) { - ret = moduleDirective(n); - } else if (strcmp(tag,"native") == 0) { - ret = nativeDirective(n); - } else if (strcmp(tag,"pragma") == 0) { - ret = pragmaDirective(n); - } else if (strcmp(tag,"typemap") == 0) { - ret = typemapDirective(n); - } else if (strcmp(tag,"typemapcopy") == 0) { - ret = typemapcopyDirective(n); - } else if (strcmp(tag,"typemapitem") == 0) { - ret = typemapitemDirective(n); - } else if (strcmp(tag,"types") == 0) { - ret = typesDirective(n); - } else { - Printf(stderr,"%s:%d. Unrecognized parse tree node type '%s'\n", input_file, line_number, tag); - ret = SWIG_ERROR; - } - if (wrn) { - Swig_warnfilter(wrn,0); - } - return ret; -} - -/* ---------------------------------------------------------------------- - * Dispatcher::emit_children() - * - * Emit all children. - * ---------------------------------------------------------------------- */ - -int Dispatcher::emit_children(Node *n) { - Node *c; - for (c = firstChild(n); c; c = nextSibling(c)) { - emit_one(c); - } - return SWIG_OK; -} - -/* Stubs for dispatcher class. We don't do anything by default---up to derived class - to fill in traversal code */ - -int Dispatcher::defaultHandler(Node *) { return SWIG_OK; } -int Dispatcher::extendDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::applyDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::clearDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::constantDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::fragmentDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::importDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::includeDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::insertDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::moduleDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::nativeDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::pragmaDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::typemapDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::typemapitemDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::typemapcopyDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::typesDirective(Node *n) { return defaultHandler(n); } -int Dispatcher::cDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::externDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::enumDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::enumvalueDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::classDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::templateDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::classforwardDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::constructorDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::destructorDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::accessDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::usingDeclaration(Node *n) { return defaultHandler(n); } -int Dispatcher::namespaceDeclaration(Node *n) { return defaultHandler(n); } - -/* Allocators */ -Language::Language() { - symbols = NewHash(); - classtypes = NewHash(); - overloading = 0; - multiinput = 0; -} - -Language::~Language() { - Delete(symbols); - Delete(classtypes); -} - -/* ---------------------------------------------------------------------- - emit_one() - ---------------------------------------------------------------------- */ - -int Language::emit_one(Node *n) { - int ret; - int oldext; - if (!n) return SWIG_OK; - - if (Getattr(n,"feature:ignore")) return SWIG_OK; - - oldext = Extend; - if (Getattr(n,"feature:extend")) Extend = 1; - - line_number = Getline(n); - input_file = Char(Getfile(n)); - - /* - symtab = Getattr(n,"symtab"); - if (symtab) { - symtab = Swig_symbol_setscope(symtab); - } - */ - ret = Dispatcher::emit_one(n); - /* - if (symtab) { - Swig_symbol_setscope(symtab); - } - */ - Extend = oldext; - return ret; -} - - -static Parm *nonvoid_parms(Parm *p) { - if (p) { - SwigType *t = Getattr(p,"type"); - if (SwigType_type(t) == T_VOID) return 0; - } - return p; -} - -/* This is a hack */ -SwigType *cplus_value_type(SwigType *t) { - Node *n; - if (!CPlusPlus) return 0; - if (SwigType_isclass(t)) { - SwigType *td = SwigType_typedef_resolve_all(t); - if ((n = Swig_symbol_clookup(td,0))) { - if ((Strcmp(nodeType(n),"class") == 0) && (!Getattr(n,"allocate:default_constructor") || (Getattr(n,"allocate:noassign")))) { - String *s = NewStringf("SwigValueWrapper< %s >",t); - Delete(td); - return s; - } - } - if (SwigType_issimple(td) && SwigType_istemplate(td)) { - String *s = NewStringf("SwigValueWrapper< %s >",t); - Delete(td); - return s; - } - Delete(td); - } - return 0; -} - -/* Patch C++ pass-by-value */ -void Language::patch_parms(Parm *p) { - while (p) { - SwigType *t = Getattr(p,"type"); - SwigType *s = cplus_value_type(t); - if (s) { - Setattr(p,"alttype",s); - Delete(s); - } - p = nextSibling(p); - } -} - -static Node *first_nontemplate(Node *n) { - while (n) { - if (Strcmp(nodeType(n),"template") != 0) return n; - n = Getattr(n,"sym:nextSibling"); - } - return n; -} - -/* -------------------------------------------------------------------------- - * swig_pragma() - * - * Handle swig pragma directives. - * -------------------------------------------------------------------------- */ - -void swig_pragma(char *lang, char *name, char *value) { - if (strcmp(lang,"swig") == 0) { - if ((strcmp(name,"make_default") == 0) || ((strcmp(name,"makedefault") == 0))) { - GenerateDefault = 1; - } else if ((strcmp(name,"no_default") == 0) || ((strcmp(name,"nodefault") == 0))) { - GenerateDefault = 0; - } else if (strcmp(name,"attributefunction") == 0) { - String *nvalue = NewString(value); - char *s = strchr(Char(nvalue),':'); - if (!s) { - Swig_error(input_file, line_number, "Bad value for attributefunction. Expected \"fmtget:fmtset\".\n"); - } else { - *s = 0; - AttributeFunctionGet = NewString(Char(nvalue)); - AttributeFunctionSet = NewString(s+1); - } - Delete(nvalue); - } else if (strcmp(name,"noattributefunction") == 0) { - AttributeFunctionGet = 0; - AttributeFunctionSet = 0; - } - } -} - -/* ---------------------------------------------------------------------- - * Language::top() - Top of parsing tree - * ---------------------------------------------------------------------- */ - -int Language::top(Node *n) { - return emit_children(n); -} - -/* ---------------------------------------------------------------------- - * Language::extendDirective() - * ---------------------------------------------------------------------- */ - -int Language::extendDirective(Node *n) { - int oldam = Extend; - int oldmode = cplus_mode; - Extend = CWRAP_EXTEND; - cplus_mode = CPLUS_PUBLIC; - - emit_children(n); - - Extend = oldam; - cplus_mode = oldmode; - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::applyDirective() - * ---------------------------------------------------------------------- */ - -int Language::applyDirective(Node *n) { - - Parm *pattern = Getattr(n,"pattern"); - Node *c = firstChild(n); - while (c) { - Parm *apattern = Getattr(c,"pattern"); - if (ParmList_len(pattern) != ParmList_len(apattern)) { - Swig_error(input_file, line_number, "Can't apply (%s) to (%s). Number of arguments don't match.\n", - ParmList_str(pattern), ParmList_str(apattern)); - } else { - if (!Swig_typemap_apply(pattern,apattern)) { - Swig_warning(WARN_TYPEMAP_APPLY_UNDEF,input_file,line_number,"Can't apply (%s). No typemaps are defined.\n", ParmList_str(pattern)); - } - } - c = nextSibling(c); - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::clearDirective() - * ---------------------------------------------------------------------- */ - -int Language::clearDirective(Node *n) { - Node *p; - for (p = firstChild(n); p; p = nextSibling(p)) { - ParmList *pattern = Getattr(p,"pattern"); - Swig_typemap_clear_apply(pattern); - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::constantDirective() - * ---------------------------------------------------------------------- */ - -int Language::constantDirective(Node *n) { - - if (CurrentClass && (cplus_mode != CPLUS_PUBLIC)) return SWIG_NOWRAP; - - if (!ImportMode) { - Swig_require(&n,"name", "?value",NIL); - String *name = Getattr(n,"name"); - String *value = Getattr(n,"value"); - if (!value) { - value = Copy(name); - } else { - value = NewStringf("%(escape)s", value); - } - Setattr(n,"value", value); - this->constantWrapper(n); - Swig_restore(&n); - return SWIG_OK; - } - return SWIG_NOWRAP; -} - -/* ---------------------------------------------------------------------- - * Language::fragmentDirective() - * ---------------------------------------------------------------------- */ - -int Language::fragmentDirective(Node *n) { - String *name = Getattr(n,"name"); - String *code = Getattr(n,"code"); - String *section = Getattr(n,"section"); - Swig_fragment_register(name,section,code); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::importDirective() - * ---------------------------------------------------------------------- */ - -int Language::importDirective(Node *n) { - int oldim = ImportMode; - ImportMode = IMPORT_MODE; - emit_children(n); - ImportMode = oldim; - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::includeDirective() - * ---------------------------------------------------------------------- */ - -int Language::includeDirective(Node *n) { - emit_children(n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::insertDirective() - * ---------------------------------------------------------------------- */ - -int Language::insertDirective(Node *n) { - /* %insert directive */ - if ((!ImportMode) || Getattr(n,"generated")) { - String *code = Getattr(n,"code"); - String *section = Getattr(n,"section"); - File *f = 0; - if (!section) { /* %{ ... %} */ - f = Swig_filebyname("header"); - } else { - f = Swig_filebyname(section); - } - if (f) { - Printf(f,"%s\n",code); - } else { - Swig_error(input_file,line_number,"Unknown target '%s' for %%insert directive.\n", section); - } - return SWIG_OK; - } else { - return SWIG_NOWRAP; - } -} - -/* ---------------------------------------------------------------------- - * Language::moduleDirective() - * ---------------------------------------------------------------------- */ - -int Language::moduleDirective(Node *n) { - /* %module directive */ - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::nativeDirective() - * ---------------------------------------------------------------------- */ - -int Language::nativeDirective(Node *n) { - if (!ImportMode) { - return nativeWrapper(n); - } else { - return SWIG_NOWRAP; - } -} - -/* ---------------------------------------------------------------------- - * Language::pragmaDirective() - * ---------------------------------------------------------------------- */ - -int Language::pragmaDirective(Node *n) { - /* %pragma directive */ - if (!ImportMode) { - String *lan = Getattr(n,"lang"); - String *name = Getattr(n,"name"); - String *value = Getattr(n,"value"); - swig_pragma(Char(lan),Char(name),Char(value)); - /* pragma(Char(lan),Char(name),Char(value)); */ - return SWIG_OK; - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::typemapDirective() - * ---------------------------------------------------------------------- */ - -extern "C" void Swig_cparse_replace_descriptor(String *s); - -int Language::typemapDirective(Node *n) { - /* %typemap directive */ - String *method = Getattr(n,"method"); - String *code = Getattr(n,"code"); - Parm *kwargs = Getattr(n,"kwargs"); - Node *items = firstChild(n); - static int namewarn = 0; - - - if (code && (Strstr(code,"$source") || (Strstr(code,"$target")))) { - Swig_warning(WARN_TYPEMAP_SOURCETARGET,Getfile(n),Getline(n),"Deprecated typemap feature ($source/$target).\n"); - if (!namewarn) { - Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), - "The use of $source and $target in a typemap declaration is deprecated.\n\ -For typemaps related to argument input (in,ignore,default,arginit,check), replace\n\ -$source by $input and $target by $1. For typemaps related to return values (out,\n\ -argout,ret,except), replace $source by $1 and $target by $result. See the file\n\ -Doc/Manual/Typemaps.html for complete details.\n"); - namewarn = 1; - } - } - - /* - if (Strcmp(method,"except") == 0) { - Swig_warning(WARN_DEPRECATED_EXCEPT_TM, Getfile(n), Getline(n), - "%%typemap(except) is deprecated. Use the %%exception directive.\n"); - } - */ - - if (Strcmp(method,"in") == 0) { - Hash *k; - k = kwargs; - while (k) { - if (checkAttribute(k,"name","numinputs")) { - if (!multiinput && (GetInt(k,"value") > 1)) { - Swig_error(Getfile(n),Getline(n),"Multiple-input typemaps (numinputs > 1) not supported by this target language module.\n"); - return SWIG_ERROR; - } - break; - } - k = nextSibling(k); - } - if (!k) { - k = NewHash(); - Setattr(k,"name","numinputs"); - Setattr(k,"value","1"); - set_nextSibling(k,kwargs); - Setattr(n,"kwargs",k); - kwargs = k; - } - } - - if (Strcmp(method,"ignore") == 0) { - Swig_warning(WARN_DEPRECATED_IGNORE_TM, Getfile(n), Getline(n), - "%%typemap(ignore) has been replaced by %%typemap(in,numinputs=0).\n"); - - Clear(method); - Append(method,"in"); - Hash *k = NewHash(); - Setattr(k,"name","numinputs"); - Setattr(k,"value","0"); - set_nextSibling(k,kwargs); - Setattr(n,"kwargs",k); - kwargs = k; - } - - /* Replace $descriptor() macros */ - - if (code) { - Setfile(code,Getfile(n)); - Setline(code,Getline(n)); - Swig_cparse_replace_descriptor(code); - } - - while (items) { - Parm *pattern = Getattr(items,"pattern"); - Parm *parms = Getattr(items,"parms"); - if (code) { - Swig_typemap_register(method,pattern,code,parms,kwargs); - } else { - Swig_typemap_clear(method,pattern); - } - items = nextSibling(items); - } - return SWIG_OK; - -} - -/* ---------------------------------------------------------------------- - * Language::typemapcopyDirective() - * ---------------------------------------------------------------------- */ - -int Language::typemapcopyDirective(Node *n) { - String *method = Getattr(n,"method"); - Parm *pattern = Getattr(n,"pattern"); - Node *items = firstChild(n); - int nsrc = 0; - nsrc = ParmList_len(pattern); - while (items) { - ParmList *npattern = Getattr(items,"pattern"); - if (nsrc != ParmList_len(npattern)) { - Swig_error(input_file,line_number,"Can't copy typemap. Number of types differ.\n"); - } else { - if (Swig_typemap_copy(method,pattern,npattern) < 0) { - Swig_error(input_file, line_number, "Can't copy typemap.\n"); - } - } - items = nextSibling(items); - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::typesDirective() - * ---------------------------------------------------------------------- */ - -int Language::typesDirective(Node *n) { - Parm *parms = Getattr(n,"parms"); - while (parms) { - SwigType *t = Getattr(parms,"type"); - String *v = Getattr(parms,"value"); - if (!v) { - SwigType_remember(t); - } else { - if (SwigType_issimple(t)) { - SwigType_inherit(t,v,0); - } - } - parms = nextSibling(parms); - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::cDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::cDeclaration(Node *n) { - - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - SwigType *decl = Getattr(n,"decl"); - String *storage = Getattr(n,"storage"); - Node *over; - File *f_header = 0; - SwigType *ty, *fullty; - - if (CurrentClass && (cplus_mode != CPLUS_PUBLIC)) return SWIG_NOWRAP; - - if (Cmp(storage,"typedef") == 0) { - Swig_save(&n,"type",NIL); - SwigType *t = Copy(type); - if (t) { - SwigType_push(t,decl); - Setattr(n,"type",t); - typedefHandler(n); - } - Swig_restore(&n); - return SWIG_OK; - } else if (Cmp(storage,"friend") == 0) { - Swig_warning(WARN_LANG_FRIEND_IGNORE, Getfile(n), Getline(n), - "friend function '%s' ignored.\n", name); - return SWIG_NOWRAP; - } - - /* If in import mode, we proceed no further */ - if (ImportMode) return SWIG_NOWRAP; - - /* Overloaded symbol check */ - over = Swig_symbol_isoverloaded(n); - if (!overloading) { - if (over) over = first_nontemplate(over); - if (over && (over != n)) { - SwigType *tc = Copy(decl); - SwigType *td = SwigType_pop_function(tc); - String *oname; - String *cname; - if (CurrentClass) { - oname = NewStringf("%s::%s",ClassName,name); - cname = NewStringf("%s::%s",ClassName,Getattr(over,"name")); - } else { - oname = NewString(name); - cname = NewString(Getattr(over,"name")); - } - - SwigType *tc2 = Copy(Getattr(over,"decl")); - SwigType *td2 = SwigType_pop_function(tc2); - - Swig_warning(WARN_LANG_OVERLOAD_DECL, input_file, line_number, "Overloaded declaration ignored. %s\n", SwigType_str(td,SwigType_namestr(oname))); - Swig_warning(WARN_LANG_OVERLOAD_DECL, Getfile(over), Getline(over),"Previous declaration is %s\n", SwigType_str(td2,SwigType_namestr(cname))); - - Delete(tc2); - Delete(td2); - Delete(tc); - Delete(td); - Delete(oname); - Delete(cname); - return SWIG_NOWRAP; - } - } - - if (symname && !validIdentifier(symname)) { - Swig_warning(WARN_LANG_IDENTIFIER,input_file, line_number, "Can't wrap '%s' unless renamed to a valid identifier.\n", - symname); - return SWIG_NOWRAP; - } - - ty = NewString(type); - SwigType_push(ty,decl); - fullty = SwigType_typedef_resolve_all(ty); - if (SwigType_isfunction(fullty)) { - if (!SwigType_isfunction(ty)) { - Delete(ty); - ty = fullty; - fullty = 0; - ParmList *parms = SwigType_function_parms(ty); - Setattr(n,"parms",parms); - } - /* Transform the node into a 'function' node and emit */ - if (!CurrentClass) { - f_header = Swig_filebyname("header"); - - if (!NoExtern) { - if (f_header) { - if ((Cmp(storage,"extern") == 0) || (ForceExtern && !storage)) { - Printf(f_header,"extern %s;\n", SwigType_str(ty,name)); - } else if (Cmp(storage,"externc") == 0) { - Printf(f_header,"extern \"C\" %s;\n", SwigType_str(ty,name)); - } - } - } - } - /* This needs to check qualifiers */ - if (SwigType_isqualifier(ty)) { - Setattr(n,"qualifier", SwigType_pop(ty)); - } - Delete(SwigType_pop_function(ty)); - DohIncref(type); - Setattr(n,"type",ty); - functionHandler(n); - Setattr(n,"type",type); - Delete(ty); - Delete(type); - return SWIG_OK; - } else { - /* Some kind of variable declaration */ - Delattr(n,"decl"); - if (Getattr(n,"nested")) Setattr(n,"feature:immutable","1"); - if (!CurrentClass) { - if ((Cmp(storage,"extern") == 0) || ForceExtern) { - f_header = Swig_filebyname("header"); - if (!NoExtern) { - if (f_header) { - Printf(f_header,"extern %s;\n", SwigType_str(ty,name)); - } - } - } - } - if (!SwigType_ismutable(ty)) { - Setattr(n,"feature:immutable","1"); - } - /* If an array and elements are const, then read-only */ - if (SwigType_isarray(ty)) { - SwigType *tya = SwigType_array_type(ty); - if (SwigType_isconst(tya)) { - Setattr(n,"feature:immutable","1"); - } - } - DohIncref(type); - Setattr(n,"type",ty); - variableHandler(n); - Setattr(n,"type",type); - Setattr(n,"decl",decl); - Delete(ty); - Delete(type); - Delete(fullty); - return SWIG_OK; - } -} - -/* ---------------------------------------------------------------------- - * Language::functionHandler() - * ---------------------------------------------------------------------- */ - -int -Language::functionHandler(Node *n) { - Parm *p; - p = Getattr(n,"parms"); - if (CPlusPlus) patch_parms(p); - if (!CurrentClass) { - globalfunctionHandler(n); - } else { - String *storage = Getattr(n,"storage"); - if (Cmp(storage,"static") == 0) { - staticmemberfunctionHandler(n); - } else { - memberfunctionHandler(n); - } - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::globalfunctionHandler() - * ---------------------------------------------------------------------- */ - -int -Language::globalfunctionHandler(Node *n) { - - Swig_require(&n,"name","sym:name","type","?parms",NIL); - - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *storage = Getattr(n,"storage"); - ParmList *parms = Getattr(n,"parms"); - - if (0 && (Cmp(storage,"static") == 0)) { - Swig_restore(&n); - return SWIG_NOWRAP; /* Can't wrap static functions */ - } else { - /* Check for callback mode */ - String *cb = Getattr(n,"feature:callback"); - if (cb) { - String *cbname = NewStringf(cb,symname); - callbackfunctionHandler(n); - if (Cmp(cbname, symname) == 0) { - Delete(cbname); - Swig_restore(&n); - return SWIG_NOWRAP; - } - Delete(cbname); - } - Setattr(n,"parms",nonvoid_parms(parms)); - Setattr(n,"wrap:action", Swig_cresult(type,"result", Swig_cfunction_call(name,parms))); - functionWrapper(n); - } - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::callbackfunctionHandler() - * ---------------------------------------------------------------------- */ - -int -Language::callbackfunctionHandler(Node *n) { - Swig_require(&n,"name","*sym:name","*type","?value",NIL); - String *symname = Getattr(n,"sym:name"); - String *type = Getattr(n,"type"); - String *name = Getattr(n,"name"); - String *parms = Getattr(n,"parms"); - String *cb = Getattr(n,"feature:callback"); - String *cbname = NewStringf(cb,symname); - SwigType *cbty = Copy(type); - SwigType_add_function(cbty,parms); - SwigType_add_pointer(cbty); - - Setattr(n,"sym:name", cbname); - Setattr(n,"type", cbty); - Setattr(n,"value", name); - - constantWrapper(n); - Delete(cbname); - Delete(cbty); - - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::memberfunctionHandler() - * ---------------------------------------------------------------------- */ - -int -Language::memberfunctionHandler(Node *n) { - - Swig_require(&n,"*name","*sym:name","*type","?parms","?value",NIL); - - String *storage = Getattr(n,"storage"); - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - ParmList *parms = Getattr(n,"parms"); - String *cb; - - if (Cmp(storage,"virtual") == 0) { - if (Cmp(value,"0") == 0) { - IsVirtual = PURE_VIRTUAL; - } else { - IsVirtual = PLAIN_VIRTUAL; - } - } else { - IsVirtual = 0; - } - cb = Getattr(n,"feature:callback"); - if (cb) { - Node *cb = NewHash(); - String *cbname = NewStringf(cb,symname); - String *cbvalue; - SwigType *cbty = Copy(type); - SwigType_add_function(cbty,parms); - SwigType_add_memberpointer(cbty,ClassName); - cbvalue = NewStringf("&%s::%s",ClassName,name); - Setattr(cb,"sym:name", cbname); - Setattr(cb,"type", cbty); - Setattr(cb,"value", cbvalue); - Setattr(cb,"name", name); - - memberconstantHandler(n); - - Delete(cb); - Delete(cbvalue); - Delete(cbty); - Delete(cbname); - if (Cmp(cbname,symname) == 0) { - Swig_restore(&n); - return SWIG_NOWRAP; - } - } - - String *fname = Swig_name_member(ClassPrefix, symname); - /* Transformation */ - Swig_MethodToFunction(n,ClassType, Getattr(n,"template") ? 0 : Extend | SmartPointer); - Setattr(n,"sym:name",fname); - functionWrapper(n); - - /* DelWrapper(w);*/ - Delete(fname); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::staticmemberfunctionHandler() - * ---------------------------------------------------------------------- */ - -int -Language::staticmemberfunctionHandler(Node *n) { - - Swig_require(&n,"*name","*sym:name","*type",NIL); - Swig_save(&n,"storage",NIL); - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - ParmList *parms = Getattr(n,"parms"); - String *code = Getattr(n,"code"); - String *cname, *mrename; - - if (!Extend) { - cname = NewStringf("%s::%s",ClassName,name); - } else { - cname = Copy(Swig_name_member(ClassPrefix,name)); - } - mrename = Swig_name_member(ClassPrefix, symname); - - Setattr(n,"name",cname); - Setattr(n,"sym:name",mrename); - - if ((Extend) && (code)) { - /* Hmmm. An added static member. We have to create a little wrapper for this */ - String *tmp = NewStringf("%s(%s)", cname, ParmList_str(parms)); - String *wrap = SwigType_str(type,tmp); - Printv(wrap,code,"\n",NIL); - Setattr(n,"wrap:code",wrap); - Delete(tmp); - Delete(wrap); - } - Delattr(n,"storage"); - globalfunctionHandler(n); - - Delete(cname); - Delete(mrename); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::variableHandler() - * ---------------------------------------------------------------------- */ - -int -Language::variableHandler(Node *n) { - if (!CurrentClass) { - globalvariableHandler(n); - } else { - String *storage = Getattr(n,"storage"); - if ((Cmp(storage,"static") == 0)) { - if (!SmartPointer) { - staticmembervariableHandler(n); - } - } else { - membervariableHandler(n); - } - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::globalvariableHandler() - * ---------------------------------------------------------------------- */ - -int -Language::globalvariableHandler(Node *n) { - String *storage = Getattr(n,"storage"); - if (0 && (Cmp(storage,"static") == 0)) return SWIG_NOWRAP; - variableWrapper(n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::membervariableHandler() - * ---------------------------------------------------------------------- */ - -int -Language::membervariableHandler(Node *n) { - - Swig_require(&n,"*name","*sym:name","*type",NIL); - Swig_save(&n,"parms",NIL); - - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - - /* If not a smart-pointer access or added method. We clear - feature:except. There is no way C++ or C would throw - an exception merely for accessing a member data - */ - - if (!(Extend | SmartPointer)) { - Delattr(n,"feature:except"); - } - - if (!AttributeFunctionGet) { - - String *mrename_get, *mrename_set; - - mrename_get = Swig_name_get(Swig_name_member(ClassPrefix, symname)); - mrename_set = Swig_name_set(Swig_name_member(ClassPrefix, symname)); - - /* Create a function to set the value of the variable */ - - if (!Getattr(n,"feature:immutable")) { - int make_wrapper = 1; - String *tm = 0; - String *target = 0; - if (!Extend) { - target = NewStringf("%s->%s", Swig_cparm_name(0,0),name); - tm = Swig_typemap_lookup_new("memberin",n,target,0); - } - Swig_MembersetToFunction(n,ClassType,Extend | SmartPointer); - if (!Extend) { - /* Check for a member in typemap here */ - - /* String *tm = Swig_typemap_lookup((char *) "memberin",type,name,target,Swig_cparm_name(0,1),target,0);*/ - if (!tm) { - if (SwigType_isarray(type)) { - /* Printf(stderr,"%s:%d. Warning. Array member %s will be read-only.\n", input_file, line_number, name);*/ - make_wrapper = 0; - } - } else { - Replace(tm,"$source", Swig_cparm_name(0,1), DOH_REPLACE_ANY); - Replace(tm,"$target", target, DOH_REPLACE_ANY); - Replace(tm,"$input",Swig_cparm_name(0,1),DOH_REPLACE_ANY); - Replace(tm,"$self",Swig_cparm_name(0,0),DOH_REPLACE_ANY); - Setattr(n,"wrap:action", tm); - Delete(tm); - } - Delete(target); - } - if (make_wrapper) { - Setattr(n,"sym:name", mrename_set); - functionWrapper(n); - } else { - Setattr(n,"feature:immutable","1"); - } - /* Restore parameters */ - Setattr(n,"type",type); - Setattr(n,"name",name); - Setattr(n,"sym:name",symname); - } - /* Emit get function */ - { - Swig_MembergetToFunction(n,ClassType,Extend | SmartPointer); - Setattr(n,"sym:name", mrename_get); - functionWrapper(n); - } - Delete(mrename_get); - Delete(mrename_set); - - } else { - - /* This code is used to support the attributefunction directive - where member variables are converted automagically to - accessor functions */ - -#if 0 - Parm *p; - String *gname; - SwigType *vty; - p = NewParm(type,0); - gname = NewStringf(AttributeFunctionGet,symname); - if (!Extend) { - ActionFunc = Copy(Swig_cmemberget_call(name,type)); - cpp_member_func(Char(gname),Char(gname),type,0); - Delete(ActionFunc); - } else { - String *cname = Copy(Swig_name_get(name)); - cpp_member_func(Char(cname),Char(gname),type,0); - Delete(cname); - } - Delete(gname); - if (!Getattr(n,"feature:immutable")) { - gname = NewStringf(AttributeFunctionSet,symname); - vty = NewString("void"); - if (!Extend) { - ActionFunc = Copy(Swig_cmemberset_call(name,type)); - cpp_member_func(Char(gname),Char(gname),vty,p); - Delete(ActionFunc); - } else { - String *cname = Copy(Swig_name_set(name)); - cpp_member_func(Char(cname),Char(gname),vty,p); - Delete(cname); - } - Delete(gname); - } - ActionFunc = 0; -#endif - } - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::staticmembervariableHandler() - * ---------------------------------------------------------------------- */ - -int -Language::staticmembervariableHandler(Node *n) -{ - Swig_require(&n,"*name","*sym:name","*type", "?value", NIL); - String *value = Getattr(n,"value"); - if (!value) { - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - String *cname, *mrename; - - /* Create the variable name */ - mrename = Swig_name_member(ClassPrefix, symname); - cname = NewStringf("%s::%s", ClassName,name); - - Setattr(n,"sym:name",mrename); - Setattr(n,"name", cname); - - /* Wrap as an ordinary global variable */ - variableWrapper(n); - - Delete(mrename); - Delete(cname); - } else { - String *name = Getattr(n,"name"); - String *cname = NewStringf("%s::%s", ClassName,name); - String* value = SwigType_namestr(cname); - Setattr(n, "value", value); - - SwigType *t1 = SwigType_typedef_resolve_all(Getattr(n,"type")); - SwigType *t2 = SwigType_strip_qualifiers(t1); - Setattr(n, "type", t2); - Delete(t1); - Delete(t2); - - memberconstantHandler(n); - Delete(cname); - } - - Swig_restore(&n); - return SWIG_OK; -} - - -/* ---------------------------------------------------------------------- - * Language::externDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::externDeclaration(Node *n) { - return emit_children(n); -} - -/* ---------------------------------------------------------------------- - * Language::enumDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::enumDeclaration(Node *n) { - if (!ImportMode) { - emit_children(n); - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::enumvalueDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::enumvalueDeclaration(Node *n) { - if (CurrentClass && (cplus_mode != CPLUS_PUBLIC)) return SWIG_NOWRAP; - - Swig_require(&n,"*name", "?value",NIL); - String *value = Getattr(n,"value"); - String *name = Getattr(n,"name"); - String *tmpValue; - - if (value) - tmpValue = NewString(value); - else - tmpValue = NewString(name); - Setattr(n, "value", tmpValue); - - if (!CurrentClass) { - Setattr(n,"name",tmpValue); /* for wrapping of enums in a namespace when emit_action is used */ - constantWrapper(n); - } else { - memberconstantHandler(n); - } - - Delete(tmpValue); - Swig_restore(&n); - return SWIG_OK; -} - -/* ----------------------------------------------------------------------------- - * Language::memberconstantHandler() - * ----------------------------------------------------------------------------- */ - -int Language::memberconstantHandler(Node *n) { - - Swig_require(&n,"*name","*sym:name","*value",NIL); - - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - String *value = Getattr(n,"value"); - - String *mrename; - String *new_value; - - mrename = Swig_name_member(ClassPrefix, symname); - /* Fixed by namespace-enum patch - if ((!value) || (Cmp(value,name) == 0)) { - new_value = NewStringf("%s::%s",ClassName,name); - } else { - new_value = NewString(value); - } - */ - new_value = Copy(value); - Setattr(n,"sym:name", mrename); - Setattr(n,"value", new_value); - Setattr(n,"name", NewStringf("%s::%s", ClassName,name)); - constantWrapper(n); - Delete(mrename); - Delete(new_value); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::typedefHandler() - * ---------------------------------------------------------------------- */ - -int Language::typedefHandler(Node *) { - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::classDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::classDeclaration(Node *n) { - String *kind = Getattr(n,"kind"); - String *name = Getattr(n,"name"); - String *tdname = Getattr(n,"tdname"); - String *symname = Getattr(n,"sym:name"); - - char *classname = tdname ? Char(tdname) : Char(name); - char *iname = Char(symname); - int strip = (tdname || CPlusPlus) ? 1 : 0; - - - if (!classname) { - Swig_warning(WARN_LANG_CLASS_UNNAMED, input_file, line_number, "Can't generate wrappers for unnamed struct/class.\n"); - return SWIG_NOWRAP; - } - - /* Check symbol name for template. If not renamed. Issue a warning */ - /* Printf(stdout,"sym:name = %s\n", symname); */ - - if (!validIdentifier(symname)) { - Swig_warning(WARN_LANG_IDENTIFIER, input_file, line_number, "Can't wrap class %s unless renamed to a valid identifier.\n", - SwigType_namestr(symname)); - return SWIG_NOWRAP; - } - - Swig_save(&n,"name",NIL); - Setattr(n,"name",classname); - - if (Cmp(kind,"class") == 0) { - cplus_mode = CPLUS_PRIVATE; - } else { - cplus_mode = CPLUS_PUBLIC; - } - - ClassName = NewString(classname); - ClassPrefix = NewString(iname); - if (strip) { - ClassType = NewString(classname); - } else { - ClassType = NewStringf("%s %s", kind, classname); - } - Setattr(n,"classtype", SwigType_namestr(ClassType)); - - InClass = 1; - CurrentClass = n; - - if (Getattr(n,"abstract")) { - Abstract = 1; - } else { - Abstract = 0; - } - - /* Call classHandler() here */ - if (!ImportMode) - classHandler(n); - else - Language::classHandler(n); - - InClass = 0; - CurrentClass = 0; - Delete(ClassType); ClassType = 0; - Delete(ClassPrefix); ClassPrefix = 0; - Delete(ClassName); ClassName = 0; - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::classHandler() - * ---------------------------------------------------------------------- */ - -int Language::classHandler(Node *n) { - - /* Emit all of the class members */ - emit_children(n); - - /* Look for smart pointer handling */ - if (Getattr(n,"allocate:smartpointer")) { - List *methods = Getattr(n,"allocate:smartpointer"); - cplus_mode = CPLUS_PUBLIC; - SmartPointer = CWRAP_SMART_POINTER; - Node *c; - for (c = Firstitem(methods); c; c= Nextitem(methods)) { - /* Swig_print_node(c); */ - emit_one(c); - } - SmartPointer = 0; - } - - cplus_mode = CPLUS_PUBLIC; - if (!ImportMode && (GenerateDefault && !Getattr(n,"feature:nodefault"))) { - if (!Getattr(n,"has_constructor") && !Getattr(n,"allocate:has_constructor") && (Getattr(n,"allocate:default_constructor"))) { - /* Note: will need to change this to support different kinds of classes */ - if (!Abstract) { - Setattr(CurrentClass,"feature:new","1"); - constructorHandler(CurrentClass); - Delattr(CurrentClass,"feature:new"); - } - } - if (!Getattr(n,"has_destructor") && (!Getattr(n,"allocate:has_destructor")) && (Getattr(n,"allocate:default_destructor"))) { - destructorHandler(CurrentClass); - } - } - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::classforwardDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::classforwardDeclaration(Node *n) { - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::constructorDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::constructorDeclaration(Node *n) { - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - - if (!CurrentClass) return SWIG_NOWRAP; - if (cplus_mode != CPLUS_PUBLIC) return SWIG_NOWRAP; - if (ImportMode) return SWIG_NOWRAP; - - /* Name adjustment for %name */ - Swig_save(&n,"sym:name",NIL); - - { - String *base = Swig_scopename_last(name); - if ((Strcmp(base,symname) == 0) && (Strcmp(symname, ClassPrefix) != 0)) { - Setattr(n,"sym:name", ClassPrefix); - } - Delete(base); - } - /* Only create a constructor if the class is not abstract */ - - if (!Abstract) { - Node *over; - over = Swig_symbol_isoverloaded(n); - if (over) over = first_nontemplate(over); - if ((over) && (!overloading)) { - /* If the symbol is overloaded. We check to see if it is a copy constructor. If so, - we invoke copyconstructorHandler() as a special case. */ - if (Getattr(n,"copy_constructor") && (!Getattr(CurrentClass,"has_copy_constructor"))) { - copyconstructorHandler(n); - Setattr(CurrentClass,"has_copy_constructor","1"); - } else { - if (Getattr(over,"copy_constructor")) over = Getattr(over,"sym:nextSibling"); - if (over != n) { - String *oname = NewStringf("%s::%s", ClassName, Swig_scopename_last(SwigType_namestr(name))); - String *cname = NewStringf("%s::%s", ClassName, Swig_scopename_last(SwigType_namestr(Getattr(over,"name")))); - SwigType *decl = Getattr(n,"decl"); - Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, input_file, line_number, - "Overloaded constructor ignored. %s\n", SwigType_str(decl,SwigType_namestr(oname))); - Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, Getfile(over), Getline(over), - "Previous declaration is %s\n", SwigType_str(Getattr(over,"decl"),SwigType_namestr(cname))); - Delete(oname); - Delete(cname); - } else { - constructorHandler(n); - } - } - } else { - if (name && (Cmp(name,ClassName)) && !(Getattr(n,"template"))) { - Printf(stdout,"name = '%s', ClassName='%s'\n", name, ClassName); - Swig_warning(WARN_LANG_RETURN_TYPE, input_file,line_number,"Function %s must have a return type.\n", - name); - Swig_restore(&n); - return SWIG_NOWRAP; - } - constructorHandler(n); - } - } - Setattr(CurrentClass,"has_constructor","1"); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::constructorHandler() - * ---------------------------------------------------------------------- */ - -int -Language::constructorHandler(Node *n) { - Swig_require(&n,"?name","*sym:name","?type","?parms",NIL); - String *symname = Getattr(n,"sym:name"); - String *mrename; - Parm *parms = Getattr(n,"parms"); - - mrename = Swig_name_construct(symname); - if (CPlusPlus) patch_parms(parms); - Swig_ConstructorToFunction(n,ClassType,CPlusPlus,Getattr(n,"template") ? 0 :Extend); - Setattr(n,"sym:name", mrename); - functionWrapper(n); - Delete(mrename); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::copyconstructorHandler() - * ---------------------------------------------------------------------- */ - -int -Language::copyconstructorHandler(Node *n) { - Swig_require(&n,"?name","*sym:name","?type","?parms", NIL); - String *symname = Getattr(n,"sym:name"); - String *mrename; - Parm *parms = Getattr(n,"parms"); - if (CPlusPlus) patch_parms(parms); - mrename = Swig_name_copyconstructor(symname); - Swig_ConstructorToFunction(n,ClassType, CPlusPlus, Getattr(n,"template") ? 0 : Extend); - Setattr(n,"sym:name", mrename); - functionWrapper(n); - Delete(mrename); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::destructorDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::destructorDeclaration(Node *n) { - - if (!CurrentClass) return SWIG_NOWRAP; - if (cplus_mode != CPLUS_PUBLIC) return SWIG_NOWRAP; - if (ImportMode) return SWIG_NOWRAP; - - Swig_save(&n,"name", "sym:name",NIL); - - char *c = GetChar(n,"name"); - if (c && (*c == '~')) Setattr(n,"name",c+1); - - c = GetChar(n,"sym:name"); - if (c && (*c == '~')) Setattr(n,"sym:name",c+1); - - /* Name adjustment for %name */ - - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - - if ((Strcmp(name,symname) == 0) || (Strcmp(symname,ClassPrefix) != 0)) { - Setattr(n,"sym:name", ClassPrefix); - } - - destructorHandler(n); - - Setattr(CurrentClass,"has_destructor","1"); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::destructorHandler() - * ---------------------------------------------------------------------- */ - -int Language::destructorHandler(Node *n) { - Swig_require(&n,"?name","*sym:name",NIL); - Swig_save(&n,"type","parms",NIL); - - String *symname = Getattr(n,"sym:name"); - String *mrename; - char *csymname = Char(symname); - if (csymname && (*csymname == '~')) csymname +=1; - - mrename = Swig_name_destroy(csymname); - - Swig_DestructorToFunction(n,ClassType,CPlusPlus,Extend); - Setattr(n,"sym:name", mrename); - functionWrapper(n); - Delete(mrename); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::accessDeclaration() - * ---------------------------------------------------------------------- */ - -int Language::accessDeclaration(Node *n) { - String *kind = Getattr(n,"kind"); - if (Cmp(kind,"public") == 0) { - cplus_mode = CPLUS_PUBLIC; - } else if (Cmp(kind,"private") == 0) { - cplus_mode = CPLUS_PRIVATE; - } else if (Cmp(kind,"protected") == 0) { - cplus_mode = CPLUS_PROTECTED; - } - return SWIG_OK; -} - -/* ----------------------------------------------------------------------------- - * Language::namespaceDeclaration() - * ----------------------------------------------------------------------------- */ - -int Language::namespaceDeclaration(Node *n) { - if (Getattr(n,"alias")) return SWIG_OK; - emit_children(n); - return SWIG_OK; -} - -int Language::validIdentifier(String *s) { - char *c = Char(s); - while (*c) { - if (!(isalnum(*c) || (*c == '_'))) return 0; - c++; - } - return 1; -} - -/* ----------------------------------------------------------------------------- - * Language::usingDeclaration() - * ----------------------------------------------------------------------------- */ - -int Language::usingDeclaration(Node *n) { - if (cplus_mode == CPLUS_PUBLIC) { - emit_children(n); - } - return SWIG_OK; -} - -/* Stubs. Language modules need to implement these */ - -/* ---------------------------------------------------------------------- - * Language::constantWrapper() - * ---------------------------------------------------------------------- */ - -int Language::constantWrapper(Node *n) { - String *name = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - - Printf(stdout,"constantWrapper : %s = %s\n", SwigType_str(type,name), value); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::variableWrapper() - * ---------------------------------------------------------------------- */ -int Language::variableWrapper(Node *n) { - Swig_require(&n,"*name","*sym:name","*type","?parms",NIL); - String *symname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *name = Getattr(n,"name"); - - /* If no way to set variables. We simply create functions */ - if (!Getattr(n,"feature:immutable")) { - int make_wrapper = 1; - String *tm = Swig_typemap_lookup_new("globalin", n, name, 0); - - Swig_VarsetToFunction(n); - Setattr(n,"sym:name", Swig_name_set(symname)); - - /* String *tm = Swig_typemap_lookup((char *) "globalin",type,name,name,Swig_cparm_name(0,0),name,0);*/ - - if (!tm) { - if (SwigType_isarray(type)) { - /* Printf(stderr,"%s:%d. Warning. Array member %s will be read-only.\n", input_file, line_number, name);*/ - make_wrapper = 0; - } - } else { - Replace(tm,"$source", Swig_cparm_name(0,0), DOH_REPLACE_ANY); - Replace(tm,"$target", name, DOH_REPLACE_ANY); - Replace(tm,"$input",Swig_cparm_name(0,0),DOH_REPLACE_ANY); - Setattr(n,"wrap:action", tm); - Delete(tm); - } - if (make_wrapper) { - functionWrapper(n); - } - Setattr(n,"sym:name",symname); - Setattr(n,"type",type); - Setattr(n,"name",name); - } - Swig_VargetToFunction(n); - Setattr(n,"sym:name", Swig_name_get(symname)); - functionWrapper(n); - Swig_restore(&n); - return SWIG_OK; -} - -/* ---------------------------------------------------------------------- - * Language::functionWrapper() - * ---------------------------------------------------------------------- */ - -int Language::functionWrapper(Node *n) { - String *name = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - ParmList *parms = Getattr(n,"parms"); - - Printf(stdout,"functionWrapper : %s\n", SwigType_str(type, NewStringf("%s(%s)", name, ParmList_str(parms)))); - Printf(stdout," action : %s\n", Getattr(n,"wrap:action")); - return SWIG_OK; -} - -/* ----------------------------------------------------------------------------- - * Language::nativeWrapper() - * ----------------------------------------------------------------------------- */ - -int Language::nativeWrapper(Node *n) { - return SWIG_OK; -} - -void Language::main(int argc, char *argv[]) { -} - -/* ----------------------------------------------------------------------------- - * Language::addSymbol() - * - * Adds a symbol entry. Returns 1 if the symbol is added successfully. - * Prints an error message and returns 0 if a conflict occurs. - * ----------------------------------------------------------------------------- */ - -int -Language::addSymbol(String *s, Node *n) { - Node *c = Getattr(symbols,s); - if (c && (c != n)) { - Swig_error(input_file, line_number, "Error. '%s' is multiply defined in the generated module.\n", s); - Swig_error(Getfile(c),Getline(c), "Previous declaration of '%s'\n", s); - return 0; - } - Setattr(symbols,s,n); - return 1; -} - -/* ----------------------------------------------------------------------------- - * Language::symbolLookup() - * ----------------------------------------------------------------------------- */ - -Node * -Language::symbolLookup(String *s) { - return Getattr(symbols,s); -} - -/* ----------------------------------------------------------------------------- - * Language::classLookup() - * - * Tries to locate a class from a type definition - * ----------------------------------------------------------------------------- */ - -Node * -Language::classLookup(SwigType *s) { - Node *n = 0; - SwigType *lt, *ty1,*ty2; - String *base; - String *prefix; - Symtab *stab = 0; - - /* Look in hash of cached values */ - n = Getattr(classtypes,s); - if (n) return n; - - lt = SwigType_ltype(s); - ty1 = SwigType_typedef_resolve_all(lt); - ty2 = SwigType_strip_qualifiers(ty1); - Delete(lt); - Delete(ty1); - - base = SwigType_base(ty2); - - Replaceall(base,"class ",""); - Replaceall(base,"struct ",""); - Replaceall(base,"union ",""); - - prefix = SwigType_prefix(ty2); - - while (!n) { - Hash *nstab; - n = Swig_symbol_clookup(base,stab); - if (!n) break; - if (Strcmp(nodeType(n),"class") == 0) break; - n = parentNode(n); - if (!n) break; - nstab = Getattr(n,"sym:symtab"); - n = 0; - if ((!nstab) || (nstab == stab)) { - break; - } - stab = nstab; - } - /* Do a symbol table search on the base type */ - /* n = Swig_symbol_clookup(base,0); */ - if (n) { - /* Found a match. Look at the prefix. We only allow - a few cases: pointers, references, and simple */ - if ((Len(prefix) == 0) || /* Simple type */ - (Strcmp(prefix,"p.") == 0) || /* pointer */ - (Strcmp(prefix,"r.") == 0)) { /* reference */ - Setattr(classtypes,Copy(s),n); - } else { - n = 0; - } - } - Delete(ty2); - Delete(base); - Delete(prefix); - - if (n && (Getattr(n,"feature:ignore"))) return 0; - return n; -} - -/* ----------------------------------------------------------------------------- - * Language::allow_overloading() - * ----------------------------------------------------------------------------- */ - -void Language::allow_overloading(int val) { - overloading = val; -} - -/* ----------------------------------------------------------------------------- - * Language::allow_multiple_input() - * ----------------------------------------------------------------------------- */ - -void Language::allow_multiple_input(int val) { - multiinput = val; -} - -/* ----------------------------------------------------------------------------- - * Language::is_wrapping_class() - * ----------------------------------------------------------------------------- */ - -int Language::is_wrapping_class() { - return InClass; -} - -/* ----------------------------------------------------------------------------- - * Language::getCurrentClass() - * ----------------------------------------------------------------------------- */ - -Node * Language::getCurrentClass() const { - return CurrentClass; -} - -/* ----------------------------------------------------------------------------- - * Language::getClassName() - * ----------------------------------------------------------------------------- */ - -String * Language::getClassName() const { - return ClassName; -} - -/* ----------------------------------------------------------------------------- - * Language::getClassPrefix() - * ----------------------------------------------------------------------------- */ - -String * Language::getClassPrefix() const { - return ClassPrefix; -} - -/* ----------------------------------------------------------------------------- - * Language::getClassType() - * ----------------------------------------------------------------------------- */ - -String * Language::getClassType() const { - return ClassType; -} diff --git a/Source/Modules1.1/main.cxx b/Source/Modules1.1/main.cxx deleted file mode 100644 index 2cbdbec66..000000000 --- a/Source/Modules1.1/main.cxx +++ /dev/null @@ -1,622 +0,0 @@ -/* ----------------------------------------------------------------------------- - * main.cxx - * - * Main entry point to the SWIG core. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1998-2000. The University of Chicago - * Copyright (C) 1995-1998. The University of Utah and The Regents of the - * University of California. - * - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_main_cxx[] = "$Header$"; - -#if defined(_WIN32) -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#include "swigmod.h" -#ifndef MACSWIG -#include "swigconfig.h" -#endif - -#include "swigwarn.h" - -extern "C" { -#include "preprocessor.h" -} - -#include - -#ifndef SWIG_LIB -#define SWIG_LIB "/usr/local/lib/swig1.3" -#endif - -#ifndef SWIG_CC -#define SWIG_CC "CC" -#endif - -// Global variables - - char LibDir[512]; // Library directory - Language *lang; // Language method - int CPlusPlus = 0; - int Extend = 0; // Extend flag - int ForceExtern = 0; // Force extern mode - int GenerateDefault = 1; // Generate default constructors - char *Config = 0; - int NoInclude = 0; - int Verbose = 0; - int NoExtern = 0; - int NoExcept = 0; - -extern "C" { -extern String *ModuleName; -} - -static char *usage = (char*)"\ -\nGeneral Options\n\ - -c - Produce raw wrapper code (omit support code)\n\ - -c++ - Enable C++ processing\n\ - -co - Check a file out of the SWIG library\n\ - -Dsymbol - Define a symbol (for conditional compilation)\n\ - -I - Look for SWIG files in \n\ - -includeall - Follow all #include statements\n\ - -importall - Follow all #include statements as imports\n\ - -ignoremissing - Ignore missing include files.\n\ - -l - Include SWIG library file.\n\ - -M - List all dependencies. \n\ - -MM - List dependencies, but omit files in SWIG library.\n\ - -makedefault - Create default constructors/destructors (the default)\n\ - -module - Set module name\n\ - -nodefault - Do not generate constructors/destructors\n\ - -noexcept - Do not wrap exception specifiers.\n\ - -noextern - Do not generate extern declarations.\n\ - -o outfile - Set name of the output file.\n\ - -swiglib - Report location of SWIG library and exit\n\ - -v - Run in verbose mode\n\ - -version - Print SWIG version number\n\ - -Wall - Enable all warning messages\n\ - -wn - Suppress warning number n\n\ - -help - This output.\n\n"; - -// ----------------------------------------------------------------------------- -// check_suffix(char *name) -// -// Checks the suffix of a file to see if we should emit extern declarations. -// ----------------------------------------------------------------------------- - -int -check_suffix(char *name) { - char *c; - if (!name) return 0; - c = Swig_file_suffix(name); - if ((strcmp(c,".c") == 0) || - (strcmp(c,".C") == 0) || - (strcmp(c,".cc") == 0) || - (strcmp(c,".cxx") == 0) || - (strcmp(c,".c++") == 0) || - (strcmp(c,".cpp") == 0)) { - return 1; - } - return 0; -} - -// ----------------------------------------------------------------------------- -// install_opts(int argc, char *argv[]) -// Install all command line options as preprocessor symbols -// ----------------------------------------------------------------------------- - -static void -install_opts(int argc, char *argv[]) { - int i; - int noopt = 0; - char *c; - for (i = 1; i < (argc-1); i++) { - if (argv[i]) { - if ((*argv[i] == '-') && (!isupper(*(argv[i]+1)))) { - String *opt = NewStringf("SWIGOPT%(upper)s", argv[i]); - Replaceall(opt,"-","_"); - c = Char(opt); - noopt = 0; - while (*c) { - if (!(isalnum(*c) || (*c == '_'))) { - noopt = 1; - break; - } - c++; - } - if (((i+1) < (argc-1)) && (argv[i+1]) && (*argv[i+1] != '-')) { - Printf(opt," %s", argv[i+1]); - i++; - } else { - Printf(opt," 1"); - } - if (!noopt) { - /* Printf(stdout,"%s\n", opt); */ - Preprocessor_define(opt, 0); - } - } - } - } -} -//----------------------------------------------------------------- -// main() -// -// Main program. Initializes the files and starts the parser. -//----------------------------------------------------------------- - -char *SwigLib; -static int freeze = 0; -static String *lang_config = 0; -static char *cpp_extension = (char *) "cxx"; - -/* This function sets the name of the configuration file */ - -void SWIG_config_file(const String_or_char *filename) { - lang_config = NewString(filename); -} - -void SWIG_library_directory(const char *filename) { - strcpy(LibDir,filename); -} - -void SWIG_config_cppext(const char *ext) { - cpp_extension = (char *) ext; -} - -extern "C" Node *Swig_cparse(File *); -extern "C" void Swig_cparse_cplusplus(int); -extern "C" void Swig_cparse_debug_templates(int); - -int SWIG_main(int argc, char *argv[], Language *l) { - int i; - char *c; - char temp[512]; - char *outfile_name = 0; - int help = 0; - int checkout = 0; - int cpp_only = 0; - int tm_debug = 0; - char *includefiles[256]; - int includecount = 0; - extern int check_suffix(char *); - int dump_tags = 0; - int dump_tree = 0; - int contracts = 0; - int browse = 0; - int dump_typedef = 0; - int dump_classes = 0; - int werror = 0; - int depend = 0; - - DOH *libfiles = 0; - DOH *cpps = 0 ; - extern void Swig_contracts(Node *n); - extern void Swig_browser(Node *n, int); - extern void Swig_default_allocators(Node *n); - extern void Swig_process_types(Node *n); - - - /* Initialize the SWIG core */ - Swig_init(); - - /* Suppress warning messages for private inheritance, preprocessor evaluation, - might be abstract, and overloaded const */ - - Swig_warnfilter("202,309,403,512",1); - - // Initialize the preprocessor - Preprocessor_init(); - - lang = l; - - // Set up some default symbols (available in both SWIG interface files - // and C files) - - Preprocessor_define((DOH *) "SWIG 1", 0); - Preprocessor_define((DOH *) "__STDC__", 0); -#ifdef MACSWIG - Preprocessor_define((DOH *) "SWIGMAC 1", 0); -#endif -#ifdef SWIGWIN32 - Preprocessor_define((DOH *) "SWIGWIN32 1", 0); -#endif - - // Set the SWIG version value - String *vers; - vers = NewStringf("SWIG_VERSION 0x%02d%02d%02d", SWIG_MAJOR_VERSION, SWIG_MINOR_VERSION, SWIG_SPIN); - Preprocessor_define(vers,0); - - // Check for SWIG_LIB environment variable - - if ((c = getenv("SWIG_LIB")) == (char *) 0) { -#if defined(_WIN32) - char buf[MAX_PATH]; - char *p; - if (GetModuleFileName(0, buf, MAX_PATH) == 0 - || (p = strrchr(buf, '\\')) == 0) { - Printf(stderr, "Warning: Could not determine SWIG library location. Assuming " SWIG_LIB "\n"); - sprintf(LibDir,"%s",SWIG_LIB); // Build up search paths - } else { - strcpy(p+1, "Lib"); - strcpy(LibDir, buf); - } -#else - sprintf(LibDir,"%s",SWIG_LIB); // Build up search paths -#endif - } else { - strcpy(LibDir,c); - } - - SwigLib = Swig_copy_string(LibDir); // Make a copy of the real library location - - libfiles = NewList(); - - // 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++] = Swig_copy_string(argv[i]+2); - Swig_mark_arg(i); - } else if (strncmp(argv[i],"-D",2) == 0) { - DOH *d = NewString(argv[i]+2); - Replace(d,(char*)"=",(char*)" ", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); - Preprocessor_define((DOH *) d,0); - // Create a symbol - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-E") == 0) { - cpp_only = 1; - Swig_mark_arg(i); - } else if ((strcmp(argv[i],"-verbose") == 0) || - (strcmp(argv[i],"-v") == 0)) { - Verbose = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-c++") == 0) { - CPlusPlus=1; - Preprocessor_define((DOH *) "__cplusplus 1", 0); - Swig_cparse_cplusplus(1); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-c") == 0) { - NoInclude=1; - Preprocessor_define((DOH *) "SWIG_NOINCLUDE 1", 0); - Swig_mark_arg(i); - } else if ((strcmp(argv[i],"-make_default") == 0) || (strcmp(argv[i],"-makedefault") == 0)) { - GenerateDefault = 1; - Swig_mark_arg(i); - } else if ((strcmp(argv[i],"-no_default") == 0) || (strcmp(argv[i],"-nodefault") == 0)) { - GenerateDefault = 0; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-noexcept") == 0) { - NoExcept = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-noextern") == 0) { - NoExtern = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-show_templates") == 0) { - Swig_cparse_debug_templates(1); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-swiglib") == 0) { - printf("%s\n", LibDir); - SWIG_exit (EXIT_SUCCESS); - } else if (strcmp(argv[i],"-o") == 0) { - Swig_mark_arg(i); - if (argv[i+1]) { - outfile_name = Swig_copy_string(argv[i+1]); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if (strcmp(argv[i],"-version") == 0) { - fprintf(stderr,"\nSWIG Version %s\n", - SWIG_VERSION); - fprintf(stderr,"Copyright (c) 1995-1998\n"); - fprintf(stderr,"University of Utah and the Regents of the University of California\n"); - fprintf(stderr,"Copyright (c) 1998-2002\n"); - fprintf(stderr,"University of Chicago\n"); - fprintf(stderr,"\nCompiled with %s\n", SWIG_CC); - SWIG_exit (EXIT_SUCCESS); - } else if (strncmp(argv[i],"-l",2) == 0) { - // Add a new directory search path - Append(libfiles,argv[i]+2); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-co") == 0) { - checkout = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-freeze") == 0) { - freeze = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-includeall") == 0) { - Preprocessor_include_all(1); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-importall") == 0) { - Preprocessor_import_all(1); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-ignoremissing") == 0) { - Preprocessor_ignore_missing(1); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-tm_debug") == 0) { - tm_debug = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-module") == 0) { - Swig_mark_arg(i); - if (argv[i+1]) { - ModuleName = NewString(argv[i+1]); - Swig_mark_arg(i+1); - } else { - Swig_arg_error(); - } - } else if (strcmp(argv[i],"-M") == 0) { - depend = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-MM") == 0) { - depend = 2; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-Wall") == 0) { - Swig_mark_arg(i); - Swig_warnall(); - } else if (strcmp(argv[i],"-Werror") == 0) { - werror = 1; - Swig_mark_arg(i); - } else if (strncmp(argv[i],"-w",2) == 0) { - Swig_mark_arg(i); - Swig_warnfilter(argv[i]+2,1); - } else if (strcmp(argv[i],"-dump_tags") == 0) { - dump_tags = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-dump_tree") == 0) { - dump_tree = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-contracts") == 0) { - Swig_mark_arg(i); - contracts = 1; - } else if (strcmp(argv[i],"-browse") == 0) { - browse = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-dump_typedef") == 0) { - dump_typedef = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-dump_classes") == 0) { - dump_classes = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-help") == 0) { - fputs(usage,stderr); - Swig_mark_arg(i); - help = 1; - } - } - } - - for (i = 0; i < includecount; i++) { - Swig_add_directory((DOH *) includefiles[i]); - } - - // Define the __cplusplus symbol - if (CPlusPlus) - Preprocessor_define((DOH *) "__cplusplus 1", 0); - - // Parse language dependent options - lang->main(argc,argv); - - if (help) SWIG_exit (EXIT_SUCCESS); // Exit if we're in help mode - - // Check all of the options to make sure we're cool. - Swig_check_options(); - - install_opts(argc, argv); - - // Add language dependent directory to the search path - { - DOH *rl = NewString(""); - Printf(rl,"%s%s%s", SwigLib, SWIG_FILE_DELIMETER, LibDir); - Swig_add_directory(rl); - rl = NewString(""); - Printf(rl,".%sswig_lib%s%s", SWIG_FILE_DELIMETER, SWIG_FILE_DELIMETER, LibDir); - Swig_add_directory(rl); - } - - sprintf(temp,"%s%sconfig", SwigLib, SWIG_FILE_DELIMETER); - Swig_add_directory((DOH *) temp); - Swig_add_directory((DOH *) "." SWIG_FILE_DELIMETER "swig_lib" SWIG_FILE_DELIMETER "config"); - Swig_add_directory((DOH *) SwigLib); - Swig_add_directory((DOH *) "." SWIG_FILE_DELIMETER "swig_lib"); - - if (Verbose) { - printf ("LibDir: %s\n", LibDir); - List *sp = Swig_search_path(); - String *s; - for (s = Firstitem(sp); s; s = Nextitem(sp)) { - Printf(stdout," %s\n", s); - } - } - - // If we made it this far, looks good. go for it.... - - input_file = argv[argc-1]; - - // If the user has requested to check out a file, handle that - if (checkout) { - DOH *s; - char *outfile = input_file; - if (outfile_name) - outfile = outfile_name; - - if (Verbose) - printf ("Handling checkout...\n"); - - s = Swig_include(input_file); - if (!s) { - fprintf(stderr,"Unable to locate '%s' in the SWIG library.\n", input_file); - } else { - FILE *f = fopen(outfile,"r"); - if (f) { - fclose(f); - fprintf(stderr,"File '%s' already exists. Checkout aborted.\n", outfile); - } else { - f = fopen(outfile,"w"); - if (!f) { - fprintf(stderr,"Unable to create file '%s'\n", outfile); - } else { - fprintf(stderr,"'%s' checked out from the SWIG library.\n", input_file); - fputs(Char(s),f); - fclose(f); - } - } - } - } else { - // Check the suffix for a .c file. If so, we're going to - // declare everything we see as "extern" - - ForceExtern = check_suffix(input_file); - - // Run the preprocessor - if (Verbose) - printf ("Preprocessing...\n"); - { - int i; - String *fs = NewString(""); - FILE *df = Swig_open(input_file); - if (!df) { - Printf(stderr,"Unable to find '%s'\n", input_file); - SWIG_exit (EXIT_FAILURE); - } - fclose(df); - Printf(fs,"%%include \"swig.swg\"\n"); - if (lang_config) { - Printf(fs,"\n%%include \"%s\"\n", lang_config); - } - Printf(fs,"%%include \"%s\"\n", Swig_last_file()); - for (i = 0; i < Len(libfiles); i++) { - Printf(fs,"\n%%include \"%s\"\n", Getitem(libfiles,i)); - } - Seek(fs,0,SEEK_SET); - cpps = Preprocessor_parse(fs); - if (Swig_error_count()) { - SWIG_exit(EXIT_FAILURE); - } - if (cpp_only) { - Printf(stdout,"%s", cpps); - while (freeze); - SWIG_exit (EXIT_SUCCESS); - } - if (depend) { - String *outfile; - if (!outfile_name) { - if (CPlusPlus) { - outfile = NewStringf("%s_wrap.%s", Swig_file_basename(input_file),cpp_extension); - } else { - outfile = NewStringf("%s_wrap.c", Swig_file_basename(input_file)); - } - } else { - outfile = NewString(outfile_name); - } - Printf(stdout,"%s: ", outfile); - List *files = Preprocessor_depend(); - for (int i = 0; i < Len(files); i++) { - if ((depend != 2) || ((depend == 2) && (Strncmp(Getitem(files,i),SwigLib, Len(SwigLib)) != 0))) { - Printf(stdout,"\\\n %s ", Getitem(files,i)); - } - } - Printf(stdout,"\n"); - SWIG_exit(EXIT_SUCCESS); - } - Seek(cpps, 0, SEEK_SET); - } - - /* Register a null file with the file handler */ - Swig_register_filebyname("null", NewString("")); - - // Pass control over to the specific language interpreter - if (Verbose) { - fprintf (stdout, "Starting language-specific parse...\n"); - fflush (stdout); - } - - Node *top = Swig_cparse(cpps); - - if (Verbose) { - Printf(stdout,"Processing types...\n"); - } - Swig_process_types(top); - - if (Verbose) { - Printf(stdout,"C++ analysis...\n"); - } - Swig_default_allocators(top); - - if (Verbose) { - Printf(stdout,"Generating wrappers...\n"); - } - - if (dump_classes) { - Hash *classes = Getattr(top,"classes"); - if (classes) { - Printf(stdout,"Classes\n"); - Printf(stdout,"------------\n"); - String *key; - for (key = Firstkey(classes); key; key = Nextkey(classes)) { - Printf(stdout,"%s\n", key); - } - } - } - - if (dump_typedef) { - SwigType_print_scope(0); - } - if (dump_tags) { - Swig_print_tags(top,0); - } - if (dump_tree) { - Swig_print_tree(top); - } - if (top) { - if (!Getattr(top,"name")) { - Printf(stderr,"*** No module name specified using %%module or -module.\n"); - SWIG_exit(EXIT_FAILURE); - } else { - /* Set some filename information on the object */ - Setattr(top,"infile", input_file); - if (!outfile_name) { - if (CPlusPlus) { - Setattr(top,"outfile", NewStringf("%s_wrap.%s", Swig_file_basename(input_file),cpp_extension)); - } else { - Setattr(top,"outfile", NewStringf("%s_wrap.c", Swig_file_basename(input_file))); - } - } else { - Setattr(top,"outfile", outfile_name); - } - if (contracts) { - Swig_contracts(top); - } - lang->top(top); - if (browse) { - Swig_browser(top,0); - } - } - } - } - if (tm_debug) Swig_typemap_debug(); - while (freeze); - if ((werror) && (Swig_warn_count())) { - return Swig_warn_count(); - } - return Swig_error_count(); -} - -// -------------------------------------------------------------------------- -// SWIG_exit(int exit_code) -// -// Cleanup and either freeze or exit -// -------------------------------------------------------------------------- - -void SWIG_exit(int exit_code) { - while (freeze); - exit (exit_code); -} - diff --git a/Source/Modules1.1/module.cxx b/Source/Modules1.1/module.cxx deleted file mode 100644 index 57aa6c304..000000000 --- a/Source/Modules1.1/module.cxx +++ /dev/null @@ -1,57 +0,0 @@ -/* ----------------------------------------------------------------------------- - * module.cxx - * - * This file is responsible for the module system. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1999-2000. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_module_cxx[] = "$Header$"; - -#include "swigmod.h" - -struct Module { - ModuleFactory fac; - char *name; - Module *next; - Module(const char *n, ModuleFactory f) { - fac = f; - name = new char[strlen(n)+1]; - strcpy(name, n); - next = 0; - } -}; - -static Module *modules = 0; - -/* ----------------------------------------------------------------------------- - * void Swig_register_module() - * - * Register a module. - * ----------------------------------------------------------------------------- */ - -void Swig_register_module(const char *n, ModuleFactory f) { - Module *m = new Module(n,f); - m->next = modules; - modules = m; -} - -/* ----------------------------------------------------------------------------- - * Language *Swig_find_module() - * - * Given a command line option, locates the factory function. - * ----------------------------------------------------------------------------- */ - -ModuleFactory Swig_find_module(const char *name) { - Module *m = modules; - while (m) { - if (strcmp(m->name,name) == 0) { - return m->fac; - } - m = m->next; - } - return 0; -} diff --git a/Source/Modules1.1/mzscheme.cxx b/Source/Modules1.1/mzscheme.cxx deleted file mode 100644 index 14e4a3ac2..000000000 --- a/Source/Modules1.1/mzscheme.cxx +++ /dev/null @@ -1,668 +0,0 @@ -/****************************************************************************** - * 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. - *****************************************************************************/ - -char cvsroot_mzscheme_cxx[] = "$Header$"; - -/*********************************************************************** - * $Header$ - * - * mzscheme.cxx - * - * Definitions for adding functions to Mzscheme 101 - ***********************************************************************/ - -#include "swigmod.h" - -#include - -static const char *mzscheme_usage = (char*)"\ -\n\ -Mzscheme Options (available with -mzscheme)\n\ --help - Print this help\n\ --prefix name - Set a prefix to be appended to all names\n\ --declaremodule - Create extension that declares a module\n\ -\n" -; - -static char *prefix=0; -static bool declaremodule = false; -static String *module=0; -static char *mzscheme_path=(char*)"mzscheme"; -static String *init_func_def = 0; - -static File *f_runtime = 0; -static File *f_header = 0; -static File *f_wrappers = 0; -static File *f_init = 0; - -class MZSCHEME : public Language { -public: - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main (int argc, char *argv[]) { - - int i; - - SWIG_library_directory(mzscheme_path); - - // Look for certain command line options - for (i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp (argv[i], "-help") == 0) { - fputs (mzscheme_usage, stderr); - SWIG_exit (0); - } - else if (strcmp (argv[i], "-prefix") == 0) { - if (argv[i + 1]) { - prefix = new char[strlen(argv[i + 1]) + 2]; - strcpy(prefix, argv[i + 1]); - Swig_mark_arg (i); - Swig_mark_arg (i + 1); - i++; - } else { - Swig_arg_error(); - } - } - else if (strcmp (argv[i], "-declaremodule") == 0) { - declaremodule = true; - Swig_mark_arg (i); - } - } - } - - // If a prefix has been specified make sure it ends in a '_' - - if (prefix) { - if (prefix[strlen (prefix)] != '_') { - prefix[strlen (prefix) + 1] = 0; - prefix[strlen (prefix)] = '_'; - } - } else - prefix = (char*)"swig_"; - - // Add a symbol for this module - - Preprocessor_define ("SWIGMZSCHEME 1",0); - - // Set name of typemaps - - SWIG_typemap_lang("mzscheme"); - - // Read in default typemaps */ - SWIG_config_file("mzscheme.i"); - allow_overloading(); - - } - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - - init_func_def = NewString(""); - Swig_register_filebyname("init",init_func_def); - - Printf(f_runtime, "/* -*- buffer-read-only: t -*- vi: set ro: */\n"); - Swig_banner (f_runtime); - - if (NoInclude) { - Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); - } - - module = Getattr(n,"name"); - - Language::top(n); - - SwigType_emit_type_table (f_runtime, f_wrappers); - Printf(f_init, "Scheme_Object *scheme_reload(Scheme_Env *env) {\n"); - Printf(f_init, "\tScheme_Env *menv = env;\n"); - if (declaremodule) { - Printf(f_init, "\tmenv = scheme_primitive_module(scheme_intern_symbol(\"%s\"), env);\n", module); - } - Printf (f_init, "\tSWIG_RegisterTypes(swig_types, swig_types_initial);\n"); - Printf(f_init, "%s\n", Char(init_func_def)); - if (declaremodule) { - Printf(f_init, "\tscheme_finish_primitive_module(menv);\n"); - } - Printf (f_init, "\treturn scheme_void;\n}\n"); - Printf(f_init, "Scheme_Object *scheme_initialize(Scheme_Env *env) {\n"); - Printf(f_init, "\treturn scheme_reload(env);\n"); - Printf (f_init, "}\n"); - - Printf(f_init,"Scheme_Object *scheme_module_name(void) {\n"); - if (declaremodule) { - Printf(f_init, " return scheme_intern_symbol((char*)\"%s\");\n", module); - } - else { - Printf(f_init," return scheme_make_symbol((char*)\"%s\");\n", module); - } - Printf(f_init,"}\n"); - - /* Close all of the files */ - Dump(f_header,f_runtime); - Dump(f_wrappers,f_runtime); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - Delete(f_runtime); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * functionWrapper() - * Create a function declaration and register it with the interpreter. - * ------------------------------------------------------------ */ - - void throw_unhandled_mzscheme_type_error (SwigType *d) - { - Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, - "Unable to handle type %s.\n", SwigType_str(d,0)); - } - - /* Return true iff T is a pointer type */ - - int - is_a_pointer (SwigType *t) - { - return SwigType_ispointer(SwigType_typedef_resolve_all(t)); - } - - virtual int functionWrapper(Node *n) { - char *iname = GetChar(n,"sym:name"); - SwigType *d = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - Parm *p; - - Wrapper *f = NewWrapper(); - String *proc_name = NewString(""); - String *source = NewString(""); - String *target = NewString(""); - String *arg = NewString(""); - String *cleanup = NewString(""); - String *outarg = NewString(""); - String *build = NewString(""); - String *tm; - int argout_set = 0; - int i = 0; - int numargs; - int numreq; - String *overname = 0; - - // Make a wrapper name for this - String *wname = Swig_name_wrapper(iname); - if (Getattr(n,"sym:overloaded")) { - overname = Getattr(n,"sym:overname"); - } else { - if (!addSymbol(iname,n)) return SWIG_ERROR; - } - if (overname) { - Append(wname, overname); - } - Setattr(n,"wrap:name",wname); - - // Build the name for Scheme. - Printv(proc_name, iname,NIL); - Replaceall(proc_name, "_", "-"); - - // writing the function wrapper function - Printv(f->def, "static Scheme_Object *", wname, " (", NIL); - Printv(f->def, "int argc, Scheme_Object **argv", NIL); - Printv(f->def, ")\n{", NIL); - - /* Define the scheme name in C. This define is used by several - macros. */ - Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); - - // Declare return variable and arguments - // number of parameters - // they are called arg0, arg1, ... - // the return value is called result - - emit_args(d, l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - - numargs = emit_num_arguments(l); - numreq = emit_num_required(l); - - // adds local variables - Wrapper_add_local(f, "_len", "int _len"); - Wrapper_add_local(f, "lenv", "int lenv = 1"); - Wrapper_add_local(f, "values", "Scheme_Object *values[MAXVALUES]"); - - // Now write code to extract the parameters (this is super ugly) - - for (i = 0, p = l; i < numargs; i++) { - /* Skip ignored arguments */ - - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *ln = Getattr(p,"lname"); - - // Produce names of source and target - Clear(source); - Clear(target); - Clear(arg); - Printf(source, "argv[%d]", i); - Printf(target, "%s",ln); - Printv(arg, Getattr(p,"name"),NIL); - - if (i >= numreq) { - Printf(f->code,"if (argc > %d) {\n",i); - } - // Handle parameter types. - if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$source",source); - Replaceall(tm,"$target",target); - Replaceall(tm,"$input",source); - Setattr(p,"emit:input",source); - Printv(f->code, tm, "\n", NIL); - p = Getattr(p,"tmap:in:next"); - } else { - // no typemap found - // check if typedef and resolve - throw_unhandled_mzscheme_type_error (pt); - p = nextSibling(p); - } - if (i >= numreq) { - Printf(f->code,"}\n"); - } - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - // Pass output arguments back to the caller. - - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"emit:input")); /* Deprecated */ - Replaceall(tm,"$target",Getattr(p,"lname")); /* Deprecated */ - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - argout_set = 1; - } else { - p = nextSibling(p); - } - } - - // Free up any memory allocated for the arguments. - - /* Insert cleanup code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - // Now write code to make the function call - - emit_action(n,f); - - // Now have return value, figure out what to do with it. - - if ((tm = Swig_typemap_lookup_new("out",n,"result",0))) { - Replaceall(tm,"$source","result"); - Replaceall(tm,"$target","values[0]"); - Replaceall(tm,"$result","values[0]"); - Printv(f->code, tm, "\n",NIL); - } else { - throw_unhandled_mzscheme_type_error (d); - } - - // Dump the argument output code - Printv(f->code, Char(outarg),NIL); - - // Dump the argument cleanup code - Printv(f->code, Char(cleanup),NIL); - - // Look for any remaining cleanup - - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printv(f->code, tm, "\n",NIL); - } - } - - // Free any memory allocated by the function being wrapped.. - - if ((tm = Swig_typemap_lookup_new("ret",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printv(f->code, tm, "\n",NIL); - } - - // Wrap things up (in a manner of speaking) - - Printv(f->code, tab4, "return swig_package_values(lenv, values);\n", NIL); - Printf(f->code, "#undef FUNC_NAME\n"); - Printv(f->code, "}\n",NIL); - - Wrapper_print(f, f_wrappers); - - if (!Getattr(n,"sym:overloaded")) { - - // Now register the function - char temp[256]; - sprintf(temp, "%d", numargs); - Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", - proc_name, wname, proc_name, numreq, numargs); - - } else { - if (!Getattr(n,"sym:nextSibling")) { - /* Emit overloading dispatch function */ - - int maxargs; - String *dispatch = Swig_overload_dispatch(n,"return %s(argc,argv);",&maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *df = NewWrapper(); - String *dname = Swig_name_wrapper(iname); - - Printv(df->def, - "static Scheme_Object *\n", dname, - "(int argc, Scheme_Object **argv) {", - NIL); - Printv(df->code,dispatch,"\n",NIL); - Printf(df->code,"scheme_signal_error(\"No matching function for overloaded '%s'\");\n", iname); - Printv(df->code,"}\n",NIL); - Wrapper_print(df,f_wrappers); - Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", - proc_name, dname, proc_name, 0, maxargs); - DelWrapper(df); - Delete(dispatch); - Delete(dname); - } - } - - Delete(proc_name); - Delete(source); - Delete(target); - Delete(arg); - Delete(outarg); - Delete(cleanup); - Delete(build); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * variableWrapper() - * - * Create a link to a C variable. - * This creates a single function _wrap_swig_var_varname(). - * This function takes a single optional argument. If supplied, it means - * we are setting this variable to some value. If omitted, it means we are - * simply evaluating this variable. Either way, we return the variables - * value. - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - - String *proc_name = NewString(""); - char var_name[256]; - String *tm; - String *tm2 = NewString("");; - String *argnum = NewString("0"); - String *arg = NewString("argv[0]"); - Wrapper *f; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - f = NewWrapper(); - - // evaluation function names - - strcpy(var_name, Char(Swig_name_wrapper(iname))); - - // Build the name for scheme. - Printv(proc_name, iname,NIL); - Replaceall(proc_name, "_", "-"); - - if ((SwigType_type(t) != T_USER) || (is_a_pointer(t))) { - - Printf (f->def, "static Scheme_Object *%s(int argc, Scheme_Object** argv) {\n", var_name); - Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); - - Wrapper_add_local (f, "swig_result", "Scheme_Object *swig_result"); - - if (!Getattr(n,"feature:immutable")) { - /* Check for a setting of the variable value */ - Printf (f->code, "if (argc) {\n"); - if ((tm = Swig_typemap_lookup_new("varin",n,name,0))) { - Replaceall(tm,"$source","argv[0]"); - Replaceall(tm,"$target",name); - Replaceall(tm,"$input","argv[0]"); - Printv(f->code, tm, "\n",NIL); - } - else { - throw_unhandled_mzscheme_type_error (t); - } - Printf (f->code, "}\n"); - } - - // Now return the value of the variable (regardless - // of evaluating or setting) - - if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { - Replaceall(tm,"$source",name); - Replaceall(tm,"$target","swig_result"); - Replaceall(tm,"$result","swig_result"); - Printf (f->code, "%s\n", tm); - } - else { - throw_unhandled_mzscheme_type_error (t); - } - Printf (f->code, "\nreturn swig_result;\n"); - Printf (f->code, "#undef FUNC_NAME\n"); - Printf (f->code, "}\n"); - - Wrapper_print (f, f_wrappers); - - // Now add symbol to the MzScheme interpreter - - Printv(init_func_def, - "scheme_add_global(\"", - proc_name, - "\", scheme_make_prim_w_arity(", - var_name, - ", \"", - proc_name, - "\", ", - "0", - ", ", - "1", - "), menv);\n",NIL); - - } else { - Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, - "Unsupported variable type %s (ignored).\n", SwigType_str(t,0)); - } - Delete(proc_name); - Delete(argnum); - Delete(arg); - Delete(tm2); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - - String *var_name = NewString(""); - String *proc_name = NewString(""); - String *rvalue = NewString(""); - String *temp = NewString(""); - String *tm; - - // Make a static variable; - - Printf (var_name, "_wrap_const_%s", Swig_name_mangle(iname)); - - // Build the name for scheme. - Printv(proc_name, iname,NIL); - Replaceall(proc_name, "_", "-"); - - if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, - "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } - - // See if there's a typemap - - Printv(rvalue, value,NIL); - if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 1)) { - temp = Copy(rvalue); - Clear(rvalue); - Printv(rvalue, "\"", temp, "\"",NIL); - } - if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 0)) { - Delete(temp); - temp = Copy(rvalue); - Clear(rvalue); - Printv(rvalue, "'", temp, "'",NIL); - } - if ((tm = Swig_typemap_lookup_new("constant",n,name,0))) { - Replaceall(tm,"$source",rvalue); - Replaceall(tm,"$value",rvalue); - Replaceall(tm,"$target",name); - Printf (f_init, "%s\n", tm); - } else { - // Create variable and assign it a value - - Printf (f_header, "static %s = ", SwigType_lstr(type,var_name)); - if ((SwigType_type(type) == T_STRING)) { - Printf (f_header, "\"%s\";\n", value); - } else if (SwigType_type(type) == T_CHAR) { - Printf (f_header, "\'%s\';\n", value); - } else { - Printf (f_header, "%s;\n", value); - } - - // Now create a variable declaration - - { - /* Hack alert: will cleanup later -- Dave */ - Node *n = NewHash(); - Setattr(n,"name",var_name); - Setattr(n,"sym:name",iname); - Setattr(n,"type", type); - variableWrapper(n); - Delete(n); - } - } - Delete(proc_name); - Delete(rvalue); - Delete(temp); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * validIdentifer() - * ------------------------------------------------------------ */ - - virtual int validIdentifier(String *s) { - char *c = Char(s); - /* Check whether we have an R5RS identifier.*/ - /* --> * | */ - /* --> | */ - if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~'))) { - /* --> + | - | ... */ - if ((strcmp(c, "+") == 0) - || strcmp(c, "-") == 0 - || strcmp(c, "...") == 0) return 1; - else return 0; - } - /* --> | | */ - while (*c) { - if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') - || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; - c++; - } - return 1; - } -}; - -/* ----------------------------------------------------------------------------- - * swig_mzscheme() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language * -swig_mzscheme(void) { - return new MZSCHEME(); -} - - diff --git a/Source/Modules1.1/ocaml.cxx b/Source/Modules1.1/ocaml.cxx deleted file mode 100755 index 786fee5dd..000000000 --- a/Source/Modules1.1/ocaml.cxx +++ /dev/null @@ -1,1072 +0,0 @@ -/* -*- c-indentation-style: gnu -*- */ -/****************************************************************************** - * Simplified Wrapper and Interface Generator (SWIG) - * - * Author : Art Yerkes - * Modified from mzscheme.cxx : David Beazley - * - * Please read the file LICENSE for the copyright and terms by which SWIG - * can be used and distributed. - *****************************************************************************/ - -char cvsroot_ocaml_cxx[] = "$Header$"; - -/*********************************************************************** - * $Header$ - * - * ocaml.cxx - * - * Definitions for adding functions to Ocaml 101 - ***********************************************************************/ - -#include "swigmod.h" - -#include - -static const char *ocaml_usage = (char*)"\ -\n\ -Ocaml Options (available with -ocaml)\n\ --help - Print this help\n\ --prefix name - Set a prefix to be appended to all names\n\ -\n"; - -static int classmode = 0; -static int in_constructor = 0, in_destructor = 0, in_copyconst = 0; -static int const_enum = 0; -static int static_member_function = 0; -static char *prefix=0; -static String *classname=0; -static String *module=0; -static char *ocaml_path=(char*)"ocaml"; -static String *init_func_def = 0; - -static Hash *seen_enums = 0; -static Hash *seen_enumvalues = 0; -static Hash *seen_constructors = 0; - -static File *f_header = 0; -static File *f_runtime = 0; -static File *f_wrappers = 0; -static File *f_init = 0; -static File *f_mlout = 0; -static File *f_mliout = 0; -static File *f_mlbody = 0; -static File *f_mlibody = 0; -static File *f_enumtypes_type = 0; -static File *f_enumtypes_value = 0; -static File *f_class_ctors = 0; -static File *f_class_ctors_end = 0; -static File *f_enum_to_int = 0; -static File *f_int_to_enum = 0; - -class OCAML : public Language { -public: - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main (int argc, char *argv[]) { - - int i; - - SWIG_library_directory(ocaml_path); - - // Look for certain command line options - for (i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp (argv[i], "-help") == 0) { - fputs (ocaml_usage, stderr); - SWIG_exit (0); - } - else if (strcmp (argv[i], "-prefix") == 0) { - if (argv[i + 1]) { - prefix = new char[strlen(argv[i + 1]) + 2]; - strcpy(prefix, argv[i + 1]); - Swig_mark_arg (i); - Swig_mark_arg (i + 1); - i++; - } else { - Swig_arg_error(); - } - } - } - } - - // If a prefix has been specified make sure it ends in a '_' - - if (prefix) { - if (prefix[strlen (prefix)] != '_') { - prefix[strlen (prefix) + 1] = 0; - prefix[strlen (prefix)] = '_'; - } - } else - prefix = (char*)"swig_"; - - // Add a symbol for this module - - Preprocessor_define ("SWIGOCAML 1",0); - - // Set name of typemaps - - SWIG_typemap_lang("ocaml"); - - // Read in default typemaps */ - SWIG_config_file("ocaml.i"); - allow_overloading(); - - } - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - f_enumtypes_type = NewString(""); - f_enumtypes_value = NewString(""); - f_mlbody = NewString(""); - f_mlibody = NewString(""); - f_class_ctors = NewString(""); - f_class_ctors_end = NewString(""); - f_enum_to_int = NewString(""); - f_int_to_enum = NewString(""); - - module = Getattr(n,"name"); - - seen_constructors = NewHash(); - seen_enums = NewHash(); - seen_enumvalues = NewHash(); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("mli",f_mlibody); - Swig_register_filebyname("ml",f_mlbody); - - init_func_def = NewString(""); - Swig_register_filebyname("init",init_func_def); - - Swig_name_register("set","%v__set__"); - Swig_name_register("get","%v__get__"); - - Printf(f_runtime, - "/* -*- buffer-read-only: t -*- vi: set ro: */\n"); - Printf( f_runtime, "#define SWIG_MODULE \"%s\"\n", module ); - /* Module name */ - Printf( f_mlbody, "let module_name = \"%s\"\n", module ); - Printf( f_mlibody, "val module_name : string\n" ); - Printf( f_enum_to_int, - "let enum_to_int x v =\n" - " match v with C_enum y -> (\n" - " match (x : c_enum_type) with\n" - " `unknown -> (match (y : c_enum_tag) with\n" - " `int (x : int) -> C_int x\n" - " | _ -> (raise (LabelNotFromThisEnum v)))\n" - ); - - Printf( f_int_to_enum, - "let int_to_enum x y =\n" - " match (x : c_enum_type) with\n" - " `unknown -> C_enum (`int y)\n" ); - - Swig_banner (f_runtime); - - if (NoInclude) { - Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); - } - - /* Produce the enum_to_int and int_to_enum functions */ - - Printf(f_enumtypes_type,"type c_enum_type = [ \n `unknown\n" ); - Printf(f_enumtypes_value,"type c_enum_tag = [ \n `int of int\n" ); - - String *mlfile = NewString(""); - String *mlifile = NewString(""); - - Printv(mlfile,module,".ml",NIL); - Printv(mlifile,module,".mli",NIL); - - f_mlout = NewFile(mlfile,"w"); - f_mliout = NewFile(mlifile,"w"); - - Language::top(n); - - Printf( f_enum_to_int, - ") | _ -> (C_int (get_int v))\n" - "let _ = Callback.register \"%s_enum_to_int\" enum_to_int\n", - module ); - Printf( f_mlibody, - "val enum_to_int : c_enum_type -> c_obj -> c_obj\n" ); - - Printf( f_int_to_enum, - "let _ = Callback.register \"%s_int_to_enum\" int_to_enum\n", - module ); - Printf( f_mlibody, - "val int_to_enum : c_enum_type -> int -> c_obj\n" ); - Printf( f_enumtypes_type, "]\n" ); - Printf( f_enumtypes_value, "]\n" ); - - SwigType_emit_type_table (f_runtime, f_wrappers); - /* Close all of the files */ - Dump(f_header,f_runtime); - Dump(f_wrappers,f_runtime); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - Delete(f_runtime); - - Dump(f_enumtypes_type,f_mlout); - Dump(f_enumtypes_value,f_mlout); - Dump(f_mlbody,f_mlout); - Dump(f_enum_to_int,f_mlout); - Dump(f_int_to_enum,f_mlout); - Delete(f_int_to_enum); - Delete(f_enum_to_int); - Dump(f_class_ctors,f_mlout); - Dump(f_class_ctors_end,f_mlout); - Close(f_mlout); - Delete(f_mlout); - - Dump(f_enumtypes_type,f_mliout); - Dump(f_enumtypes_value,f_mliout); - Dump(f_mlibody,f_mliout); - Close(f_mliout); - Delete(f_mliout); - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * functionWrapper() - * Create a function declaration and register it with the interpreter. - * ------------------------------------------------------------ */ - - void throw_unhandled_ocaml_type_error (SwigType *d) - { - Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, - "Unable to handle type %s.\n", SwigType_str(d,0)); - } - - /* Return true iff T is a pointer type */ - - int - is_a_pointer (SwigType *t) - { - return SwigType_ispointer(SwigType_typedef_resolve_all(t)); - } - - virtual int functionWrapper(Node *n) { - char *iname = GetChar(n,"sym:name"); - SwigType *d = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - Parm *p; - - Wrapper *f = NewWrapper(); - String *proc_name = NewString(""); - String *source = NewString(""); - String *target = NewString(""); - String *arg = NewString(""); - String *cleanup = NewString(""); - String *outarg = NewString(""); - String *build = NewString(""); - String *tm; - int argout_set = 0; - int i = 0; - int numargs; - int numreq; - int newobj = Getattr(n,"feature:new") ? 1 : 0; - String *overname = 0; - - // Make a wrapper name for this - String *wname = Swig_name_wrapper(iname); - if (Getattr(n,"sym:overloaded")) { - overname = Getattr(n,"sym:overname"); - } else { - if (!addSymbol(iname,n)) return SWIG_ERROR; - } - if (overname) { - Append(wname, overname); - } - Setattr(n,"wrap:name",wname); - - // Build the name for Scheme. - Printv(proc_name,"_",iname,NIL); - String *mangled_name = mangleNameForCaml(proc_name); - - if( classmode && in_constructor ) { // Emit constructor for object - String *mangled_name_nounder = - NewString((char *)(Char(mangled_name))+1); - Printf( f_class_ctors_end, - "let %s clst = _%s clst\n", - mangled_name_nounder, mangled_name_nounder ); - Printf(f_mlibody, - "val %s : c_obj -> c_obj\n", - mangled_name_nounder ); - Delete(mangled_name_nounder); - } else if( classmode && in_destructor ) { - Printf(f_class_ctors, - " \"~\", %s ;\n", mangled_name ); - } else if( classmode && !in_constructor && !in_destructor && - !static_member_function ) { - String *opname = Copy(Getattr(n,"name")); - - Replaceall(opname,"operator ",""); - - if( strstr( Char(mangled_name), "__get__" ) ) { - String *set_name = Copy(mangled_name); - if( !Getattr(n,"feature:immutable") ) { - Replaceall(set_name,"__get__","__set__"); - Printf(f_class_ctors, - " \"%s\", (fun args -> " - "if args = (C_list [ raw_ptr ]) then %s args else %s args) ;\n", - opname, mangled_name, set_name ); - Delete(set_name); - } else { - Printf(f_class_ctors, - " \"%s\", (fun args -> " - "if args = (C_list [ raw_ptr ]) then %s args else C_void) ;\n", - opname, mangled_name ); - } - } else if( strstr( Char(mangled_name), "__set__" ) ) { - ; /* Nothing ... handled by the case above */ - } else { - Printf(f_class_ctors, - " \"%s\", %s ;\n", - opname, mangled_name); - } - - Delete(opname); - } - - if( classmode && in_constructor ) { - Setattr(seen_constructors,mangled_name,"true"); - } - - // writing the function wrapper function - Printv(f->def, - "#ifdef __cplusplus\n" - "extern \"C\"\n" - "#endif\n" - "value ", wname, " (", NIL); - Printv(f->def, "value args", NIL); - Printv(f->def, ")\n{", NIL); - - /* Define the scheme name in C. This define is used by several - macros. */ - Printv(f->def, "#define FUNC_NAME \"", mangled_name, "\"", NIL); - - // adds local variables - Wrapper_add_local(f, "args", "CAMLparam1(args)"); - Wrapper_add_local(f, "ret", "CAMLlocal2(swig_result,rv)"); - Wrapper_add_local(f, "_len", "int _len"); - Wrapper_add_local(f, "lenv", "int lenv = 1"); - Wrapper_add_local(f, "argc", "int argc = caml_list_length(args)"); - Wrapper_add_local(f, "argv", "value *argv"); - Wrapper_add_local(f, "i", "int i"); - - Printv( f->code, - "argv = (value *)malloc( argc * sizeof( value ) );\n" - "for( i = 0; i < argc; i++ ) {\n" - " argv[i] = caml_list_nth(args,i);\n" - "}\n", NIL ); - - // Declare return variable and arguments - // number of parameters - // they are called arg0, arg1, ... - // the return value is called result - - emit_args(d, l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - - numargs = emit_num_arguments(l); - numreq = emit_num_required(l); - - Printf(f->code,"swig_result = Val_unit;\n" ); - - // Now write code to extract the parameters (this is super ugly) - - for (i = 0, p = l; i < numargs; i++) { - /* Skip ignored arguments */ - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *ln = Getattr(p,"lname"); - - // Produce names of source and target - Clear(source); - Clear(target); - Clear(arg); - Printf(source, "caml_list_nth(args,%d)", i); - Printf(target, "%s",ln); - Printv(arg, Getattr(p,"name"),NIL); - - if (i >= numreq) { - Printf(f->code,"if (caml_list_length(args) > %d) {\n",i); - } - // Handle parameter types. - if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$source",source); - Replaceall(tm,"$target",target); - Replaceall(tm,"$input",source); - Setattr(p,"emit:input",source); - Printv(f->code, tm, "\n", NIL); - p = Getattr(p,"tmap:in:next"); - } else { - // no typemap found - // check if typedef and resolve - throw_unhandled_ocaml_type_error (pt); - p = nextSibling(p); - } - if (i >= numreq) { - Printf(f->code,"}\n"); - } - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - // Pass output arguments back to the caller. - - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"emit:input")); /* Deprecated */ - Replaceall(tm,"$target",Getattr(p,"lname")); /* Deprecated */ - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - argout_set = 1; - } else { - p = nextSibling(p); - } - } - - // Free up any memory allocated for the arguments. - - /* Insert cleanup code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - // Now write code to make the function call - - emit_action(n,f); - - // Now have return value, figure out what to do with it. - - if ((tm = Swig_typemap_lookup_new("out",n,"result",0))) { - Replaceall(tm,"$source","result"); - Replaceall(tm,"$target","rv"); - Replaceall(tm,"$result","rv"); - Printv(f->code, tm, "\n",NIL); - } else { - throw_unhandled_ocaml_type_error (d); - } - - // Dump the argument output code - Printv(f->code, Char(outarg),NIL); - - // Dump the argument cleanup code - Printv(f->code, Char(cleanup),NIL); - - // Look for any remaining cleanup - - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printv(f->code, tm, "\n",NIL); - } - } - - // Free any memory allocated by the function being wrapped.. - - if ((tm = Swig_typemap_lookup_new("swig_result",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printv(f->code, tm, "\n",NIL); - } - - // Wrap things up (in a manner of speaking) - - Printv(f->code, - tab4, "swig_result = caml_list_append(swig_result,rv);\n" - tab4, "free( argv );\n" - tab4, "if( lenv == 0 )\n" - tab4, "{\n" - tab4, tab4, "CAMLreturn(Val_unit);\n", - tab4, "}\n" - tab4, "else\n" - tab4, "{\n", - tab4, tab4, "CAMLreturn(swig_result);\n", - tab4, "}\n", NIL); - Printf(f->code, "#undef FUNC_NAME\n"); - Printv(f->code, "}\n",NIL); - - Wrapper_print(f, f_wrappers); - - if( Getattr(n,"sym:overloaded") ) { - if( !Getattr(n,"sym:nextSibling") ) { - int maxargs; - Wrapper *df = NewWrapper(); - String *dname = Swig_name_wrapper(iname); - String *dispatch = - Swig_overload_dispatch(n, - "free(argv);\nCAMLreturn(%s(args));\n", - &maxargs); - - Wrapper_add_local(df, "argv", "value *argv"); - - Printv(df->def, - "#ifdef __cplusplus\n" - "extern \"C\"\n" - "#endif\n" - "value ",dname,"(value args) {\n" - " CAMLparam1(args);\n" - " int i;\n" - " int argc = caml_list_length(args);\n",NIL); - Printv( df->code, - "argv = (value *)malloc( argc * sizeof( value ) );\n" - "for( i = 0; i < argc; i++ ) {\n" - " argv[i] = caml_list_nth(args,i);\n" - "}\n", NIL ); - Printv(df->code,dispatch,"\n",NIL); - Printf(df->code,"failwith(\"No matching function for overloaded '%s'\");\n", iname); - Printv(df->code,"}\n",NIL); - Wrapper_print(df,f_wrappers); - - Printf(f_mlbody, - "external %s_f : c_obj list -> c_obj list = \"%s\"\n" - "let %s = fnhelper %s %s_f\n", - mangled_name, dname, mangled_name, - newobj ? "true" : "false", - mangled_name ); - if( !classmode || in_constructor || in_destructor || - static_member_function ) - Printf(f_mlibody, - "(* overload *)\n" - "val %s : c_obj -> c_obj\n", mangled_name ); - - DelWrapper(df); - Delete(dispatch); - Delete(dname); - } - } else { - Printf(f_mlbody, - "external %s_f : c_obj list -> c_obj list = \"%s\"\n" - "let %s = fnhelper %s %s_f\n", - mangled_name, wname, mangled_name, newobj ? "true" : "false", - mangled_name ); - if( !classmode || in_constructor || in_destructor || - static_member_function ) - Printf(f_mlibody, - "(* Non-overload *)\n" - "val %s : c_obj -> c_obj\n", mangled_name ); - } - - Delete(proc_name); - Delete(source); - Delete(target); - Delete(arg); - Delete(outarg); - Delete(cleanup); - Delete(build); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * variableWrapper() - * - * Create a link to a C variable. - * This creates a single function _wrap_swig_var_varname(). - * This function takes a single optional argument. If supplied, it means - * we are setting this variable to some value. If omitted, it means we are - * simply evaluating this variable. Either way, we return the variables - * value. - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - - char *name = GetChar(n,"name"); - String *iname = Getattr(n,"sym:name"); - String *mname = mangleNameForCaml(iname); - SwigType *t = Getattr(n,"type"); - - String *proc_name = NewString(""); - char var_name[256]; - String *tm; - String *tm2 = NewString("");; - String *argnum = NewString("0"); - String *arg = NewString("Field(args,0)"); - Wrapper *f; - - if (!iname || !addSymbol(iname,n)) return SWIG_ERROR; - - f = NewWrapper(); - - // evaluation function names - - strcpy(var_name, Char(Swig_name_wrapper(iname))); - - // Build the name for scheme. - Printv(proc_name, iname,NIL); - //Replaceall(proc_name, "_", "-"); - - if ((SwigType_type(t) != T_USER) || (is_a_pointer(t))) { - - Printf (f->def, - "#ifdef __cplusplus\n" - "extern \"C\"\n" - "#endif\n" - "value %s(value args) {\n", var_name); - Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); - - Wrapper_add_local (f, "swig_result", "value swig_result"); - - if (!Getattr(n,"feature:immutable")) { - /* Check for a setting of the variable value */ - Printf (f->code, "if (args != Val_int(0)) {\n"); - if ((tm = Swig_typemap_lookup_new("varin",n,name,0))) { - Replaceall(tm,"$source","args"); - Replaceall(tm,"$target",name); - Replaceall(tm,"$input","args"); - Printv(f->code, tm, "\n",NIL); - } else { - throw_unhandled_ocaml_type_error (t); - } - Printf (f->code, "}\n"); - } - - // Now return the value of the variable (regardless - // of evaluating or setting) - - if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { - Replaceall(tm,"$source",name); - Replaceall(tm,"$target","swig_result"); - Replaceall(tm,"$result","swig_result"); - Printf (f->code, "%s\n", tm); - } else { - throw_unhandled_ocaml_type_error (t); - } - - Printf (f->code, "\nreturn swig_result;\n"); - Printf (f->code, "#undef FUNC_NAME\n"); - Printf (f->code, "}\n"); - - Wrapper_print (f, f_wrappers); - - // Now add symbol to the Ocaml interpreter - - if( Getattr( n, "feature:immutable" ) ) { - Printf( f_mlbody, - "external __%s : c_obj -> c_obj = \"%s\"\n" - "let _%s = __%s C_void\n", - mname, var_name, mname, mname ); - Printf( f_mlibody, "val _%s : c_obj\n", iname ); - if( const_enum ) { - Printf( f_enum_to_int, - " | `%s -> _%s\n", - mname, mname ); - Printf( f_int_to_enum, - " if y = (get_int _%s) then `%s else\n", - mname, mname ); - } - } else { - Printf( f_mlbody, "external _%s : c_obj -> c_obj = \"%s\"\n", - mname, var_name ); - Printf( f_mlibody, "external _%s : c_obj -> c_obj = \"%s\"\n", - mname, var_name ); - } - } else { - Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, - "Unsupported variable type %s (ignored).\n", SwigType_str(t,0)); - } - - Delete(proc_name); - Delete(argnum); - Delete(arg); - Delete(tm2); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * staticmemberfunctionHandler -- - * Overridden to set static_member_function - * ------------------------------------------------------------ */ - - virtual int staticmemberfunctionHandler( Node *n ) { - int rv; - static_member_function = 1; - rv = Language::staticmemberfunctionHandler( n ); - static_member_function = 0; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - - String *var_name = NewString(""); - String *proc_name = NewString(""); - String *rvalue = NewString(""); - String *temp = NewString(""); - String *tm; - - // Make a static variable; - - Printf (var_name, "_wrap_const_%s", Swig_name_mangle(iname)); - - // Build the name for scheme. - Printv(proc_name, iname,NIL); - //Replaceall(proc_name, "_", "-"); - - if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, - "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } - - // See if there's a typemap - - Printv(rvalue, value,NIL); - if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 1)) { - temp = Copy(rvalue); - Clear(rvalue); - Printv(rvalue, "\"", temp, "\"",NIL); - } - if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 0)) { - Delete(temp); - temp = Copy(rvalue); - Clear(rvalue); - Printv(rvalue, "'", temp, "'",NIL); - } - if ((tm = Swig_typemap_lookup_new("constant",n,name,0))) { - Replaceall(tm,"$source",rvalue); - Replaceall(tm,"$value",rvalue); - Replaceall(tm,"$target",name); - Printf (f_init, "%s\n", tm); - } else { - // Create variable and assign it a value - - Printf (f_header, "static %s = ", SwigType_lstr(type,var_name)); - if ((SwigType_type(type) == T_STRING)) { - Printf (f_header, "\"%s\";\n", value); - } else if (SwigType_type(type) == T_CHAR) { - Printf (f_header, "\'%s\';\n", value); - } else { - Printf (f_header, "%s;\n", value); - } - - { - /* Hack alert: will cleanup later -- Dave */ - Node *n = NewHash(); - Setattr(n,"name",var_name); - Setattr(n,"sym:name",iname); - Setattr(n,"type", type); - Setattr(n,"feature:immutable","1"); - variableWrapper(n); - Delete(n); - } - } - Delete(proc_name); - Delete(rvalue); - Delete(temp); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * validIdentifer() - * ------------------------------------------------------------ */ - - virtual int validIdentifier(String *s) { -#if 0 - char *c = Char(s); - /* Check whether we have an R5RS identifier.*/ - /* --> * | */ - /* --> | */ - if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~'))) { - /* --> + | - | ... */ - if ((strcmp(c, "+") == 0) - || strcmp(c, "-") == 0 - || strcmp(c, "...") == 0) return 1; - else return 0; - } - /* --> | | */ - while (*c) { - if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') - || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; - c++; - } -#endif - return 1; - } - - int constructorHandler(Node *n) { - int ret; - - in_constructor = 1; - ret = Language::constructorHandler(n); - in_constructor = 0; - - return ret; - } - - int destructorHandler(Node *n) { - int ret; - - in_destructor = 1; - ret = Language::destructorHandler(n); - in_destructor = 0; - - return ret; - } - - int copyconstructorHandler(Node *n) { - int ret; - - in_copyconst = 1; - in_constructor = 1; - ret = Language::copyconstructorHandler(n); - in_constructor = 0; - in_copyconst = 0; - - return ret; - } - - int classHandler( Node *n ) { - String *name = Getattr(n,"name"); - String *mangled_sym_name = mangleNameForCaml(name); - - if( !name ) return SWIG_OK; - - classname = mangled_sym_name; - - Printf( f_class_ctors, - "let create_%s_from_ptr raw_ptr =\n" - " C_obj (let rec method_table = [\n" - " \"nop\", (fun args -> C_void) ;\n", - classname ); - - Printf( f_mlibody, - "val create_%s_from_ptr : c_obj -> c_obj\n", - classname ); - - classmode = 1; - int rv = Language::classHandler(n); - classmode = 0; - -#if 0 - Printf(f_mlibody, - "val delete_%s : c_obj -> unit\n", - mangled_sym_name ); -#endif - - /* Handle up-casts in a nice way */ - List *baselist = Getattr(n,"bases"); - if (baselist && Len(baselist)) { - Node *base = Firstitem(baselist); - while (base) { - String *bname = Getattr(base, "ocaml:ctor"); - if (bname) - Printv(f_class_ctors, - " \"::",bname,"\", (fun args -> " - "create_",bname,"_from_ptr raw_ptr) ;\n",NIL); - - base = Nextitem(baselist); - } - } - - Printf(f_class_ctors, - " \"&\", (fun args -> raw_ptr) ;\n" - " \":parents\",\n" - " (fun args -> \n" - " C_list \n" - " (List.map \n" - " (fun (x,y) -> \n" - " C_string (String.sub x 2 ((String.length x) - 2)))\n" - " (List.filter \n" - " (fun (x,y) -> \n" - " ((String.length x) > 2) && \n" - " x.[0] == ':' && \n" - " x.[1] == ':') method_table))) ;\n" - " \":classof\", (fun args -> (C_string \"%s\")) ;\n" - " \":methods\", " - "(fun args -> C_list (List.map (fun (x,y) -> C_string x) " - "method_table)) ] in\n" - " (fun mth arg ->\n" - " try\n" - " let method_name,application = List.hd (List.filter (fun (x,y) -> x = mth) method_table) in\n" - " application \n" - " (match arg with C_list l -> (C_list (raw_ptr :: l)) | C_void -> (C_list [ raw_ptr ]) | v -> (C_list [ raw_ptr ; v ]))\n" - " with (Failure \"hd\") -> \n" - " (* Try parent classes *)\n" - " begin\n" - " let parent_classes = [ \n", - name ); - - /* Handle inheritance -- Mostly stolen from python code */ - baselist = Getattr(n,"bases"); - if (baselist && Len(baselist)) { - Node *base = Firstitem(baselist); - while (base) { - String *bname = Getattr(base, "ocaml:ctor"); - if (bname) - Printv(f_class_ctors, - " create_",bname,"_from_ptr",NIL); - - base = Nextitem(baselist); - if (base) - Printv(f_class_ctors," ;\n",NIL); - else - Printv(f_class_ctors,"\n",NIL); - } - } - - Printv(f_class_ctors," ]\n",NIL); - - Printf(f_class_ctors, - " in let rec try_parent plist raw_ptr = \n" - " match plist with\n" - " p :: tl -> (try\n" - " (invoke (p raw_ptr)) mth arg\n" - " with (BadMethodName (p,m,s)) -> try_parent tl raw_ptr)\n" - " | [] ->\n" - " raise (BadMethodName (raw_ptr,mth,\"%s\"))\n" - " in try_parent parent_classes raw_ptr\n" - " end\n" - " | e -> raise e))\n", - name ); - - Printf( f_class_ctors, - "let _ = Callback.register \"create_%s_from_ptr\" " - "create_%s_from_ptr\n", - classname, classname ); - - Setattr(n,"ocaml:ctor",classname); - - return rv; - } - - String *mangleNameForCaml( String *s ) { - String *out = Copy(s); - Replaceall(out," ","_"); - Replaceall(out,"::","_"); - Replaceall(out,",","_x_"); - Replaceall(out,"+","__plus__"); - Replaceall(out,"-","__minus__"); - Replaceall(out,"<","__ldbrace__"); - Replaceall(out,">","__rdbrace__"); - Replaceall(out,"!","__not__"); - Replaceall(out,"%","__mod__"); - Replaceall(out,"^","__xor__"); - Replaceall(out,"*","__star__"); - Replaceall(out,"&","__amp__"); - Replaceall(out,"|","__or__"); - Replaceall(out,"(","__lparen__"); - Replaceall(out,")","__rparen__"); - Replaceall(out,"[","__lbrace__"); - Replaceall(out,"]","__rbrace__"); - Replaceall(out,"~","__bnot__"); - Replaceall(out,"=","__equals__"); - Replaceall(out,"/","__slash__"); - Replaceall(out,".","__dot__"); - return out; - } - - /* Benedikt Grundmann inspired --> Enum wrap styles */ - - int enumvalueDeclaration(Node *n) { - String *name = Getattr(n,"name"); - - if( const_enum && name && !Getattr(seen_enumvalues,name) ) { - Printf( f_enumtypes_value,"| `%s\n", name ); - Setattr(seen_enumvalues,name,"true"); - Setattr(n,"feature:immutable","1"); - - return constantWrapper(n); - } else return SWIG_OK; - } - - int enumDeclaration(Node *n) { - String *name = Getattr(n,"name"); - - if( name && !Getattr(seen_enums,name) ) { - const_enum = 1; - Printf( f_enum_to_int, "| `%s -> (match (y : c_enum_tag) with\n", name ); - Printf( f_int_to_enum, "| `%s -> C_enum (\n", name ); - Printf( f_mlbody, - "let _ = Callback.register \"%s_marker\" (`%s)\n", - name, name ); - Printf( f_enumtypes_type,"| `%s\n", name ); - Setattr(seen_enumvalues,name,"true"); - } - - int ret = Language::enumDeclaration(n); - - if( const_enum ) { - Printf( f_int_to_enum, "`int y)\n", name ); - Printf( f_enum_to_int, - "| `int (x : int) -> C_int x\n" - "| _ -> raise (Failure \"Unknown enum tag\"))\n" ); - } - - const_enum = 0; - - return ret; - } -}; - -/* ------------------------------------------------------------------------- - * swig_ocaml() - Instantiate module - * ------------------------------------------------------------------------- */ - -extern "C" Language * -swig_ocaml(void) { - return new OCAML(); -} - diff --git a/Source/Modules1.1/overload.cxx b/Source/Modules1.1/overload.cxx deleted file mode 100644 index f62e63f93..000000000 --- a/Source/Modules1.1/overload.cxx +++ /dev/null @@ -1,338 +0,0 @@ -/* ----------------------------------------------------------------------------- - * overload.cxx - * - * This file is used to analyze overloaded functions and methods. - * It looks at signatures and tries to gather information for - * building a dispatch function. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1999-2000. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_overload_cxx[] = "$Header$"; - -#include "swigmod.h" - -#define MAX_OVERLOAD 256 - -extern int emit_num_required(ParmList *); - -/* ----------------------------------------------------------------------------- - * Swig_overload_rank() - * - * This function takes an overloaded declaration and creates a list that ranks - * all overloaded methods in an order that can be used to generate a dispatch - * function. - * ----------------------------------------------------------------------------- */ - -struct Overloaded { - Node *n; /* Node */ - int argc; /* Argument count */ - ParmList *parms; /* Parameters used for overload check */ - int error; /* Ambiguity error */ -}; - -List * -Swig_overload_rank(Node *n) { - Overloaded nodes[MAX_OVERLOAD]; - int nnodes = 0; - Node *o = Getattr(n,"sym:overloaded"); - Node *c; - - if (!o) return 0; - - c = o; - while (c) { - if (!Getattr(c,"error")) { - if (Getattr(c,"wrap:name")) { - nodes[nnodes].n = c; - nodes[nnodes].parms = Getattr(c,"wrap:parms"); - nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); - nodes[nnodes].error = 0; - nnodes++; - } - } - c = Getattr(c,"sym:nextSibling"); - } - - /* Sort the declarations by required argument count */ - { - int i,j; - for (i = 0; i < nnodes; i++) { - for (j = i+1; j < nnodes; j++) { - if (nodes[i].argc > nodes[j].argc) { - Overloaded t = nodes[i]; - nodes[i] = nodes[j]; - nodes[j] = t; - } - } - } - } - - /* Sort the declarations by argument types */ - { - int i,j; - for (i = 0; i < nnodes-1; i++) { - if (nodes[i].argc == nodes[i+1].argc) { - for (j = i+1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { - Parm *p1 = nodes[i].parms; - Parm *p2 = nodes[j].parms; - int differ = 0; - int num_checked = 0; - while (p1 && p2 && (num_checked < nodes[i].argc)) { - // Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); - if (checkAttribute(p1,"tmap:in:numinputs","0")) { - p1 = Getattr(p1,"tmap:in:next"); - continue; - } - if (checkAttribute(p2,"tmap:in:numinputs","0")) { - p2 = Getattr(p2,"tmap:in:next"); - continue; - } - String *t1 = Getattr(p1,"tmap:typecheck:precedence"); - String *t2 = Getattr(p2,"tmap:typecheck:precedence"); - if ((!t1) && (!nodes[i].error)) { - Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), - "Overloaded %s(%s) not supported (no type checking rule for '%s').\n", - Getattr(nodes[i].n,"name"),ParmList_str(Getattr(nodes[i].n,"parms")), - SwigType_str(Getattr(p1,"type"),0)); - nodes[i].error = 1; - } else if ((!t2) && (!nodes[j].error)) { - Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), - "Overloaded %s(%s) not supported (no type checking rule for '%s').\n", - Getattr(nodes[j].n,"name"),ParmList_str(Getattr(nodes[j].n,"parms")), - SwigType_str(Getattr(p2,"type"),0)); - nodes[j].error = 1; - } - if (t1 && t2) { - int t1v, t2v; - t1v = atoi(Char(t1)); - t2v = atoi(Char(t2)); - differ = t1v-t2v; - } - else if (!t1 && t2) differ = 1; - else if (t2 && !t1) differ = -1; - else if (!t1 && !t2) differ = -1; - num_checked++; - if (differ > 0) { - Overloaded t = nodes[i]; - nodes[i] = nodes[j]; - nodes[j] = t; - break; - } else if ((differ == 0) && (Strcmp(t1,"0") == 0)) { - t1 = Getattr(p1,"ltype"); - if (!t1) { - t1 = SwigType_ltype(Getattr(p1,"type")); - if (Getattr(p1,"tmap:typecheck:SWIGTYPE")) { - SwigType_add_pointer(t1); - } - Setattr(p1,"ltype",t1); - } - t2 = Getattr(p2,"ltype"); - if (!t2) { - t2 = SwigType_ltype(Getattr(p2,"type")); - if (Getattr(p2,"tmap:typecheck:SWIGTYPE")) { - SwigType_add_pointer(t2); - } - Setattr(p2,"ltype",t2); - } - - /* Need subtype check here. If t2 is a subtype of t1, then we need to change the - order */ - - if (SwigType_issubtype(t2,t1)) { - Overloaded t = nodes[i]; - nodes[i] = nodes[j]; - nodes[j] = t; - } - - if (Strcmp(t1,t2) != 0) { - differ = 1; - break; - } - } else if (differ) { - break; - } - if (Getattr(p1,"tmap:in:next")) { - p1 = Getattr(p1,"tmap:in:next"); - } else { - p1 = nextSibling(p1); - } - if (Getattr(p2,"tmap:in:next")) { - p2 = Getattr(p2,"tmap:in:next"); - } else { - p2 = nextSibling(p2); - } - } - if (!differ) { - /* See if declarations differ by const only */ - String *d1 = Getattr(nodes[i].n,"decl"); - String *d2 = Getattr(nodes[j].n,"decl"); - if (d1 && d2) { - String *dq1 = Copy(d1); - String *dq2 = Copy(d2); - if (SwigType_isconst(d1)) { - SwigType_pop(dq1); - } - if (SwigType_isconst(d2)) { - SwigType_pop(dq2); - } - if (Strcmp(dq1,dq2) == 0) { - - if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { - Overloaded t = nodes[i]; - nodes[i] = nodes[j]; - nodes[j] = t; - differ = 1; - if (!nodes[j].error) { - Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), - "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), - Getfile(nodes[i].n), Getline(nodes[i].n)); - } - nodes[j].error = 1; - } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { - differ = 1; - if (!nodes[j].error) { - Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), - "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), - Getfile(nodes[i].n), Getline(nodes[i].n)); - } - nodes[j].error = 1; - } - } - Delete(dq1); - Delete(dq2); - } - } - if (!differ) { - if (!nodes[j].error) { - Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), - "Overloaded %s(%s) is shadowed by %s(%s) at %s:%d.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), - Getfile(nodes[i].n),Getline(nodes[i].n)); - nodes[j].error = 1; - } - } - } - } - } - } - List *result = NewList(); - { - int i; - for (i = 0; i < nnodes; i++) { - Append(result,nodes[i].n); - // Printf(stdout,"[ %d ] %s\n", i, ParmList_protostr(nodes[i].parms)); - // Swig_print_node(nodes[i].n); - } - } - return result; -} - -/* ----------------------------------------------------------------------------- - * Swig_overload_dispatch() - * - * Generate a dispatch function. argc is assumed to hold the argument count. - * argv is the argument vector. - * - * Note that for C++ class member functions, Swig_overload_dispatch() assumes - * that argc includes the "self" argument and that the first element of argv[] - * is the "self" argument. So for a member function: - * - * Foo::bar(int x, int y, int z); - * - * the argc should be 4 (not 3!) and the first element of argv[] would be - * the appropriate scripting language reference to "self". For regular - * functions (and static class functions) the argc and argv only include - * the regular function arguments. - * ----------------------------------------------------------------------------- */ - -static bool print_typecheck(String *f, int j, Parm *pj) -{ - char tmp[256]; - sprintf(tmp,"argv[%d]",j); - String *tm = Getattr(pj,"tmap:typecheck"); - if (tm) { - Replaceid(tm,Getattr(pj,"lname"),"_v"); - Replaceall(tm,"$input", tmp); - Printv(f,tm,"\n",NIL); - return true; - } - else - return false; -} - -String * -Swig_overload_dispatch(Node *n, const String_or_char *fmt, int *maxargs) { - int i,j; - - *maxargs = 1; - - String *f = NewString(""); - - /* Get a list of methods ranked by precedence values and argument count */ - List *dispatch = Swig_overload_rank(n); - int nfunc = Len(dispatch); - - /* Loop over the functions */ - - for (i = 0; i < nfunc; i++) { - Node *ni = Getitem(dispatch,i); - Parm *pi = Getattr(ni,"wrap:parms"); - int num_required = emit_num_required(pi); - int num_arguments = emit_num_arguments(pi); - if (num_arguments > *maxargs) *maxargs = num_arguments; - int varargs = emit_isvarargs(pi); - - if (!varargs) { - if (num_required == num_arguments) { - Printf(f,"if (argc == %d) {\n", num_required); - } else { - Printf(f,"if ((argc >= %d) && (argc <= %d)) {\n", num_required, num_arguments); - } - } else { - Printf(f,"if (argc >= %d) {\n", num_required); - } - - if (num_arguments) { - Printf(f,"int _v;\n"); - } - - int num_braces = 0; - j = 0; - Parm *pj = pi; - while (pj) { - if (checkAttribute(pj,"tmap:in:numinputs","0")) { - pj = Getattr(pj,"tmap:in:next"); - continue; - } - if (j >= num_required) { - Printf(f, "if (argc <= %d) {\n", j); - Printf(f, Char(fmt),Getattr(ni,"wrap:name")); - Printf(f, "}\n"); - } - if (print_typecheck(f, j, pj)) { - Printf(f, "if (_v) {\n"); - num_braces++; - } - Parm *pk = Getattr(pj,"tmap:in:next"); - if (pk) pj = pk; - else pj = nextSibling(pj); - j++; - } - Printf(f, Char(fmt),Getattr(ni,"wrap:name")); - /* close braces */ - for (/* empty */; num_braces > 0; num_braces--) - Printf(f, "}\n"); - Printf(f,"}\n"); /* braces closes "if" for this method */ - } - Delete(dispatch); - return f; -} - - diff --git a/Source/Modules1.1/perl5.cxx b/Source/Modules1.1/perl5.cxx deleted file mode 100644 index 94191080d..000000000 --- a/Source/Modules1.1/perl5.cxx +++ /dev/null @@ -1,1594 +0,0 @@ -/* ---------------------------------------------------------------------------- - * perl5.cxx - * - * Generate Perl5 wrappers - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * Loic Dachary (loic@ceic.com) - * David Fletcher - * Gary Holt - * Jason Stewart (jason@openinformatics.com) - * - * Copyright (C) 1999-2000. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ------------------------------------------------------------------------- */ - -char cvsroot_perl5_cxx[] = "$Header$"; - -#include "swigmod.h" - -#ifndef MACSWIG -#include "swigconfig.h" -#endif - -static const char *usage = (char*)"\ -Perl5 Options (available with -perl5)\n\ - -ldflags - Print runtime libraries to link with\n\ - -static - Omit code related to dynamic loading.\n\ - -nopm - Do not generate the .pm file.\n\ - -proxy - Create proxy classes.\n\ - -const - Wrap constants as constants and not variables (implies -shadow).\n\ - -compat - Compatibility mode.\n\n"; - -static int compat = 0; - -static int no_pmfile = 0; - -static int export_all = 0; - -/* - * pmfile - * set by the -pm flag, overrides the name of the .pm file - */ -static String *pmfile = 0; - -/* - * module - * set by the %module directive, e.g. "Xerces". It will determine - * the name of the .pm file, and the dynamic library. - */ -static String *module = 0; - -/* - * fullmodule - * the fully namespace qualified name of the module, e.g. "XML::Xerces" - * it will be used to set the package namespace in the .pm file, as - * well as the name of the initialization methods in the glue library - */ -static String *fullmodule = 0; -/* - * cmodule - * the namespace of the internal glue code, set to the value of - * module with a 'c' appended - */ -static String *cmodule = 0; - -static String *command_tab = 0; -static String *constant_tab = 0; -static String *variable_tab = 0; - -static File *f_runtime = 0; -static File *f_header = 0; -static File *f_wrappers = 0; -static File *f_init = 0; -static File *f_pm = 0; -static String *pm; /* Package initialization code */ -static String *magic; /* Magic variable wrappers */ - -static int is_static = 0; - -/* The following variables are used to manage Perl5 classes */ - -static int blessed = 0; /* Enable object oriented features */ -static int do_constants = 0; /* Constant wrapping */ -static List *classlist = 0; /* List of classes */ -static int have_constructor = 0; -static int have_destructor= 0; -static int have_data_members = 0; -static String *class_name = 0; /* Name of the class (what Perl thinks it is) */ -static String *real_classname = 0; /* Real name of C/C++ class */ -static String *fullclassname = 0; - -static String *pcode = 0; /* Perl code associated with each class */ -static String *blessedmembers = 0; /* Member data associated with each class */ -static int member_func = 0; /* Set to 1 when wrapping a member function */ -static String *func_stubs = 0; /* Function stubs */ -static String *const_stubs = 0; /* Constant stubs */ -static int num_consts = 0; /* Number of constants */ -static String *var_stubs = 0; /* Variable stubs */ -static String *exported = 0; /* Exported symbols */ -static String *pragma_include = 0; -static Hash *operators = 0; -static int have_operators = 0; - -class PERL5 : public Language { -public: - - /* Test to see if a type corresponds to something wrapped with a shadow class */ - Node *is_shadow(SwigType *t) { - Node *n; - n = classLookup(t); - /* Printf(stdout,"'%s' --> '%x'\n", t, n); */ - if (n) { - if (!Getattr(n,"perl5:proxy")) { - setclassname(n); - } - return Getattr(n,"perl5:proxy"); - } - return 0; - } - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main(int argc, char *argv[]) { - int i = 1; - - SWIG_library_directory("perl5"); - for (i = 1; i < argc; i++) { - if (argv[i]) { - if(strcmp(argv[i],"-package") == 0) { - Printf(stderr,"*** -package is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n"); - SWIG_exit(EXIT_FAILURE); - } else if(strcmp(argv[i],"-interface") == 0) { - Printf(stderr,"*** -interface is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n"); - SWIG_exit(EXIT_FAILURE); - } else if (strcmp(argv[i],"-exportall") == 0) { - export_all = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-static") == 0) { - is_static = 1; - Swig_mark_arg(i); - } else if ((strcmp(argv[i],"-shadow") == 0) || ((strcmp(argv[i],"-proxy") == 0))) { - blessed = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-const") == 0) { - do_constants = 1; - blessed = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-nopm") == 0) { - no_pmfile = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-pm") == 0) { - Swig_mark_arg(i); - i++; - pmfile = NewString(argv[i]); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-compat") == 0) { - compat = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-help") == 0) { - fputs(usage,stderr); - } else if (strcmp (argv[i], "-ldflags") == 0) { - printf("%s\n", SWIG_PERL_RUNTIME); - SWIG_exit (EXIT_SUCCESS); - } - } - } - - Preprocessor_define("SWIGPERL 1", 0); - Preprocessor_define("SWIGPERL5 1", 0); - SWIG_typemap_lang("perl5"); - SWIG_config_file("perl5.swg"); - allow_overloading(); - } - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("init",f_init); - - classlist = NewList(); - - pm = NewString(""); - func_stubs = NewString(""); - var_stubs = NewString(""); - const_stubs = NewString(""); - exported = NewString(""); - magic = NewString(""); - pragma_include = NewString(""); - - command_tab = NewString("static swig_command_info swig_commands[] = {\n"); - constant_tab = NewString("static swig_constant_info swig_constants[] = {\n"); - variable_tab = NewString("static swig_variable_info swig_variables[] = {\n"); - - Swig_banner(f_runtime); - - if (NoInclude) { - Printf(f_runtime,"#define SWIG_NOINCLUDE\n"); - } - - module = Copy(Getattr(n,"name")); - - /* If we're in blessed mode, change the package name to "packagec" */ - - if (blessed) { - cmodule = NewStringf("%sc",module); - } else { - cmodule = NewString(module); - } - fullmodule = NewString(module); - - /* Create a .pm file - * Need to strip off any prefixes that might be found in - * the module name */ - - if (no_pmfile) { - f_pm = NewString(0); - } else { - if (pmfile == NULL) { - char *m = Char(module) + Len(module); - while (m != Char(module)) { - if (*m == ':') { - m++; - break; - } - m--; - } - pmfile = NewStringf("%s.pm", m); - } - String *filen = NewStringf("%s%s", Swig_file_dirname(outfile),pmfile); - if ((f_pm = NewFile(filen,"w")) == 0) { - Printf(stderr,"Unable to open %s\n", filen); - SWIG_exit (EXIT_FAILURE); - } - Swig_register_filebyname("pm",f_pm); - } - { - String *tmp = NewString(fullmodule); - Replaceall(tmp,":","_"); - Printf(f_header,"#define SWIG_init boot_%s\n\n", tmp); - Printf(f_header,"#define SWIG_name \"%s::boot_%s\"\n", cmodule, tmp); - Printf(f_header,"#define SWIG_prefix \"%s::\"\n", cmodule); - Delete(tmp); - } - - Printf(f_pm,"# This file was automatically generated by SWIG\n"); - Printf(f_pm,"package %s;\n",fullmodule); - - Printf(f_pm,"require Exporter;\n"); - if (!is_static) { - Printf(f_pm,"require DynaLoader;\n"); - Printf(f_pm,"@ISA = qw(Exporter DynaLoader);\n"); - } else { - Printf(f_pm,"@ISA = qw(Exporter);\n"); - } - - /* Start creating magic code */ - - Printv(magic, - "#ifdef PERL_OBJECT\n", - "#define MAGIC_CLASS _wrap_", module, "_var::\n", - "class _wrap_", module, "_var : public CPerlObj {\n", - "public:\n", - "#else\n", - "#define MAGIC_CLASS\n", - "#endif\n", - "SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *sv, MAGIC *mg) {\n", - tab4, "MAGIC_PPERL\n", - tab4, "sv = sv; mg = mg;\n", - tab4, "croak(\"Value is read-only.\");\n", - tab4, "return 0;\n", - "}\n", - NIL); - - Printf(f_wrappers,"#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); - - /* emit wrappers */ - Language::top(n); - - String *base = NewString(""); - - /* Dump out variable wrappers */ - - Printv(magic, - "\n\n#ifdef PERL_OBJECT\n", - "};\n", - "#endif\n", - NIL); - - Printf(f_header,"%s\n", magic); - - String *type_table = NewString(""); - SwigType_emit_type_table(f_runtime,type_table); - - /* Patch the type table to reflect the names used by shadow classes */ - if (blessed) { - Node *cls; - for (cls = Firstitem(classlist); cls; cls = Nextitem(classlist)) { - if (Getattr(cls,"perl5:proxy")) { - SwigType *type = Copy(Getattr(cls,"classtype")); - SwigType_add_pointer(type); - String *mangle = NewStringf("\"%s\"", SwigType_manglestr(type)); - String *rep = NewStringf("\"%s\"", Getattr(cls,"perl5:proxy")); - Replaceall(type_table,mangle,rep); - Delete(mangle); - Delete(rep); - Delete(type); - } - } - } - - Printf(f_wrappers,"%s",type_table); - Delete(type_table); - - Printf(constant_tab,"{0}\n};\n"); - Printv(f_wrappers,constant_tab,NIL); - - Printf(f_wrappers,"#ifdef __cplusplus\n}\n#endif\n"); - - Printf(f_init,"\t ST(0) = &PL_sv_yes;\n"); - Printf(f_init,"\t XSRETURN(1);\n"); - Printf(f_init,"}\n"); - - /* Finish off tables */ - Printf(variable_tab, "{0}\n};\n"); - Printv(f_wrappers,variable_tab,NIL); - - Printf(command_tab,"{0,0}\n};\n"); - Printv(f_wrappers,command_tab,NIL); - - - Printf(f_pm,"package %s;\n", cmodule); - - if (!is_static) { - Printf(f_pm,"bootstrap %s;\n", fullmodule); - } else { - String *tmp = NewString(fullmodule); - Replaceall(tmp,":","_"); - Printf(f_pm,"boot_%s();\n", tmp); - Delete(tmp); - } - Printf(f_pm,"%s",pragma_include); - Printf(f_pm,"package %s;\n", fullmodule); - Printf(f_pm,"@EXPORT = qw( %s);\n",exported); - - if (blessed) { - - Printv(base, - "\n# ---------- BASE METHODS -------------\n\n", - "package ", fullmodule, ";\n\n", - NIL); - - /* Write out the TIE method */ - - Printv(base, - "sub TIEHASH {\n", - tab4, "my ($classname,$obj) = @_;\n", - tab4, "return bless $obj, $classname;\n", - "}\n\n", - NIL); - - /* Output a CLEAR method. This is just a place-holder, but by providing it we - * can make declarations such as - * %$u = ( x => 2, y=>3, z =>4 ); - * - * Where x,y,z are the members of some C/C++ object. */ - - Printf(base,"sub CLEAR { }\n\n"); - - /* Output default firstkey/nextkey methods */ - - Printf(base, "sub FIRSTKEY { }\n\n"); - Printf(base, "sub NEXTKEY { }\n\n"); - - /* Output a 'this' method */ - - Printv(base, - "sub this {\n", - tab4, "my $ptr = shift;\n", - tab4, "return tied(%$ptr);\n", - "}\n\n", - NIL); - - Printf(f_pm,"%s",base); - - /* Emit function stubs for stand-alone functions */ - - Printf(f_pm,"\n# ------- FUNCTION WRAPPERS --------\n\n"); - Printf(f_pm,"package %s;\n\n",fullmodule); - Printf(f_pm,"%s",func_stubs); - - /* Emit package code for different classes */ - Printf(f_pm,"%s",pm); - - if (num_consts > 0) { - /* Emit constant stubs */ - Printf(f_pm,"\n# ------- CONSTANT STUBS -------\n\n"); - Printf(f_pm,"package %s;\n\n",fullmodule); - Printf(f_pm,"%s",const_stubs); - } - - /* Emit variable stubs */ - - Printf(f_pm,"\n# ------- VARIABLE STUBS --------\n\n"); - Printf(f_pm,"package %s;\n\n",fullmodule); - Printf(f_pm,"%s",var_stubs); - } - - Printf(f_pm,"1;\n"); - Close(f_pm); - Delete(f_pm); - Delete(base); - - /* Close all of the files */ - Dump(f_header,f_runtime); - Dump(f_wrappers,f_runtime); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - Delete(f_runtime); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * importDirective(Node *n) - * ------------------------------------------------------------ */ - - virtual int importDirective(Node *n) { - if (blessed) { - String *modname = Getattr(n,"module"); - if (modname) { - Printf(f_pm,"require %s;\n", modname); - } - } - return Language::importDirective(n); - } - - /* ------------------------------------------------------------ - * functionWrapper() - * ------------------------------------------------------------ */ - - virtual int functionWrapper(Node *n) { - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *d = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - String *overname = 0; - - Parm *p; - int i; - Wrapper *f; - char source[256],target[256],temp[256]; - String *tm; - String *cleanup, *outarg; - int num_saved = 0; - int num_arguments, num_required; - int varargs = 0; - - if (Getattr(n,"sym:overloaded")) { - overname = Getattr(n,"sym:overname"); - } else { - if (!addSymbol(iname,n)) return SWIG_ERROR; - } - - f = NewWrapper(); - cleanup = NewString(""); - outarg = NewString(""); - - String *wname = Swig_name_wrapper(iname); - if (overname) { - Append(wname,overname); - } - Setattr(n,"wrap:name",wname); - Printv(f->def, "XS(", wname, ") {\n", NIL); - Printv(f->def, "char _swigmsg[SWIG_MAX_ERRMSG] = \"\";\n", NIL); - Printv(f->def, "const char *_swigerr = _swigmsg;\n","{\n",NIL); - - emit_args(d, l, f); - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - - num_arguments = emit_num_arguments(l); - num_required = emit_num_required(l); - varargs = emit_isvarargs(l); - - Wrapper_add_local(f,"argvi","int argvi = 0"); - - /* Check the number of arguments */ - if (!varargs) { - Printf(f->code," if ((items < %d) || (items > %d)) {\n", num_required, num_arguments); - } else { - Printf(f->code," if (items < %d) {\n", num_required); - } - Printf(f->code," SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname),d,l)); - Printf(f->code,"}\n"); - - /* Write code to extract parameters. */ - i = 0; - for (i = 0, p = l; i < num_arguments; i++) { - - /* Skip ignored arguments */ - - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *ln = Getattr(p,"lname"); - - /* Produce string representation of source and target arguments */ - sprintf(source,"ST(%d)",i); - sprintf(target,"%s", Char(ln)); - - if (i >= num_required) { - Printf(f->code," if (items > %d) {\n", i); - } - if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$target",target); - Replaceall(tm,"$source",source); - Replaceall(tm,"$input", source); - Setattr(p,"emit:input",source); /* Save input location */ - Printf(f->code,"%s\n",tm); - p = Getattr(p,"tmap:in:next"); - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, - "Unable to use type %s as a function argument.\n",SwigType_str(pt,0)); - p = nextSibling(p); - } - if (i >= num_required) { - Printf(f->code," }\n"); - } - } - - if (varargs) { - if (p && (tm = Getattr(p,"tmap:in"))) { - sprintf(source,"ST(%d)",i); - Replaceall(tm,"$input", source); - Setattr(p,"emit:input", source); - Printf(f->code,"if (items >= %d) {\n", i); - Printv(f->code, tm, "\n", NIL); - Printf(f->code,"}\n"); - } - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - for (i = 0, p = l; p; i++) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - num_saved = 0; - for (i=0,p = l; p;i++) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$target","ST(argvi)"); - Replaceall(tm,"$result","ST(argvi)"); - String *in = Getattr(p,"emit:input"); - if (in) { - sprintf(temp,"_saved[%d]", num_saved); - Replaceall(tm,"$arg",temp); - Replaceall(tm,"$input",temp); - Printf(f->code,"_saved[%d] = %s;\n", num_saved, in); - num_saved++; - } - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - /* If there were any saved arguments, emit a local variable for them */ - if (num_saved) { - sprintf(temp,"_saved[%d]",num_saved); - Wrapper_add_localv(f,"_saved","SV *",temp,NIL); - } - - /* Now write code to make the function call */ - - emit_action(n,f); - - if ((tm = Swig_typemap_lookup_new("out",n,"result",0))) { - Replaceall(tm,"$source","result"); - Replaceall(tm,"$target","ST(argvi)"); - Replaceall(tm,"$result", "ST(argvi)"); - Printf(f->code, "%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, - "Unable to use return type %s in function %s.\n", SwigType_str(d,0), name); - } - - /* If there were any output args, take care of them. */ - - Printv(f->code,outarg,NIL); - - /* If there was any cleanup, do that. */ - - Printv(f->code,cleanup,NIL); - - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n",tm); - } - } - - if ((tm = Swig_typemap_lookup_new("ret",n,"result", 0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n", tm); - } - - Printf(f->code," XSRETURN(argvi);\n"); - Printf(f->code,"fail:\n"); - Printv(f->code,cleanup,NIL); - Printv(f->code,"(void) _swigerr;\n", NIL); - Printv(f->code,"}\n",NIL); - Printv(f->code,"croak(_swigerr);\n", NIL); - Printv(f->code,"}\n",NIL); - - /* Add the dXSARGS last */ - - Wrapper_add_local(f,"dXSARGS","dXSARGS"); - - /* Substitute the cleanup code */ - Replaceall(f->code,"$cleanup",cleanup); - Replaceall(f->code,"$symname",iname); - - /* Dump the wrapper function */ - - Wrapper_print(f,f_wrappers); - - /* Now register the function */ - - if (!Getattr(n,"sym:overloaded")) { - Printf(command_tab,"{\"%s::%s\", %s},\n", cmodule, iname, wname); - } else if (!Getattr(n,"sym:nextSibling")) { - /* Generate overloaded dispatch function */ - int maxargs, ii; - String *dispatch = Swig_overload_dispatch(n,"(*PL_markstack_ptr++);SWIG_CALLXS(%s); return;",&maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *df = NewWrapper(); - String *dname = Swig_name_wrapper(iname); - - Printv(df->def, - "XS(", dname, ") {\n", NIL); - - Wrapper_add_local(df,"dXSARGS", "dXSARGS"); - Replaceid(dispatch,"argc","items"); - for (ii = 0; ii < maxargs; ii++) { - char pat[128]; - char rep[128]; - sprintf(pat,"argv[%d]",ii); - sprintf(rep,"ST(%d)",ii); - Replaceall(dispatch,pat,rep); - } - Printv(df->code,dispatch,"\n",NIL); - Printf(df->code,"croak(\"No matching function for overloaded '%s'\");\n", iname); - Printf(df->code,"XSRETURN(0);\n"); - Printv(df->code,"}\n",NIL); - Wrapper_print(df,f_wrappers); - Printf(command_tab,"{\"%s::%s\", %s},\n", cmodule, iname, dname); - DelWrapper(df); - Delete(dispatch); - Delete(dname); - } - if (!Getattr(n,"sym:nextSibling")) { - if (export_all) { - Printf(exported,"%s ", iname); - } - - /* -------------------------------------------------------------------- - * Create a stub for this function, provided it's not a member function - * -------------------------------------------------------------------- */ - - if ((blessed) && (!member_func)) { - int need_stub = 0; - String *func = NewString(""); - - /* We'll make a stub since we may need it anyways */ - - Printv(func, "sub ", iname, " {\n", - tab4, "my @args = @_;\n", - NIL); - - Printv(func, tab4, "my $result = ", cmodule, "::", iname, "(@args);\n", NIL); - - /* Now check to see what kind of return result was found. - * If this function is returning a result by 'value', SWIG did an - * implicit malloc/new. We'll mark the object like it was created - * in Perl so we can garbage collect it. */ - - if (is_shadow(d)) { - Printv(func, tab4, "return undef if (!defined($result));\n", NIL); - - /* If we're returning an object by value, put it's reference - into our local hash table */ - - if ((!SwigType_ispointer(d) && !SwigType_isreference(d)) || Getattr(n,"feature:new")) { - Printv(func, tab4, "$", is_shadow(d), "::OWNER{$result} = 1;\n", NIL); - } - - /* We're returning a Perl "object" of some kind. Turn it into a tied hash */ - Printv(func, - tab4, "my %resulthash;\n", - tab4, "tie %resulthash, ref($result), $result;\n", - tab4, "return bless \\%resulthash, ref($result);\n", - "}\n", - NIL); - - need_stub = 1; - } else { - /* Hmmm. This doesn't appear to be anything I know about */ - Printv(func, tab4, "return $result;\n", "}\n", NIL); - } - - /* Now check if we needed the stub. If so, emit it, otherwise - * Emit code to hack Perl's symbol table instead */ - - if (need_stub) { - Printf(func_stubs,"%s",func); - } else { - Printv(func_stubs,"*", iname, " = *", cmodule, "::", iname, ";\n", NIL); - } - Delete(func); - } - } - Delete(cleanup); - Delete(outarg); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * variableWrapper() - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - Wrapper *getf, *setf; - String *tm; - - String *set_name = NewStringf("_wrap_set_%s", iname); - String *val_name = NewStringf("_wrap_val_%s", iname); - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - getf = NewWrapper(); - setf = NewWrapper(); - - /* Create a Perl function for setting the variable value */ - - if (!Getattr(n,"feature:immutable")) { - Printf(setf->def,"SWIGCLASS_STATIC int %s(pTHX_ SV* sv, MAGIC *mg) {\n", set_name); - Printv(setf->code, - tab4, "MAGIC_PPERL\n", - tab4, "mg = mg;\n", - NIL); - - /* Check for a few typemaps */ - tm = Swig_typemap_lookup_new("varin",n,name,0); - if (tm) { - Replaceall(tm,"$source","sv"); - Replaceall(tm,"$target",name); - Replaceall(tm,"$input","sv"); - Printf(setf->code,"%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, - "Unable to link with datatype %s (ignored).\n", SwigType_str(t,0)); - return SWIG_NOWRAP; - } - Printf(setf->code," return 1;\n}\n"); - Replaceall(setf->code,"$symname",iname); - Wrapper_print(setf,magic); - } - - /* Now write a function to evaluate the variable */ - - Printf(getf->def,"SWIGCLASS_STATIC int %s(pTHX_ SV *sv, MAGIC *mg) {\n", val_name); - Printv(getf->code, - tab4, "MAGIC_PPERL\n", - tab4, "mg = mg;\n", - NIL); - - if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { - Replaceall(tm,"$target","sv"); - Replaceall(tm,"$result","sv"); - Replaceall(tm,"$source",name); - Printf(getf->code,"%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, - "Unable to link with datatype %s (ignored).\n", SwigType_str(t,0)); - return SWIG_NOWRAP; - } - Printf(getf->code," return 1;\n}\n"); - - Replaceall(getf->code,"$symname",iname); - Wrapper_print(getf,magic); - - String *tt = Getattr(n,"tmap:varout:type"); - if (tt) { - String *tm = NewStringf("&SWIGTYPE%s", SwigType_manglestr(t)); - if (Replaceall(tt,"$1_descriptor", tm)) { - SwigType_remember(t); - } - Delete(tm); - SwigType *st = Copy(t); - SwigType_add_pointer(st); - tm = NewStringf("&SWIGTYPE%s", SwigType_manglestr(st)); - if (Replaceall(tt,"$&1_descriptor", tm)) { - SwigType_remember(st); - } - Delete(tm); - Delete(st); - } else { - tt = (String *) "0"; - } - /* Now add symbol to the PERL interpreter */ - if (Getattr(n,"feature:immutable")) { - Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS swig_magic_readonly, MAGIC_CLASS ", val_name,",", tt, " },\n",NIL); - - } else { - Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS ", set_name, ", MAGIC_CLASS ", val_name, ",", tt, " },\n",NIL); - } - - /* If we're blessed, try to figure out what to do with the variable - 1. If it's a Perl object of some sort, create a tied-hash - around it. - 2. Otherwise, just hack Perl's symbol table */ - - if (blessed) { - if (is_shadow(t)) { - Printv(var_stubs, - "\nmy %__", iname, "_hash;\n", - "tie %__", iname, "_hash,\"", is_shadow(t), "\", $", - cmodule, "::", iname, ";\n", - "$", iname, "= \\%__", iname, "_hash;\n", - "bless $", iname, ", ", is_shadow(t), ";\n", - NIL); - } else { - Printv(var_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); - } - } - if (export_all) - Printf(exported,"$%s ", iname); - - DelWrapper(setf); - DelWrapper(getf); - Delete(set_name); - Delete(val_name); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - String *tm; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - /* Special hook for member pointer */ - if (SwigType_type(type) == T_MPOINTER) { - String *wname = Swig_name_wrapper(iname); - Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type,wname), value); - value = Char(wname); - } - - if ((tm = Swig_typemap_lookup_new("consttab",n,name,0))) { - Replaceall(tm,"$source",value); - Replaceall(tm,"$target",name); - Replaceall(tm,"$value",value); - Printf(constant_tab,"%s,\n", tm); - } else if ((tm = Swig_typemap_lookup_new("constcode", n, name, 0))) { - Replaceall(tm,"$source", value); - Replaceall(tm,"$target", name); - Replaceall(tm,"$value",value); - Printf(f_init, "%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, - "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } - - if (blessed) { - if (is_shadow(type)) { - Printv(var_stubs, - "\nmy %__", iname, "_hash;\n", - "tie %__", iname, "_hash,\"", is_shadow(type), "\", $", - cmodule, "::", iname, ";\n", - "$", iname, "= \\%__", iname, "_hash;\n", - "bless $", iname, ", ", is_shadow(type), ";\n", - NIL); - } else if (do_constants) { - Printv(const_stubs,"sub ", name, " () { $", - cmodule, "::", name, " }\n", NIL); - num_consts++; - } else { - Printv(var_stubs, "*",iname," = *", cmodule, "::", iname, ";\n", NIL); - } - } - if (export_all) { - if (do_constants && !is_shadow(type)) { - Printf(exported,"%s ",name); - } else { - Printf(exported,"$%s ",iname); - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * usage_func() - * ------------------------------------------------------------ */ - char *usage_func(char *iname, SwigType *, ParmList *l) { - static String *temp = 0; - Parm *p; - int i; - - if (!temp) temp = NewString(""); - Clear(temp); - Printf(temp,"%s(",iname); - - /* Now go through and print parameters */ - p = l; - i = 0; - while (p != 0) { - SwigType *pt = Getattr(p,"type"); - String *pn = Getattr(p,"name"); - if (!Getattr(p,"ignore")) { - /* If parameter has been named, use that. Otherwise, just print a type */ - if (SwigType_type(pt) != T_VOID) { - if (Len(pn) > 0) { - Printf(temp,"%s",pn); - } else { - Printf(temp,"%s",SwigType_str(pt,0)); - } - } - i++; - p = nextSibling(p); - if (p) - if (!Getattr(p,"ignore")) - Putc(',',temp); - } else { - p = nextSibling(p); - if (p) - if ((i>0) && (!Getattr(p,"ignore"))) - Putc(',',temp); - } - } - Printf(temp,");"); - return Char(temp); - } - - /* ------------------------------------------------------------ - * nativeWrapper() - * ------------------------------------------------------------ */ - - virtual int nativeWrapper(Node *n) { - String *name = Getattr(n,"sym:name"); - String *funcname = Getattr(n,"wrap:name"); - - if (!addSymbol(funcname,n)) return SWIG_ERROR; - - Printf(command_tab,"{\"%s::%s\", %s},\n", cmodule,name,funcname); - if (export_all) - Printf(exported,"%s ",name); - if (blessed) { - Printv(func_stubs,"*", name, " = *", cmodule, "::", name, ";\n", NIL); - } - return SWIG_OK; - } - - /**************************************************************************** - *** OBJECT-ORIENTED FEATURES - **************************************************************************** - *** These extensions provide a more object-oriented interface to C++ - *** classes and structures. The code here is based on extensions - *** provided by David Fletcher and Gary Holt. - *** - *** I have generalized these extensions to make them more general purpose - *** and to resolve object-ownership problems. - *** - *** The approach here is very similar to the Python module : - *** 1. All of the original methods are placed into a single - *** package like before except that a 'c' is appended to the - *** package name. - *** - *** 2. All methods and function calls are wrapped with a new - *** perl function. While possibly inefficient this allows - *** us to catch complex function arguments (which are hard to - *** track otherwise). - *** - *** 3. Classes are represented as tied-hashes in a manner similar - *** to Gary Holt's extension. This allows us to access - *** member data. - *** - *** 4. Stand-alone (global) C functions are modified to take - *** tied hashes as arguments for complex datatypes (if - *** appropriate). - *** - *** 5. Global variables involving a class/struct is encapsulated - *** in a tied hash. - *** - ****************************************************************************/ - - - void setclassname(Node *n) { - String *symname = Getattr(n,"sym:name"); - String *fullname; - String *actualpackage; - Node *clsmodule = Getattr(n,"module"); - - if (!clsmodule) { - /* imported module does not define a module name. Oh well */ - return; - } - - /* Do some work on the class name */ - actualpackage = Getattr(clsmodule,"name"); - if ((!compat) && (!Strchr(symname,':'))) { - fullname = NewStringf("%s::%s",actualpackage,symname); - } else { - fullname = NewString(symname); - } - Setattr(n,"perl5:proxy", fullname); - } - - /* ------------------------------------------------------------ - * classDeclaration() - * ------------------------------------------------------------ */ - virtual int classDeclaration(Node *n) { - /* Do some work on the class name */ - if (blessed) { - setclassname(n); - Append(classlist,n); - } - return Language::classDeclaration(n); - } - - /* ------------------------------------------------------------ - * classHandler() - * ------------------------------------------------------------ */ - - virtual int classHandler(Node *n) { - - if (blessed) { - have_constructor = 0; - have_operators = 0; - have_destructor = 0; - have_data_members = 0; - operators = NewHash(); - - class_name = Getattr(n,"sym:name"); - - if (!addSymbol(class_name,n)) return SWIG_ERROR; - - /* Use the fully qualified name of the Perl class */ - if (!compat) { - fullclassname = NewStringf("%s::%s",fullmodule,class_name); - } else { - fullclassname = NewString(class_name); - } - real_classname = Getattr(n,"name"); - pcode = NewString(""); - blessedmembers = NewString(""); - } - - /* Emit all of the members */ - Language::classHandler(n); - - - /* Finish the rest of the class */ - if (blessed) { - /* Generate a client-data entry */ - SwigType *ct = NewStringf("p.%s", real_classname); - Printv(f_init,"SWIG_TypeClientData(SWIGTYPE", SwigType_manglestr(ct),", (void*) \"", - fullclassname, "\");\n", NIL); - SwigType_remember(ct); - Delete(ct); - - Printv(pm, - "\n############# Class : ", fullclassname, " ##############\n", - "\npackage ", fullclassname, ";\n", - NIL); - - if (have_operators) { - Printf(pm, "use overload\n"); - DOH *key; - for (key = Firstkey(operators); key; key = Nextkey(operators)) { - char *name = Char(key); - // fprintf(stderr,"found name: <%s>\n", name); - if (strstr(name, "operator_equal_to")) { - Printv(pm, tab4, "\"==\" => sub { $_[0]->operator_equal_to($_[1])},\n",NIL); - } else if (strstr(name, "operator_not_equal_to")) { - Printv(pm, tab4, "\"!=\" => sub { $_[0]->operator_not_equal_to($_[1])},\n",NIL); - } else if (strstr(name, "operator_assignment")) { - Printv(pm, tab4, "\"=\" => sub { $_[0]->operator_assignment($_[1])},\n",NIL); - } else { - fprintf(stderr,"Unknown operator: %s\n", name); - } - } - Printv(pm, tab4, "\"fallback\" => 1;\n",NIL); - } - /* If we are inheriting from a base class, set that up */ - - Printv(pm, "@ISA = qw( ",fullmodule, NIL); - - /* Handle inheritance */ - List *baselist = Getattr(n,"bases"); - if (baselist && Len(baselist)) { - Node *base = Firstitem(baselist); - while (base) { - String *bname = Getattr(base, "perl5:proxy"); - if (!bname) { - base = Nextitem(baselist); - continue; - } - Printv(pm," ", bname, NIL); - base = Nextitem(baselist); - } - } - Printf(pm, " );\n"); - - /* Dump out a hash table containing the pointers that we own */ - Printf(pm, "%%OWNER = ();\n"); - if (have_data_members) { - Printv(pm, - "%BLESSEDMEMBERS = (\n", blessedmembers, ");\n\n", - NIL); - } - if (have_data_members || have_destructor) - Printf(pm, "%%ITERATORS = ();\n"); - - /* Dump out the package methods */ - - Printv(pm,pcode,NIL); - Delete(pcode); - - /* Output methods for managing ownership */ - - Printv(pm, - "sub DISOWN {\n", - tab4, "my $self = shift;\n", - tab4, "my $ptr = tied(%$self);\n", - tab4, "delete $OWNER{$ptr};\n", - tab4, "};\n\n", - "sub ACQUIRE {\n", - tab4, "my $self = shift;\n", - tab4, "my $ptr = tied(%$self);\n", - tab4, "$OWNER{$ptr} = 1;\n", - tab4, "};\n\n", - NIL); - - /* Only output the following methods if a class has member data */ - - if (have_data_members) { - - /* Output a FETCH method. This is actually common to all classes */ - Printv(pm, - "sub FETCH {\n", - tab4, "my ($self,$field) = @_;\n", - tab4, "my $member_func = \"swig_${field}_get\";\n", - tab4, "my $val = $self->$member_func();\n", - tab4, "if (exists $BLESSEDMEMBERS{$field}) {\n", - tab8, "return undef if (!defined($val));\n", - tab8, "my %retval;\n", - tab8, "tie %retval,$BLESSEDMEMBERS{$field},$val;\n", - tab8, "return bless \\%retval, $BLESSEDMEMBERS{$field};\n", - tab4, "}\n", - tab4, "return $val;\n", - "}\n\n", - NIL); - - /* Output a STORE method. This is also common to all classes (might move to base class) */ - - Printv(pm, - "sub STORE {\n", - tab4, "my ($self,$field,$newval) = @_;\n", - tab4, "my $member_func = \"swig_${field}_set\";\n", - tab4, "if (exists $BLESSEDMEMBERS{$field}) {\n", - tab8, "$self->$member_func(tied(%{$newval}));\n", - tab4, "} else {\n", - tab8, "$self->$member_func($newval);\n", - tab4, "}\n", - "}\n\n", - NIL); - } - Delete(operators); operators = 0; - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberfunctionHandler() - * ------------------------------------------------------------ */ - - virtual int memberfunctionHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - - String *func; - int need_wrapper = 0; - - member_func = 1; - Language::memberfunctionHandler(n); - member_func = 0; - - if ((blessed) && (!Getattr(n,"sym:nextSibling"))) { - func = NewString(""); - - /* Now emit a Perl wrapper function around our member function, we might need - to patch up some arguments along the way */ - - if (Strstr(symname, "operator") == symname) { - if (Strstr(symname, "operator_equal_to")) { - DohSetInt(operators,"operator_equal_to",1); - have_operators = 1; - } else if (Strstr(symname, "operator_not_equal_to")) { - DohSetInt(operators,"operator_not_equal_to",1); - have_operators = 1; - } else if (Strstr(symname, "operator_assignment")) { - DohSetInt(operators,"operator_assignment",1); - have_operators = 1; - } else { - Printf(stderr,"Unknown operator: %s\n", symname); - } - // fprintf(stderr,"Found member_func operator: %s\n", symname); - } - - Printv(func, - "sub ", symname, " {\n", - tab4, "my @args = @_;\n", - NIL); - - /* Okay. We've made argument adjustments, now call into the package */ - - Printv(func, - tab4, "my $result = ", cmodule, "::", Swig_name_member(class_name,symname), - "(@args);\n", - NIL); - - /* Now check to see what kind of return result was found. - * If this function is returning a result by 'value', SWIG did an - * implicit malloc/new. We'll mark the object like it was created - * in Perl so we can garbage collect it. */ - - if (is_shadow(t)) { - Printv(func,tab4, "return undef if (!defined($result));\n", NIL); - - /* If we're returning an object by value, put it's reference - into our local hash table */ - - if ((!SwigType_ispointer(t) && !SwigType_isreference(t)) || Getattr(n,"feature:new")) { - Printv(func, tab4, "$", is_shadow(t), "::OWNER{$result} = 1; \n", NIL); - } - - /* We're returning a Perl "object" of some kind. Turn it into - a tied hash */ - - Printv(func, - tab4, "my %resulthash;\n", - tab4, "tie %resulthash, ref($result), $result;\n", - tab4, "return bless \\%resulthash, ref($result);\n", - "}\n", - NIL); - - need_wrapper = 1; - } else { - - /* Hmmm. This doesn't appear to be anything I know about so just - return it unmodified */ - - Printv(func, tab4,"return $result;\n", "}\n", NIL); - } - - if (need_wrapper) { - Printv(pcode,func,NIL); - } else { - Printv(pcode,"*",symname," = *", cmodule, "::", Swig_name_member(class_name,symname), ";\n", NIL); - } - Delete(func); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * membervariableHandler() - * - * Adds an instance member. This is a little hairy because data members are - * really added with a tied-hash table that is attached to the object. - * - * On the low level, we will emit a pair of get/set functions to retrieve - * values just like before. These will then be encapsulated in a FETCH/STORE - * method associated with the tied-hash. - * - * In the event that a member is an object that we have already wrapped, then - * we need to retrieve the data a tied-hash as opposed to what SWIG normally - * returns. To determine this, we build an internal hash called 'BLESSEDMEMBERS' - * that contains the names and types of tied data members. If a member name - * is in the list, we tie it, otherwise, we just return the normal SWIG value. - * ----------------------------------------------------------------------------- */ - - virtual int membervariableHandler(Node *n) { - - String *symname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - - /* Emit a pair of get/set functions for the variable */ - - member_func = 1; - Language::membervariableHandler(n); - member_func = 0; - - if (blessed) { - - Printv(pcode,"*swig_", symname, "_get = *", cmodule, "::", Swig_name_get(Swig_name_member(class_name,symname)), ";\n", NIL); - Printv(pcode,"*swig_", symname, "_set = *", cmodule, "::", Swig_name_set(Swig_name_member(class_name,symname)), ";\n", NIL); - - /* Now we need to generate a little Perl code for this */ - - if (is_shadow(t)) { - - /* This is a Perl object that we have already seen. Add an - entry to the members list*/ - Printv(blessedmembers, - tab4, symname, " => '", is_shadow(t), "',\n", - NIL); - - } - } - have_data_members++; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constructorDeclaration() - * - * Emits a blessed constructor for our class. In addition to our construct - * we manage a Perl hash table containing all of the pointers created by - * the constructor. This prevents us from accidentally trying to free - * something that wasn't necessarily allocated by malloc or new - * ------------------------------------------------------------ */ - - virtual int constructorHandler(Node *n) { - - String *symname = Getattr(n,"sym:name"); - - member_func = 1; - Language::constructorHandler(n); - - if ((blessed) && (!Getattr(n,"sym:nextSibling"))) { - if ((Cmp(symname,class_name) == 0)) { - /* Emit a blessed constructor */ - Printf(pcode, "sub new {\n"); - } else { - /* Constructor doesn't match classname so we'll just use the normal name */ - Printv(pcode, "sub ", Swig_name_construct(symname), " () {\n", NIL); - } - - Printv(pcode, tab4, "my $pkg = shift;\n", - tab4, "my @args = @_;\n", NIL); - - Printv(pcode, - tab4, "my $self = ", cmodule, "::", Swig_name_construct(symname), "(@args);\n", - tab4, "return undef if (!defined($self));\n", - /* tab4, "bless $self, \"", fullclassname, "\";\n", */ - tab4, "$OWNER{$self} = 1;\n", - tab4, "my %retval;\n", - tab4, "tie %retval, \"", fullclassname, "\", $self;\n", - tab4, "return bless \\%retval, $pkg;\n", - "}\n\n", - NIL); - - have_constructor = 1; - } - member_func = 0; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * destructorHandler() - * ------------------------------------------------------------ */ - - virtual int destructorHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - member_func = 1; - Language::destructorHandler(n); - if (blessed) { - Printv(pcode, - "sub DESTROY {\n", - tab4, "return unless $_[0]->isa('HASH');\n", - tab4, "my $self = tied(%{$_[0]});\n", - tab4, "return unless defined $self;\n", - tab4, "delete $ITERATORS{$self};\n", - tab4, "if (exists $OWNER{$self}) {\n", - tab8, cmodule, "::", Swig_name_destroy(symname), "($self);\n", - tab8, "delete $OWNER{$self};\n", - tab4, "}\n}\n\n", - NIL); - have_destructor = 1; - } - member_func = 0; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * staticmemberfunctionHandler() - * ------------------------------------------------------------ */ - - virtual int staticmemberfunctionHandler(Node *n) { - member_func = 1; - Language::staticmemberfunctionHandler(n); - member_func = 0; - if ((blessed) && (!Getattr(n,"sym:nextSibling"))) { - String *symname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - if (is_shadow(t)) { - Printv(pcode, - "sub ", symname, " {\n", - tab4, "my @args = @_;\n", - NIL); - - /* Okay. We've made argument adjustments, now call into the package */ - - Printv(pcode, - tab4, "my $result = ", cmodule, "::", Swig_name_member(class_name,symname), - "(@args);\n", - NIL); - - /* Now check to see what kind of return result was found. - * If this function is returning a result by 'value', SWIG did an - * implicit malloc/new. We'll mark the object like it was created - * in Perl so we can garbage collect it. */ - - Printv(pcode,tab4, "return undef if (!defined($result));\n", NIL); - - /* If we're returning an object by value, put it's reference - into our local hash table */ - - if ((!SwigType_ispointer(t) && !SwigType_isreference(t)) || Getattr(n,"feature:new")) { - Printv(pcode, tab4, "$", is_shadow(t), "::OWNER{$result} = 1; \n", NIL); - } - - /* We're returning a Perl "object" of some kind. Turn it into - a tied hash */ - - Printv(pcode, - tab4, "my %resulthash;\n", - tab4, "tie %resulthash, ref($result), $result;\n", - tab4, "return bless \\%resulthash, ref($result);\n", - "}\n", - NIL); - } else { - Printv(pcode,"*",symname," = *", cmodule, "::", Swig_name_member(class_name,symname), ";\n", NIL); - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * staticmembervariableHandler() - * ------------------------------------------------------------ */ - - virtual int staticmembervariableHandler(Node *n) { - Language::staticmembervariableHandler(n); - if (blessed) { - String *symname = Getattr(n,"sym:name"); - Printv(pcode,"*",symname," = *", cmodule, "::", Swig_name_member(class_name,symname), ";\n", NIL); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberconstantHandler() - * ------------------------------------------------------------ */ - - virtual int memberconstantHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - int oldblessed = blessed; - - /* Create a normal constant */ - blessed = 0; - Language::memberconstantHandler(n); - blessed = oldblessed; - - if (blessed) { - Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(class_name,symname), ";\n", NIL); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * pragma() - * - * Pragma directive. - * - * %pragma(perl5) code="String" # Includes a string in the .pm file - * %pragma(perl5) include="file.pl" # Includes a file in the .pm file - * ------------------------------------------------------------ */ - - virtual int pragmaDirective(Node *n) { - String *lang; - String *code; - String *value; - if (!ImportMode) { - lang = Getattr(n,"lang"); - code = Getattr(n,"name"); - value = Getattr(n,"value"); - if (Strcmp(lang,"perl5") == 0) { - if (Strcmp(code,"code") == 0) { - /* Dump the value string into the .pm file */ - if (value) { - Printf(pragma_include, "%s\n", value); - } - } else if (Strcmp(code,"include") == 0) { - /* Include a file into the .pm file */ - if (value) { - FILE *f = Swig_open(value); - if (!f) { - Printf(stderr,"%s : Line %d. Unable to locate file %s\n", input_file, line_number,value); - } else { - char buffer[4096]; - while (fgets(buffer,4095,f)) { - Printf(pragma_include,"%s",buffer); - } - } - } - } else { - Printf(stderr,"%s : Line %d. Unrecognized pragma.\n", input_file,line_number); - } - } - } - return Language::pragmaDirective(n); - } -}; - -/* ----------------------------------------------------------------------------- - * swig_perl5() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language * -swig_perl5(void) { - return new PERL5(); -} diff --git a/Source/Modules1.1/php4.cxx b/Source/Modules1.1/php4.cxx deleted file mode 100644 index 051e24601..000000000 --- a/Source/Modules1.1/php4.cxx +++ /dev/null @@ -1,2113 +0,0 @@ -/* - * PHP4 Support - * - * Richard Palmer - * richard@magicality.org - * Nov 2001 - * - * Portions copyright Sun Microsystems (c) 2001 - * Tim Hockin - * - * Portions copyright Ananova Ltd (c) 2002 - * Sam Liddicott - * - */ - -char cvsroot_php4_cxx[] = "$Header$"; - -#include - -#include "swigmod.h" -#include "swigconfig.h" - -static const char *usage = (char*)"\ -PHP4 Options (available with -php4)\n\ - -cppext - cpp file extension (default to .cpp)\n\ - -proxy - Create proxy classes.\n\ - -dlname name - Set module prefix.\n\ - -make - Create simple makefile.\n\ - -phpfull - Create full make files.\n\ - -withincs libs - With -phpfull writes needed incs in config.m4\n\ - -withlibs libs - With -phpfull writes needed libs in config.m4\n\n\ - -withc libs - With -phpfull makes extra c files in Makefile.in\n\ - -withcxx libs - With -phpfull makes extra c++ files in Makefile.in\n\n"; - -static int constructors=0; -static String *NOTCLASS=NewString("Not a class"); -static Node *classnode=0; -static String *module = 0; -static String *cap_module = 0; -static String *dlname = 0; -static String *withlibs = 0; -static String *withincs = 0; -static String *withc = 0; -static String *withcxx = 0; -static String *outfile = 0; - -//static char *package = 0; // Name of the package -static char *shadow_classname; - -static Wrapper *f_php; -static int gen_extra = 0; -static int gen_make = 0; - -static File *f_runtime = 0; -static File *f_h = 0; -static File *f_phpcode = 0; -static String *phpfilename =0; - -static String *s_header; -static String *s_wrappers; -static String *s_init; -static String *s_vinit; -static String *s_vdecl; -static String *s_cinit; -static String *s_oinit; -static String *s_entry; -static String *cs_entry; -static String *all_cs_entry; -static String *pragma_incl; -static String *pragma_code; -static String *pragma_phpinfo; - -/* Variables for using PHP classes */ -static String *class_name = 0; -static String *realpackage = 0; -static String *package = 0; - -static Hash *shadow_get_vars; -static Hash *shadow_set_vars; -static String *shadow_classdef; -static String *shadow_code; -static int have_default_constructor = 0; -#define NATIVE_CONSTRUCTOR 1 -#define ALTERNATIVE_CONSTRUCTOR 2 -static int native_constructor=0; -static int destructor=0; -static int enum_flag = 0; // Set to 1 when wrapping an enum -static int static_flag = 0; // Set to 1 when wrapping a static functions or member variables -static int const_flag = 0; // Set to 1 when wrapping a const member variables -static int variable_wrapper_flag = 0; // Set to 1 when wrapping a member variable/enum/const -static int wrapping_member = 0; -static Hash *zend_types = 0; - -static String *shadow_enum_code = 0; -static String *php_enum_code = 0; -static String *all_shadow_extra_code = 0; - //Extra code for all shadow classes from %pragma -static String *this_shadow_extra_code = 0; - //Extra Code for current single shadow class freom %pragma -static String *all_shadow_import = 0; - //import for all shadow classes from %pragma -static String *this_shadow_import = 0; - //import for current shadow classes from %pragma -static String *module_baseclass = 0; - //inheritance for module class from %pragma -static String *all_shadow_baseclass = 0; - //inheritence for all shadow classes from %pragma -static String *this_shadow_baseclass = 0; - //inheritance for shadow class from %pragma and cpp_inherit -static String *this_shadow_multinherit = 0; -static int shadow = 1; - - -extern "C" { -static void (*r_prevtracefunc)(SwigType *t, String *mangled, String *clientdata) = 0; -} - -static const char *php_header = -"/*" -"\n +----------------------------------------------------------------------+" -"\n | PHP version 4.0 |" -"\n +----------------------------------------------------------------------+" -"\n | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |" -"\n +----------------------------------------------------------------------+" -"\n | This source file is subject to version 2.02 of the PHP license, |" -"\n | that is bundled with this package in the file LICENSE, and is |" -"\n | available at through the world-wide-web at |" -"\n | http://www.php.net/license/2_02.txt. |" -"\n | If you did not receive a copy of the PHP license and are unable to |" -"\n | obtain it through the world-wide-web, please send a note to |" -"\n | license@php.net so we can mail you a copy immediately. |" -"\n +----------------------------------------------------------------------+" -"\n | Authors: |" -"\n | |" -"\n +----------------------------------------------------------------------+" -"\n */\n"; - -void -SwigPHP_emit_resource_registrations() { - DOH *key; - String *destructor=0; - String *classname=0; - String *shadow_classname=0; - - if (!zend_types) return; - key = Firstkey(zend_types); - - if (key) Printf(s_oinit,"\n/* Register resource destructors for pointer types */\n"); - while (key) if (1 /* is pointer type*/) { - Node *class_node; - if ((class_node=Getattr(zend_types,key))) { - // Write out destructor function header - Printf(s_wrappers,"/* NEW Destructor style */\nstatic ZEND_RSRC_DTOR_FUNC(_wrap_destroy%s) {\n",key); - - // write out body - if ((class_node!=NOTCLASS)) { - classname = Getattr(class_node,"name"); - if (! (shadow_classname = Getattr(class_node,"sym:name"))) shadow_classname=classname; - // Do we have a known destructor for this type? - if ((destructor = Getattr(class_node,"destructor"))) { - Printf(s_wrappers,"/* has destructor: %s */\n",destructor); - Printf(s_wrappers,"%s(rsrc, SWIGTYPE%s->name TSRMLS_CC);\n",destructor,key); - } else { - Printf(s_wrappers,"/* bah! No destructor for this wrapped class!! */\n"); - } - } else { - Printf(s_wrappers,"/* bah! No destructor for this simple type!! */\n"); - } - - // close function - Printf(s_wrappers,"}\n"); - - // declare le_swig_ to store php registration - Printf(s_vdecl,"static int le_swig_%s=0; /* handle for %s */\n", key, shadow_classname); - - // register with php - Printf(s_oinit,"le_swig_%s=zend_register_list_destructors_ex" - "(_wrap_destroy%s,NULL,(char *)(SWIGTYPE%s->name),module_number);\n", - key,key,key); - - // store php type in class struct - Printf(s_oinit,"SWIG_TypeClientData(SWIGTYPE%s,&le_swig_%s);\n", - key,key); - } - key = Nextkey(zend_types); - } -} - -class PHP4 : public Language { -public: - - /* Test to see if a type corresponds to something wrapped with a shadow class. */ - - String *is_shadow(SwigType *t) { - String *r = 0; - Node *n = classLookup(t); - if (n) { - r = Getattr(n,"php:proxy"); // Set by classDeclaration() - if (!r) { - r = Getattr(n,"sym:name"); // Not seen by classDeclaration yet, but this is the name - } - } - return r; - } - - /* ----------------------------------------------------------------------------- - * get_pointer() - * ----------------------------------------------------------------------------- */ - void - get_pointer(char *iname, char *srcname, char *src, char *dest, - SwigType *t, String *f, char *ret) { - - SwigType_remember(t); - SwigType *lt = SwigType_ltype(t); - Printv(f, "if (SWIG_ConvertPtr(", src, ",(void **) ", dest, ",", NIL); - - /* If we're passing a void pointer, we give the pointer conversion a NULL - pointer, otherwise pass in the expected type. */ - - if (Cmp(lt,"p.void") == 0) { - Printf(f, " 0 ) < 0) {\n"); - } else { - Printv(f, "SWIGTYPE", SwigType_manglestr(t), ") < 0) {\n",NIL); - } - - Printv(f, - "zend_error(E_ERROR, \"Type error in ", srcname, " of ", iname, - " Expected %s\", SWIGTYPE", SwigType_manglestr(t), "->name);\n", ret, - ";\n", - "}\n", - NIL); - Delete(lt); - } - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main(int argc, char *argv[]) { - int i; - SWIG_library_directory("php4"); - SWIG_config_cppext("cpp"); - - for(i = 1; i < argc; i++) { - if (argv[i]) { - if(strcmp(argv[i], "-phpfull") == 0) { - gen_extra = 1; - Swig_mark_arg(i); - } else if(strcmp(argv[i], "-dlname") == 0) { - if (argv[i+1]) { - dlname = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if(strcmp(argv[i], "-withlibs") == 0) { - if (argv[i+1]) { - withlibs = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if(strcmp(argv[i], "-withincs") == 0) { - if (argv[i+1]) { - withincs = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if(strcmp(argv[i], "-withc") == 0) { - if (argv[i+1]) { - withc = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if(strcmp(argv[i], "-withcxx") == 0) { - if (argv[i+1]) { - withcxx = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if(strcmp(argv[i], "-cppext") == 0) { - if (argv[i+1]) { - SWIG_config_cppext(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if((strcmp(argv[i], "-noshadow") == 0) || (strcmp(argv[i],"-noproxy") == 0)) { - shadow = 0; - Swig_mark_arg(i); - } else if(strcmp(argv[i], "-make") == 0) { - gen_make = 1; - Swig_mark_arg(i); - } else if(strcmp(argv[i], "-help") == 0) { - fputs(usage, stderr); - } - } - } - - Preprocessor_define((void *) "SWIGPHP 1", 0); - Preprocessor_define((void *) "SWIGPHP4 1", 0); - Preprocessor_define ("SWIG_NO_OVERLOAD 1", 0); - SWIG_typemap_lang("php4"); - /* DB: Suggest using a language configuration file */ - SWIG_config_file("php4.swg"); - } - - void create_simple_make(void) { - File *f_make; - - f_make = NewFile((void *)"makefile", "w"); - if(CPlusPlus) - Printf(f_make, "CC=g++\n"); - else - Printf(f_make, "CC=gcc\n"); - - Printf(f_make, - "OBJS=%s_wrap.o\n" - "PROG=lib%s.so\n" - "CFLAGS=-fpic\n" - "LDFLAGS=-shared\n" - "PHP_INC=`php-config --includes`\n" - "EXTRA_INC=\n" - "EXTRA_LIB=\n\n", - module, module); - - Printf(f_make, - "$(PROG): $(OBJS)\n" - "\t$(CC) $(LDFLAGS) $(OBJS) -o $(PROG) $(EXTRA_LIB)\n\n" - "%%.o: %%.%s\n" - "\t$(CC) $(EXTRA_INC) $(PHP_INC) $(CFLAGS) -c $<\n", - (CPlusPlus?"cpp":"c")); - - Close(f_make); - } - - void create_extra_files(void) { - File *f_extra; - - static String *configm4=0; - static String *makefilein=0; - static String *credits=0; - - configm4=NewString(""); - Printv(configm4, Swig_file_dirname(outfile), "config.m4", NIL); - - makefilein=NewString(""); - Printv(makefilein, Swig_file_dirname(outfile), "Makefile.in", NIL); - - credits=NewString(""); - Printv(credits, Swig_file_dirname(outfile), "CREDITS", NIL); - - // are we a --with- or --enable- - int with=(withincs || withlibs)?1:0; - - // Note makefile.in only copes with one source file - // also withincs and withlibs only take one name each now - // the code they generate should be adapted to take multiple lines - - if(gen_extra) { - /* Write out Makefile.in */ - f_extra = NewFile(makefilein, "w"); - if (!f_extra) { - Printf(stderr,"Unable to open %s\n",makefilein); - SWIG_exit(EXIT_FAILURE); - } - - Printf(f_extra, - "# $Id$\n\n" - "LTLIBRARY_NAME = php_%s.la\n", - module); - - // CPP has more and different entires to C in Makefile.in - if (! CPlusPlus) Printf(f_extra,"LTLIBRARY_SOURCES = %s %s\n" - "LTLIBRARY_SOURCES_CPP = %s\n",Swig_file_filename(outfile),withc,withcxx); - else Printf(f_extra,"LTLIBRARY_SOURCES = %s\n" - "LTLIBRARY_SOURCES_CPP = %s %s\n" - "LTLIBRARY_OBJECTS_X = $(LTLIBRARY_SOURCES_CPP:.cpp=.lo) $(LTLIBRARY_SOURCES_CPP:.cxx=.lo)\n" - ,withc,Swig_file_filename(outfile),withcxx); - - Printf(f_extra,"LTLIBRARY_SHARED_NAME = php_%s.la\n" - "LTLIBRARY_SHARED_LIBADD = $(%(upper)s_SHARED_LIBADD)\n\n" - "include $(top_srcdir)/build/dynlib.mk\n", - module,module); - - Printf(f_extra,"\n# patch in .cxx support to php build system to work like .cpp\n" - ".SUFFIXES: .cxx\n\n" - ".cxx.o:\n" - " $(CXX_COMPILE) -c $<\n\n" - ".cxx.lo:\n" - " $(CXX_PHP_COMPILE)\n\n" - ".cxx.slo:\n" - " $(CXX_SHARED_COMPILE)\n\n"); - - Printf(f_extra,"\n# make it easy to test module\n" - "testmodule:\n" - " php -q -d extension_dir=modules %s\n\n",Swig_file_filename(phpfilename)); - Close(f_extra); - - /* Now config.m4 */ - // Note: # comments are OK in config.m4 if you don't mind them - // appearing in the final ./configure file - // (which can help with ./configure debugging) - - // NOTE2: phpize really ought to be able to write out a sample - // config.m4 based on some simple data, I'll take this up with - // the php folk! - f_extra = NewFile(configm4, "w"); - if (!f_extra) { - Printf(stderr, "Unable to open %s\n",configm4); - SWIG_exit(EXIT_FAILURE); - } - - Printf(f_extra, - "dnl $Id$\n" - "dnl ***********************************************************************\n" - "dnl ** THIS config.m4 is provided for PHPIZE and PHP's consumption NOT\n" - "dnl ** for any part of the rest of the %s build system\n" - "dnl ***********************************************************************\n\n" - ,module); - - if (! with) { // must be enable then - Printf(f_extra, - "PHP_ARG_ENABLE(%s, whether to enable %s support,\n" - "[ --enable-%s Enable %s support])\n\n", - module,module,module,module); - } else { - Printf(f_extra, - "PHP_ARG_WITH(%s, for %s support,\n" - "[ --with-%s[=DIR] Include %s support.])\n\n", - module,module,module,module); - // These tests try and file the library we need - Printf(f_extra,"dnl THESE TESTS try and find the library and header files\n" - "dnl your new php module needs. YOU MAY NEED TO EDIT THEM\n" - "dnl as written they assume your header files are all in the same place\n\n"); - - Printf(f_extra,"dnl ** are we looking for %s_lib.h or something else?\n",module); - if (withincs) Printf(f_extra,"HNAMES=\"%s\"\n\n",withincs); - else Printf(f_extra,"HNAMES=\"\"; # %s_lib.h ?\n\n",module); - - Printf(f_extra,"dnl ** Are we looking for lib%s.a or lib%s.so or something else?\n",module,module); - if (withlibs) Printf(f_extra,"LIBNAMES=\"%s\"\n\n",withlibs); - else Printf(f_extra,"LIBNAMES=\"\"; # lib_%s.so ?\n\n",withlibs); - Printf(f_extra,"dnl IF YOU KNOW one of the symbols in the library and you\n" - "dnl specify it below then we can have a link test to see if it works\n" - "LIBSYMBOL=\"\"\n\n"); - } - - // Now write out tests to find thing.. they may need to extend tests - Printf(f_extra,"if test \"$PHP_%(upper)s\" != \"no\"; then\n\n",module); - - // Ready for when we add libraries as we find them - Printf(f_extra," PHP_SUBST(%(upper)s_SHARED_LIBADD)\n\n",module); - - if (withlibs) { // find more than one library - Printf(f_extra," for LIBNAME in $LIBNAMES ; do\n"); - Printf(f_extra," LIBDIR=\"\"\n"); - // For each path element to try... - Printf(f_extra," for i in $PHP_%(upper)s $PHP_%(upper)s/lib /usr/lib /usr/local/lib ; do\n",module,module); - Printf(f_extra," if test -r $i/lib$LIBNAME.a -o -r $i/lib$LIBNAME.so ; then\n" - " LIBDIR=\"$i\"\n" - " break\n" - " fi\n" - " done\n\n"); - Printf(f_extra," dnl ** and $LIBDIR should be the library path\n" - " if test \"$LIBNAME\" != \"\" -a -z \"$LIBDIR\" ; then\n" - " AC_MSG_RESULT(Library files $LIBNAME not found)\n" - " AC_MSG_ERROR(Is the %s distribution installed properly?)\n" - " else\n" - " AC_MSG_RESULT(Library files $LIBNAME found in $LIBDIR)\n" - " PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $LIBDIR, %(upper)s_SHARED_LIBADD)\n" - " fi\n",module,module); - Printf(f_extra," done\n\n"); - } - - if (withincs) { // Find more than once include - Printf(f_extra," for HNAME in $HNAMES ; do\n"); - Printf(f_extra," INCDIR=\"\"\n"); - // For each path element to try... - Printf(f_extra," for i in $PHP_%(upper)s $PHP_%(upper)s/include $PHP_%(upper)s/includes $PHP_%(upper)s/inc $PHP_%(upper)s/incs /usr/local/include /usr/include; do\n",module,module,module,module,module); - // Try and find header files - Printf(f_extra," if test \"$HNAME\" != \"\" -a -r $i/$HNAME ; then\n" - " INCDIR=\"$i\"\n" - " break\n" - " fi\n" - " done\n\n"); - - Printf(f_extra, - " dnl ** Now $INCDIR should be the include file path\n" - " if test \"$HNAME\" != \"\" -a -z \"$INCDIR\" ; then\n" - " AC_MSG_RESULT(Include files $HNAME not found)\n" - " AC_MSG_ERROR(Is the %s distribution installed properly?)\n" - " else\n" - " AC_MSG_RESULT(Include files $HNAME found in $INCDIR)\n" - " PHP_ADD_INCLUDE($INCDIR)\n" - " fi\n\n",module); - Printf(f_extra," done\n\n"); - } - - if (CPlusPlus) Printf(f_extra, - " # As this is a C++ module..\n" - " PHP_REQUIRE_CXX\n" - " AC_CHECK_LIB(stdc++, cin)\n"); - - if (with) { - Printf(f_extra," if test \"$LIBSYMBOL\" != \"\" ; then\n" - " old_LIBS=\"$LIBS\"\n" - " LIBS=\"$LIBS -L$TEST_DIR/lib -lm -ldl\"\n" - " AC_CHECK_LIB($LIBNAME, $LIBSYMBOL, [AC_DEFINE(HAVE_TESTLIB,1, [ ])],\n" - " [AC_MSG_ERROR(wrong test lib version or lib not found)])\n" - " LIBS=\"$old_LIBS\"\n" - " fi\n\n"); - } - - Printf(f_extra," AC_DEFINE(HAVE_%(upper)s, 1, [ ])\n",module); - Printf(f_extra,"dnl AC_DEFINE_UNQUOTED(PHP_%(upper)s_DIR, \"$%(upper)s_DIR\", [ ])\n",module,module); - Printf(f_extra," PHP_EXTENSION(%s, $ext_shared)\n",module); - - // and thats all! - Printf(f_extra,"fi\n"); - - Close(f_extra); - - /* CREDITS */ - f_extra = NewFile(credits, "w"); - if (!f_extra) { - Printf(stderr,"Unable to open %s\n",credits); - SWIG_exit(EXIT_FAILURE); - } - Printf(f_extra, "%s\n", module); - Close(f_extra); - } - } - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - - String *filen; - String *s_type; - - /* Initialize all of the output files */ - outfile = Getattr(n,"outfile"); - - /* main output file */ - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - - Swig_banner(f_runtime); - - /* sections of the output file */ - s_init = NewString("/* init section */\n"); - s_header = NewString("/* header section */\n"); - s_wrappers = NewString("/* wrapper section */\n"); - s_type = NewString(""); - /* subsections of the init section */ - s_vinit = NewString("/* vinit subsection */\n"); - s_vdecl = NewString("/* vdecl subsection */\n"); - s_cinit = NewString("/* cinit subsection */\n"); - s_oinit = NewString("/* oinit subsection */\n"); - pragma_phpinfo = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("init",s_init); - Swig_register_filebyname("header",s_header); - Swig_register_filebyname("wrapper",s_wrappers); - - shadow_classdef = NewString(""); - shadow_code = NewString(""); - php_enum_code = NewString(""); - module_baseclass = NewString(""); - all_shadow_extra_code = NewString(""); - all_shadow_import = NewString(""); - all_shadow_baseclass = NewString(""); - - /* Set the module name */ - module = Copy(Getattr(n,"name")); - cap_module = NewStringf("%(upper)s",module); - - if(shadow) { - realpackage = module; - package = NewStringf("%sc", module); - } - - /* Set the dlname */ - if (!dlname) { -#if defined(_WIN32) || defined(__WIN32__) - dlname = NewStringf("%s.dll", module); -#else - dlname = NewStringf("%s.so", module); -#endif - } - - /* PHP module file */ - filen = NewString(""); - Printv(filen, Swig_file_dirname(outfile), module, ".php", NIL); - phpfilename = NewString(filen); - - f_phpcode = NewFile(filen, "w"); - if (!f_phpcode) { - Printf(stderr, "*** Can't open '%s'\n", filen); - SWIG_exit(EXIT_FAILURE); - } - - Printf(f_phpcode, "v)\n" - "#define %s_FETCH() zend_%s_globals *%s_globals " - "= ts_resource(%s_globals_id)\n" - "#else\n" - "#define %s_D\n" - "#define %s_DC\n" - "#define %s_C\n" - "#define %s_CC\n" - "#define %s_SG(v) (%s_globals.v)\n" - "#define %s_FETCH()\n" - "#endif\n\n" - "#endif /* PHP_%s_H */\n", - cap_module, module, module, cap_module, cap_module, cap_module, module, - cap_module, cap_module, cap_module, module, cap_module, module, module, - module, cap_module, cap_module, cap_module, cap_module, cap_module, module, - cap_module, cap_module); - - Close(f_h); - - Printf(s_header, "%s\n\n",all_cs_entry); - Printf(s_header, - "%s" - " {NULL, NULL, NULL}\n};\n\n" - "zend_module_entry %s_module_entry = {\n" - "#if ZEND_MODULE_API_NO > 20010900\n" - " STANDARD_MODULE_HEADER,\n" - "#endif\n" - " \"%s\",\n" - " %s_functions,\n" - " PHP_MINIT(%s),\n" - " PHP_MSHUTDOWN(%s),\n" - " PHP_RINIT(%s),\n" - " PHP_RSHUTDOWN(%s),\n" - " PHP_MINFO(%s),\n" - "#if ZEND_MODULE_API_NO > 20010900\n" - " NO_VERSION_YET,\n" - "#endif\n" - " STANDARD_MODULE_PROPERTIES\n" - "};\nzend_module_entry* SWIG_module_entry = &%s_module_entry;\n\n", - s_entry, module, module, module, module, module, module, module,module,module); - - String *type_table = NewString(""); - SwigType_emit_type_table(f_runtime,type_table); - Printf(s_header,"%s",type_table); - Delete(type_table); - - /* Oh dear, more things being called in the wrong order. This whole - * function really needs totally redoing. - */ - - Printv(f_runtime, s_header, NIL); - - // Wrapper_print(f_c, s_wrappers); - Wrapper_print(f_php, s_wrappers); - - Printf(s_header, "/* end header section */\n"); - Printf(s_wrappers, "/* end wrapper section */\n"); - Printf(s_vdecl, "/* end vdecl subsection */\n"); - - Printv(f_runtime, s_vdecl, s_wrappers, s_init, NIL); - Delete(s_header); - Delete(s_wrappers); - Delete(s_init); - Delete(s_vdecl); - Close(f_runtime); - Printf(f_phpcode, "%s\n%s\n?>\n", pragma_incl, pragma_code); - Close(f_phpcode); - - create_extra_files(); - - if(!gen_extra && gen_make) - create_simple_make(); - - return SWIG_OK; - } - -/* Just need to append function names to function table to register with - PHP -*/ - - void create_command(char *cname, char *iname) { -// char *lower_cname = strdup(cname); -// char *c; - -// for(c = lower_cname; *c != '\0'; c++) { -// if(*c >= 'A' && *c <= 'Z') -// *c = *c + 32; -// } - - Printf(f_h, "ZEND_NAMED_FUNCTION(%s);\n", iname); - - // This is for the single main function_entry record - if (! cs_entry) Printf(s_entry, - " ZEND_NAMED_FE(%(lower)s,\n" - " %s, NULL)\n", cname,iname); - -// free(lower_cname); - } - - /* ------------------------------------------------------------ - * functionWrapper() - * ------------------------------------------------------------ */ - - virtual int functionWrapper(Node *n) { - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *d = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - int newobject = (Getattr(n,"feature:new"))?1:0; - Parm *p; - char source[256],target[256],temp[256],argnum[32],args[32]; - int i,numopt; - String *tm; - Wrapper *f; - int num_saved = (Getattr(n,"feature:new"))?1:0; - String *cleanup, *outarg; - bool mvr=(shadow && variable_wrapper_flag && !enum_flag); - bool mvrset=0; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - mvrset=(mvr && (strcmp(iname, Char(Swig_name_set(Swig_name_member(shadow_classname, name)))) == 0)); - - // if shadow and variable wrapper we want to snag the main contents - // of this function to stick in to the property handler.... - if (mvr) { //shadow && variable_wrapper_flag && !enum_flag) { - String *member_function_name = NewString(""); - String *php_function_name = NewString(iname); - if(strcmp(iname, Char(Swig_name_set(Swig_name_member(shadow_classname, name)))) == 0) { - Setattr(shadow_set_vars, php_function_name, name); - } - if(strcmp(iname, Char(Swig_name_get(Swig_name_member(shadow_classname, name)))) == 0) { - Setattr(shadow_get_vars, php_function_name, name); - } - Putc(toupper((int )*iname), member_function_name); - Printf(member_function_name, "%s", iname+1); - - cpp_func(Char(member_function_name), d, l, php_function_name); - - Delete(php_function_name); - Delete(member_function_name); - } - - outarg = cleanup = NULL; - f = NewWrapper(); - numopt = 0; - - outarg = NewString(""); - cleanup = NewString(""); - - // Special action for shadowing destructors under php. - // The real destructor is the resource list destructor, this is - // merely the thing that actually knows how to destroy... - - if (destructor) { - String *destructorname=NewString(""); - Printf(destructorname,"_%s",Swig_name_wrapper(iname)); - Setattr(classnode,"destructor",destructorname); - - Wrapper *df = NewWrapper(); - Printf(df->def,"/* This function is designed to be called by the zend list destructors to typecast and do the actual destruction */\n" - "void %s(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) {\n",destructorname); - - Wrapper_add_localv(df, "value", "swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr", NIL); - Wrapper_add_localv(df, "ptr", "void *ptr=value->ptr", NIL); - Wrapper_add_localv(df, "newobject", "int newobject=value->newobject", NIL); - // Magic spell nicked from further down. - emit_args(d, l, df); - emit_attach_parmmaps(l,f); - - // Get type of first arg, thing to be destructed - // Skip ignored arguments - { - p=l; - //while (Getattr(p,"tmap:ignore")) {p = Getattr(p,"tmap:ignore:next");} - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - - Printf(df->code, - " efree(value);\n" - " if (! newobject) return; /* can't delete it! */\n" - " SWIG_ZTS_ConvertResourceData(ptr,rsrc->type,type_name,(void **) &arg1,SWIGTYPE%s TSRMLS_CC);\n" - " if (! arg1) zend_error(E_ERROR, \"%s resource already free'd\");\n" - ,SwigType_manglestr(pt), shadow_classname); - } - emit_action(n,df); - - Printf(df->code,"}\n"); - - Wrapper_print(df,s_wrappers); - } - - if (mvr) { // do prop[gs]et header - if (mvrset) Printf(f->def, "static int _wrap_%s(zend_property_reference *property_reference, pval *value) {\n",iname); - else Printf(f->def, "static pval _wrap_%s(zend_property_reference *property_reference) {\n",iname); - } else { // regular header - create_command(iname, Char(Swig_name_wrapper(iname))); - Printv(f->def, "ZEND_NAMED_FUNCTION(" , Swig_name_wrapper(iname), ") {\n", NIL); - } - - emit_args(d, l, f); - /* Attach standard typemaps */ - - emit_attach_parmmaps(l,f); - - int num_arguments = emit_num_arguments(l); - int num_required = emit_num_required(l); - numopt = num_arguments - num_required; - - // we do +1 because we are going to push in this_ptr as arg0 if present - // or do we need to? - - sprintf(args, "%s[%d]", "zval **args", num_arguments+1); - - Wrapper_add_local(f, "args",args); - Wrapper_add_localv(f, "argbase", "int argbase=0", NIL); - // This generated code may be called - // 1) as an object method, or - // 2) as a class-method/function (without a "this_ptr") - // Option (1) has "this_ptr" for "this", option (2) needs it as - // first parameter - // NOTE: possible we ignore this_ptr as a param for native constructor - - if (native_constructor) { - if (native_constructor==NATIVE_CONSTRUCTOR) Printf(f->code, "/* NATIVE Constructor */\nint self_constructor=1;\n"); - else Printf(f->code, "/* ALTERNATIVE Constructor */\n"); - } - - if (mvr && ! mvrset) { - Wrapper_add_local(f, "_return_value", "zval _return_value"); - Wrapper_add_local(f, "return_value", "zval *return_value=&_return_value"); - }; - - // only let this_ptr count as arg[-1] if we are not a constructor - // if we are a constructor and this_ptr is null we are called as a class - // method and can make one of us - if (! mvr && native_constructor==0) Printf(f->code, - "if (this_ptr && this_ptr->type==IS_OBJECT) {\n" - " /* fake this_ptr as first arg (till we can work out how to do it better */\n" - " argbase++;\n" - "}\n"); - - // I'd like to write out: - //" //args[argbase++]=&this_ptr;\n" - // but zend_get_parameters_array_ex can't then be told to leave - // the first slot alone, so we have to check whether or not to access - // this_ptr explicitly in each case where we normally just read args[] - - if(numopt > 0) { // membervariable wrappers do not have optional args - Wrapper_add_local(f, "arg_count", "int arg_count"); - Printf(f->code, - "arg_count = ZEND_NUM_ARGS();\n" - "if(arg_count<(%d-argbase) || arg_count>(%d-argbase))\n" - "\tWRONG_PARAM_COUNT;\n\n", - num_required, num_arguments); - - /* Verified args, retrieve them... */ - Printf(f->code, - "if(zend_get_parameters_array_ex(arg_count-argbase,args)!=SUCCESS)" - "\n\t\tWRONG_PARAM_COUNT;\n\n"); - - } else if (!mvr) { - Printf(f->code, - "if(((ZEND_NUM_ARGS() + argbase )!= %d) || (zend_get_parameters_array_ex(%d-argbase, args)" - "!= SUCCESS)) {\n" - "WRONG_PARAM_COUNT;\n}\n\n", - num_arguments, num_arguments); - } - - /* Now convert from php to C variables */ - // At this point, argcount if used is the number of deliberatly passed args - // not including this_ptr even if it is used. - // It means error messages may be out by argbase with error - // reports. We can either take argbase into account when raising - // errors, or find a better way of dealing with _thisptr - // I would like, if objects are wrapped, to assume _thisptr is always - // _this and the and not the first argument - // This may mean looking at Lang::memberfunctionhandler - - for (i = 0, p = l; i < num_arguments; i++) { - /* Skip ignored arguments */ - //while (Getattr(p,"tmap:ignore")) { p = Getattr(p,"tmap:ignore:next");} - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - - - if (mvr) { // do we assert that numargs=2, that i<2 - if (i==0) sprintf(source,"&(property_reference->object)"); - else sprintf(source,"&value"); - } else { - // Do we fake this_ptr as arg0, or just possibly shift other args by 1 if we did fake? - if (i==0) sprintf(source, "((%d= (num_required)) - Printf(f->code,"\tif(arg_count > %d) {\n", i); - - Setattr(p,"emit:input", source); - - if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$target",target); - Replaceall(tm,"$source",source); - Replaceall(tm,"$input", source); - Printf(f->code,"%s\n",tm); - p = Getattr(p,"tmap:in:next"); - if (i >= num_required) { - Printf(f->code,"}\n"); - } - continue; - } else { - Printf(stderr,"%s : Line %d, Unable to use type %s as a function argument.\n", input_file, line_number, SwigType_str(pt,0)); - } - if (i>= num_required) - Printf(f->code,"\t}\n"); - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - for (i = 0, p = l; p; i++) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - num_saved = 0; - for (i=0,p = l; p;i++) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$input",Getattr(p,"lname")); - Replaceall(tm,"$target","return_value"); - Replaceall(tm,"$result","return_value"); - - String *in = Getattr(p,"emit:input"); - if (in) { - sprintf(temp,"_saved[%d]", num_saved); - Replaceall(tm,"$arg",temp); - Printf(f->code,"_saved[%d] = %s;\n", num_saved, in); - num_saved++; - } - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - // These are saved for argout again... - if(num_saved) { - sprintf(temp, "_saved[%d]",num_saved); - // Used to be zval *, perhaps above we should use * %s - Wrapper_add_localv(f,"_saved","zval **",temp,NIL); - } - - /* emit function call*/ - if (destructor) { - // If it is a registered resource (and it always should be) - // then destroy it the resource way - - Printf(f->code, - "/*if ((*args[0])->type==IS_RESOURCE) { */\n" - "/* Get zend list destructor to free it */\n" - "/* zend_list_delete(Z_LVAL_PP(args[0])); */\n" - "/* } else {*/ \n",name,name - ); - // but leave the old way in for as long as we accept strings as swig objects - emit_action(n,f); - Printf(f->code,"/*}*/\n"); - } else { - emit_action(n,f); - } - - if((tm = Swig_typemap_lookup((char*)"out",d,iname,(char*)"result",(char*)"result",(char*)"return_value",0))) { - Replaceall(tm, "$input", "result"); - Replaceall(tm, "$source", "result"); - Replaceall(tm, "$target", "return_value"); - Replaceall(tm, "$result", "return_value"); - Replaceall(tm,"$owner", newobject ? "1" : "0"); - Printf(f->code, "%s\n", tm); - // are we returning a wrapable object? - // I don't know if this test is comlete, I nicked it - if(is_shadow(d) && (SwigType_type(d) != T_ARRAY)) { - Printf(f->code,"/* Wrap this return value */\n"); - if (native_constructor==NATIVE_CONSTRUCTOR) { - Printf(f->code, "if (this_ptr) {\n/* NATIVE Constructor, use this_ptr */\n"); - Printf(f->code,"zval *_cPtr; MAKE_STD_ZVAL(_cPtr);\n" - "*_cPtr = *return_value;\n" - "INIT_ZVAL(*return_value);\n" - "add_property_zval(this_ptr,\"_cPtr\",_cPtr);\n" - "} else if (! this_ptr) ",shadow_classname); - } - { // THIS CODE only really needs writing out if the object to be returned - // Is being shadow-wrap-thingied - Printf(f->code, "{\n/* ALTERNATIVE Constructor, make an object wrapper */\n"); - // Make object - String *shadowrettype = NewString(""); - SwigToPhpType(d, iname, shadowrettype, shadow); - - Printf(f->code, - "zval *obj, *_cPtr;\n" - "MAKE_STD_ZVAL(obj);\n" - "MAKE_STD_ZVAL(_cPtr);\n" - "*_cPtr = *return_value;\n" - "INIT_ZVAL(*return_value);\n"); - - if (! shadow) { - Printf(f->code, - "*return_value=*_cPtr;\n"); - } else { - Printf(f->code, - "object_init_ex(obj,ptr_ce_swig_%s);\n" - "add_property_zval(obj,\"_cPtr\",_cPtr);\n" - "*return_value=*obj;\n", - shadowrettype); - } - Printf(f->code, "}\n"); - } - } // end of if-shadow lark - } else { - Printf(stderr,"%s: Line %d, Unable to use return type %s in function %s.\n", input_file, line_number, SwigType_str(d,0), name); - } - - if(outarg) - Printv(f->code,outarg,NIL); - - if(cleanup) - Printv(f->code,cleanup,NIL); - - // Whats this bit for? - if((tm = Swig_typemap_lookup((char*)"ret",d,iname,(char *)"result", (char*)"result",(char*)"",0))) { - Printf(f->code,"%s\n", tm); - } - - Replaceall(f->code,"$cleanup",cleanup); - Replaceall(f->code,"$symname",iname); - - if (mvr) { - if (! mvrset) Printf(f->code,"return _return_value;\n"); - else Printf(f->code,"return SUCCESS;\n"); - } - - Printf(f->code, "}\n"); - Wrapper_print(f,s_wrappers); - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * variableWrapper() - * ------------------------------------------------------------ */ - - virtual int OLDvariableWrapper(Node *n) { - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - String *tm; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - SwigType_remember(t); - - /* First link C variables to PHP */ - - tm = Swig_typemap_lookup_new("varinit", n, name, 0); - if(tm) { - Replaceall(tm, "$target", name); - Printf(s_vinit, "%s\n", tm); - } else { - Printf(stderr,"%s: Line %d, Unable to link with type %s\n", - input_file, line_number, SwigType_str(t,0), name); - } - - /* Now generate PHP -> C sync blocks */ - tm = Swig_typemap_lookup_new("varin", n, name, 0); - /* - if(tm) { - Replaceall(tm, "$symname", iname); - Printf(f_c->code, "%s\n", tm); - } else { - Printf(stderr,"%s: Line %d, Unable to link with type %s\n", - input_file, line_number, SwigType_str(t, 0), name); - } -*/ - /* Now generate C -> PHP sync blocks */ -/* - if(!Getattr(n,"feature:immutable")) { - - tm = Swig_typemap_lookup_new("varout", n, name, 0); - if(tm) { - Replaceall(tm, "$symname", iname); - Printf(f_php->code, "%s\n", tm); - } else { - Printf(stderr,"%s: Line %d, Unable to link with type %s\n", - input_file, line_number, SwigType_str(t, 0), name); - } - } -*/ - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - char *value = GetChar(n,"value"); - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - String *rval; - String *tm; - - SwigType_remember(type); - - switch(SwigType_type(type)) { - case T_STRING: - rval = NewStringf("\"%s\"", value); - break; - case T_CHAR: - rval = NewStringf("\'%s\'", value); - break; - default: - rval = NewString(value); - } - - if((tm = Swig_typemap_lookup_new("consttab", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); - Replaceall(tm, "$value", value); - Printf(s_cinit, "%s\n", tm); - } - return SWIG_OK; - } - - /* - * PHP4::pragma() - * - * Pragma directive. - * - * %pragma(php4) code="String" # Includes a string in the .php file - * %pragma(php4) include="file.pl" # Includes a file in the .php file - */ - - virtual int pragmaDirective(Node *n) { - if (!ImportMode) { - String *lang = Getattr(n,"lang"); - String *type = Getattr(n,"name"); - String *value = Getattr(n,"value"); - - if (Strcmp(lang,"php4") == 0) { - - if (Strcmp(type, "code") == 0) { - if (value) - Printf(pragma_code, "%s\n", value); - } else if (Strcmp(type, "include") == 0) { - if (value) - Printf(pragma_incl, "include \"%s\";\n", value); - } else if (Strcmp(type, "phpinfo") == 0) { - if (value) - Printf(pragma_phpinfo, "%s\n", value); - } else { - Printf(stderr, "%s : Line %d. Unrecognized pragma.\n", - input_file, line_number); - } - } - } - return Language::pragmaDirective(n); - } - - /* ------------------------------------------------------------ - * classDeclaration() - * ------------------------------------------------------------ */ - - virtual int classDeclaration(Node *n) { - String *symname = Getattr(n,"sym:name"); - Setattr(n,"php:proxy",symname); - return Language::classDeclaration(n); - } - - /* ------------------------------------------------------------ - * classHandler() - * ------------------------------------------------------------ */ - - virtual int classHandler(Node *n) { - constructors=0; - //SwigType *t = Getattr(n, "classtype"); - if(class_name) free(class_name); - class_name = Swig_copy_string(GetChar(n, "name")); - // String *use_class_name=SwigType_manglestr(SwigType_ltype(t)); - - if(shadow) { - char *rename = GetChar(n, "sym:name"); - if (!addSymbol(rename,n)) return SWIG_ERROR; - shadow_classname = Swig_copy_string(rename); - cs_entry = NewString(""); - Printf(cs_entry,"/* Function entries for %s */\n" - "static zend_function_entry %s_functions[] = {\n" - ,shadow_classname, shadow_classname); - - if(Strcmp(shadow_classname, module) == 0) { - Printf(stderr, "class name cannot be equal to module name: %s\n", shadow_classname); - SWIG_exit(1); - } - - Clear(shadow_classdef); - Clear(shadow_code); - - have_default_constructor = 0; - shadow_enum_code = NewString(""); - this_shadow_baseclass = NewString(""); - this_shadow_multinherit = NewString(""); - this_shadow_extra_code = NewString(""); - this_shadow_import = NewString(""); - - shadow_get_vars = NewHash(); - shadow_set_vars = NewHash(); - - /* Deal with inheritance */ - List *baselist = Getattr(n, "bases"); - - if(baselist) { - int class_count = 0; - Node *base = Firstitem(baselist); - - while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist); - - if (base && is_shadow(Getattr(base, "name"))) { - class_count++; - Printf(this_shadow_baseclass, "%s", Getattr(base, "name")); - } - - if (base) for(base = Nextitem(baselist); base; base = Nextitem(baselist)) { - if (Getattr(base,"feature:ignore")) continue; - if(is_shadow(Getattr(base, "name"))) { - class_count++; - Printf(this_shadow_multinherit, "%s ", Getattr(base, "name")); - } - } - - if(class_count > 1) Printf(stderr, "Error: %s inherits from multiple base classes(%s %s). Multiple inheritance is not directly supported by PHP4, SWIG may support it at some point in the future.\n", shadow_classname, base, this_shadow_multinherit); - } - - /* Write out class init code */ - Printf(s_vdecl,"static zend_class_entry ce_swig_%s;\n",shadow_classname); - Printf(s_vdecl,"static zend_class_entry* ptr_ce_swig_%s=NULL;\n",shadow_classname); - } - - classnode=n; - Language::classHandler(n); - classnode=0; - - if(shadow) { - DOH *key; - int gcount, scount; - String *s_propget=NewString(""); - String *s_propset=NewString(""); - List *baselist = Getattr(n, "bases"); - Node *base = NULL; - - // If no constructor was generated (abstract class) we had better - // generate a constructor that raises an error about instantiating - // abstract classes - if (! constructors || Getattr(n,"abstract")) { - // have to write out fake constructor which raises an error when called - abstractConstructorHandler(n); - } - - Printf(s_oinit,"/* Define class %s */\n" - "INIT_OVERLOADED_CLASS_ENTRY(ce_swig_%s,\"%(lower)s\",%s_functions," - "NULL,_wrap_propget_%s,_wrap_propset_%s);\n", - shadow_classname,shadow_classname,shadow_classname, - shadow_classname,shadow_classname,shadow_classname); - - // ******** Write property SET handlers - Printf(s_header,"static int _wrap_propset_%s(zend_property_reference *property_reference, pval *value);\n", shadow_classname); - Printf(s_propset,"static int _wrap_propset_%s(zend_property_reference *property_reference, pval *value) { \n" - " zval * _value;\n" - " zend_llist_element *element = property_reference->elements_list->head;\n" - " zend_overloaded_element *property=(zend_overloaded_element *)element->data;\n" - " if (_propset_%s(property_reference, value)==SUCCESS) return SUCCESS;\n" - " /* set it ourselves as it is %s */\n" - " MAKE_STD_ZVAL(_value);\n" - " *_value=*value;\n" - " INIT_PZVAL(_value);\n" - " zval_copy_ctor(_value);\n" - " return add_property_zval_ex(property_reference->object,Z_STRVAL_P(&(property->element)),1+Z_STRLEN_P(&(property->element)),_value);\n" - "}\n", shadow_classname, shadow_classname,shadow_classname); - Printf(s_header,"static int _propset_%s(zend_property_reference *property_reference, pval *value);\n", shadow_classname); - Printf(s_propset,"static int _propset_%s(zend_property_reference *property_reference, pval *value) {\n", shadow_classname); - - if (baselist) base=Firstitem(baselist); - else base=NULL; - while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist); - key = Firstkey(shadow_set_vars); - - // Print function header; we only need to find property name if there - // are properties for this class to look up... - if (key || ! base) { // or if we are base class and set it ourselves - Printf(s_propset," /* get the property name */\n" - " zend_llist_element *element = property_reference->elements_list->head;\n" - " zend_overloaded_element *property=(zend_overloaded_element *)element->data;\n" - " char *propname=Z_STRVAL_P(&(property->element));\n"); - } else { - if (base) { - Printf(s_propset," /* No extra properties for subclass %s */\n",shadow_classname); - } else { - Printf(s_propset," /* No properties for base class %s */\n",shadow_classname); - } - } - - scount=0; - while (key) { - if (scount++) Printf(s_propset," else"); - Printf(s_propset," if (strcmp(propname,\"%s\")==0) {\n" - " return _wrap_%s(property_reference, value);\n" - " }",Getattr(shadow_set_vars,key),key); - - key=Nextkey(shadow_set_vars); - } - - if (scount) Printf(s_propset," else"); - - // If there is a base class then chain it's handler else set directly - // try each base class handler, else set directly... - if (base) { - Printf(s_propset, " {\n /* chain to base class */\n"); - while(base) { - Printf(s_propset," if (_propset_%s(property_reference, value)==SUCCESS) return SUCCESS;\n", - GetChar(base, "sym:name")); - - base=Nextitem(baselist); - while (base && Getattr(base,"feature:ignore")) base=Nextitem(baselist); - } - Printf(s_propset," }\n"); - } - Printf(s_propset," return FAILURE;\n}\n\n"); - - // ******** Write property GET handlers - Printf(s_header,"static pval _wrap_propget_%s(zend_property_reference *property_reference);\n", shadow_classname); - Printf(s_propget,"static pval _wrap_propget_%s(zend_property_reference *property_reference) {\n" - " pval result;\n" - " pval **_result;\n" - " zend_llist_element *element = property_reference->elements_list->head;\n" - " zend_overloaded_element *property=(zend_overloaded_element *)element->data;\n" - " result.type = IS_NULL;\n" - " if (_propget_%s(property_reference, &result)==SUCCESS) return result;\n" - " /* return it ourselves */\n" - " if (zend_hash_find(Z_OBJPROP_P(property_reference->object),Z_STRVAL_P(&(property->element)),1+Z_STRLEN_P(&(property->element)),(void**)&_result)==SUCCESS) {\n" - " zval *_value;\n" - " MAKE_STD_ZVAL(_value);" - " *_value=**_result;\n" - " INIT_PZVAL(_value);\n" - " zval_copy_ctor(_value);\n" - " return *_value;\n" - " }\n" - " result.type = IS_NULL;\n" - " return result;\n" - "}\n", shadow_classname, shadow_classname); - Printf(s_header,"static int _propget_%s(zend_property_reference *property_reference, pval *value);\n", shadow_classname); - Printf(s_propget,"static int _propget_%s(zend_property_reference *property_reference, pval *value) {\n", shadow_classname); - - if (baselist) base=Firstitem(baselist); - else base=NULL; - while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist); - key = Firstkey(shadow_get_vars); - - // Print function header; we only need to find property name if there - // are properties for this class to look up... - if (key || !base ) { // or if we are base class... - Printf(s_propget," /* get the property name */\n" - " zend_llist_element *element = property_reference->elements_list->head;\n" - " zend_overloaded_element *property=(zend_overloaded_element *)element->data;\n" - " char *propname=Z_STRVAL_P(&(property->element));\n"); - } else { - if (base) { - Printf(s_propget," /* No extra properties for subclass %s */\n",shadow_classname); - } else { - Printf(s_propget," /* No properties for base class %s */\n",shadow_classname); - } - } - - gcount=0; - while (key) { - if (gcount++) Printf(s_propget," else"); - Printf(s_propget," if (strcmp(propname,\"%s\")==0) {\n" - " *value=_wrap_%s(property_reference);\n" - " return SUCCESS;\n" - " }",Getattr(shadow_get_vars,key),key); - - key=Nextkey(shadow_get_vars); - } - - if (gcount) Printf(s_propget," else"); - - // If there is a base class then chain it's handler else return null - if (base) { - Printf(s_propget, " {\n /* chain to base class */\n"); - while(base) { - Printf(s_propget," if (_propget_%s(property_reference, value)==SUCCESS) return SUCCESS;\n", - GetChar(base, "sym:name")); - - base=Nextitem(baselist); - while (base && Getattr(base,"feature:ignore")) base=Nextitem(baselist); - } - Printf(s_propget," }\n"); - } - Printf(s_propget," return FAILURE;\n}\n\n"); - - // wrappers generated now... - - // add wrappers to output code - Printf(s_wrappers,"/* property handler for class %s */\n",shadow_classname); - Printv(s_wrappers,s_propget,s_propset,NIL); - - // Save class in class table - if (baselist) base=Firstitem(baselist); - else base=NULL; - while(base && Getattr(base,"feature:ignore")) base = Nextitem(baselist); - - if (base) { - Printf(s_oinit,"if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,&ce_swig_%s,NULL))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n", - shadow_classname,shadow_classname,GetChar(base, "sym:name"), shadow_classname); - } else { - Printf(s_oinit,"if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,NULL,NULL))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n", - shadow_classname,shadow_classname, shadow_classname); - } - Printf(s_oinit,"\n"); - - - Printv(f_phpcode, shadow_classdef, shadow_code, NIL); - - // Write the enum initialisation code in a static block - // These are all the enums defined withing the c++ class. - - // PHP Needs to handle shadow enums properly still - if(strlen(Char(shadow_enum_code)) != 0 ) Printv(f_phpcode, "{\n /* enum */\n", shadow_enum_code, " }\n", NIL); - - free(shadow_classname); - shadow_classname = NULL; - - Delete(shadow_enum_code); shadow_enum_code = NULL; - Delete(this_shadow_baseclass); this_shadow_baseclass = NULL; - Delete(this_shadow_extra_code); this_shadow_extra_code = NULL; - Delete(this_shadow_import); this_shadow_import = NULL; - Delete(shadow_set_vars); shadow_set_vars = NULL; - Delete(shadow_get_vars); shadow_get_vars = NULL; - Delete(this_shadow_multinherit); this_shadow_multinherit = NULL; - - Printf(all_cs_entry,"%s { NULL, NULL, NULL}\n};\n",cs_entry); - //??delete cs_entry; - cs_entry=NULL; - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberfunctionHandler() - * ------------------------------------------------------------ */ - - virtual int memberfunctionHandler(Node *n) { - char *name = GetChar(n, "name"); - char *iname = GetChar(n, "sym:name"); - SwigType *t = Getattr(n, "type"); - ParmList *l = Getattr(n, "parms"); - - this->Language::memberfunctionHandler(n); - - if(shadow) { - char *realname = iname ? iname : name; - String *php_function_name = Swig_name_member(shadow_classname, realname); - - cpp_func(iname, t, l, realname, php_function_name); - - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * membervariableHandler() - * ------------------------------------------------------------ */ - - virtual int membervariableHandler(Node *n) { - - wrapping_member = 1; - variable_wrapper_flag = 1; - Language::membervariableHandler(n); - wrapping_member = 0; - variable_wrapper_flag = 0; - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * staticmemberfunctionHandler() - * ------------------------------------------------------------ */ - - virtual int staticmemberfunctionHandler(Node *n) { - char *name = GetChar(n, "name"); - char *iname = GetChar(n, "sym:name"); - - Language::staticmemberfunctionHandler(n); - - if(shadow) { - String *symname = Getattr(n, "sym:name"); - static_flag = 1; - char *realname = iname ? iname : name; - String *php_function_name = Swig_name_member(shadow_classname, realname); - cpp_func(Char(symname), Getattr(n, "type"), Getattr(n, "parms"), symname, php_function_name); - static_flag = 0; - } - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * staticmembervariableHandler() - * ------------------------------------------------------------ */ - - virtual int staticmembervariableHandler(Node *n) { - SwigType *d = Getattr(n, "type"); - char *iname = GetChar(n, "sym:name"); - char *name = GetChar(n, "name"); - String *static_name = NewStringf("%s::%s", class_name, name); -// String *use_class_name=SwigType_manglestr(SwigType_ltype(t)); - Wrapper *f; - - /* A temporary(!) hack for static member variables. - * Php currently supports class functions, but not class variables. - * Until it does, we convert a class variable to a class function - * that returns the current value of the variable. E.g. - * - * class Example { - * public: - * static int ncount; - * }; - * - * would be available in php as Example::ncount() - */ - static_flag = 1; - if(Getattr(n,"feature:immutable")) { - const_flag = 1; - } - cpp_func(iname, d, 0, iname); - static_flag = 0; - - create_command(iname, Char(Swig_name_wrapper(iname))); - - f = NewWrapper(); - - Printv(f->def, "ZEND_NAMED_FUNCTION(", Swig_name_wrapper(iname), ") {\n", NIL); - - /* If a argument is given we set the variable. Then we return - * the current value - */ - - Printf(f->code, - "zval **args[1];\n" - "int argcount;\n\n" - "argcount = ZEND_NUM_ARGS();\n" - "if(argcount > %d) WRONG_PARAM_COUNT;\n\n", (const_flag? 0 : 1)); - - if(!const_flag) { - Printf(f->code, "if(argcount) {\n"); - - Printf(f->code, "if(zend_get_parameters_array_ex(argcount, args) != SUCCESS) WRONG_PARAM_COUNT;\n"); - - switch(SwigType_type(d)) { - case T_BOOL: - case T_INT: - case T_SHORT: - case T_LONG: - case T_SCHAR: - case T_UINT: - case T_USHORT: - case T_ULONG: - case T_UCHAR: - Printf(f->code, - "convert_to_long_ex(args[0]);\n" - "%s = Z_LVAL_PP(args[0]);\n", static_name); - break; - case T_CHAR: - Printf(f->code, - "convert_to_string_ex(args[0]);\n" - "%s = estrdup(Z_STRVAL(args[0]));\n", static_name); - break; - case T_DOUBLE: - case T_FLOAT: - Printf(f->code, - "convert_to_double_ex(args[0]);\n" - "%s = Z_DVAL_PP(args[0]);\n", - static_name); - break; - case T_VOID: - break; - case T_USER: - Printf(f->code, "convert_to_string_ex(args[0]);\n"); - get_pointer(Char(iname), (char*)"variable", (char*)"args[0]", Char(static_name), d, f->code, (char *)"RETURN_FALSE"); - break; - case T_POINTER: - case T_ARRAY: - case T_REFERENCE: - Printf(f->code, "convert_to_string_ex(args[0]);\n"); - get_pointer(Char(iname), (char*)"variable", (char*)"args[0]", Char(static_name), d, f->code, (char*)"RETURN_FALSE"); - break; - default: - Printf(stderr,"%s : Line %d, Unable to use type %s as a class variable.\n", input_file, line_number, SwigType_str(d,0)); - break; - } - - Printf(f->code, "}\n\n"); - - } /* end of const_flag */ - - switch(SwigType_type(d)) { - case T_BOOL: - case T_INT: - case T_SHORT: - case T_LONG: - case T_SCHAR: - case T_UINT: - case T_USHORT: - case T_ULONG: - case T_UCHAR: - Printf(f->code, - "RETURN_LONG(%s);\n", static_name); - break; - case T_DOUBLE: - case T_FLOAT: - Printf(f->code, - "RETURN_DOUBLE(%s);\n", static_name); - break; - case T_CHAR: - Printf(f->code, - "{\nchar ctemp[2];\n" - "ctemp[0] = %s;\n" - "ctemp[1] = 0;\n" - "RETURN_STRING(ctemp, 1);\n}\n", - static_name); - break; - - case T_USER: - case T_POINTER: - Printf(f->code, - "SWIG_SetPointerZval(return_value, (void *)%s, " - "SWIGTYPE%s);\n", static_name, SwigType_manglestr(d)); - break; - case T_STRING: - Printf(f->code, "RETURN_STRING(%s, 1);\n", static_name); - break; - } - - - Printf(f->code, "}\n"); - - const_flag = 0; - - Wrapper_print(f, s_wrappers); - - return SWIG_OK; - } - - - void SwigToPhpType(SwigType *t, String_or_char *pname, String* php_type, int shadow_flag) { - char *ptype = 0; - - if(shadow_flag) - ptype = PhpTypeFromTypemap((char*)"pstype", t, pname,(char*)""); - if(!ptype) - ptype = PhpTypeFromTypemap((char*)"ptype",t,pname,(char*)""); - - - if(ptype) { - Printf(php_type, ptype); - free(ptype); - } - else { - /* Map type here */ - switch(SwigType_type(t)) { - case T_CHAR: - case T_SCHAR: - case T_UCHAR: - case T_SHORT: - case T_USHORT: - case T_INT: - case T_UINT: - case T_LONG: - case T_ULONG: - case T_FLOAT: - case T_DOUBLE: - case T_BOOL: - case T_STRING: - case T_VOID: - Printf(php_type, ""); - break; - case T_POINTER: - case T_REFERENCE: - case T_USER: - if(shadow_flag && is_shadow(t)) - Printf(php_type, Char(is_shadow(t))); - else - Printf(php_type, ""); - break; - case T_ARRAY: - /* TODO */ - break; - default: - Printf(stderr, "SwigToPhpType: unhandled data type: %s\n", SwigType_str(t,0)); - break; - } - } - } - - - char *PhpTypeFromTypemap(char *op, SwigType *t, String_or_char *pname, String_or_char *lname) { - String *tms; - char bigbuf[1024]; - char *tm; - char *c = bigbuf; - if(!(tms = Swig_typemap_lookup(op, t, pname, lname, (char*)"", (char*)"", NULL))) return NULL; - - tm = Char(tms); - while(*tm && (isspace(*tm) || *tm == '{')) tm++; - while(*tm && *tm != '}') *c++ = *tm++; - *c='\0'; - return Swig_copy_string(bigbuf); - } - - int abstractConstructorHandler(Node *n) { - char *iname = GetChar(n, "sym:name"); - if (shadow) { - Wrapper *f; - f = NewWrapper(); - - // constructor header - if (cs_entry) Printf(cs_entry, - " ZEND_NAMED_FE(%(lower)s,\n" - " _wrap_new_%s, NULL)\n", iname,iname); - // now constructor body - Printf(f_h, "ZEND_NAMED_FUNCTION(_wrap_new_%s);\n",iname); - Printf(f->def, "ZEND_NAMED_FUNCTION(_wrap_new_%s) {\n" - "zend_error(E_ERROR,\"Cannot create swig object type: %s as the underlying object is abstract\");\n" - "}\n\n", iname, iname); - Wrapper_print(f,s_wrappers); - DelWrapper(f); - } - return SWIG_OK; - } - /* ------------------------------------------------------------ - * constructorHandler() - * ------------------------------------------------------------ */ - - virtual int constructorHandler(Node *n) { - char *iname = GetChar(n, "sym:name"); - - if (shadow) native_constructor = (strcmp(iname, shadow_classname) == 0)?\ - NATIVE_CONSTRUCTOR:ALTERNATIVE_CONSTRUCTOR; - else native_constructor=0; - constructors++; - Language::constructorHandler(n); - - if(shadow) { - // But we also need one per wrapped-class - if (cs_entry) Printf(cs_entry, - " ZEND_NAMED_FE(%(lower)s,\n" - " _wrap_new_%s, NULL)\n", iname,iname); - } - - native_constructor = 0; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * destructorHandler() - * ------------------------------------------------------------ */ - - virtual int destructorHandler(Node *n) { - char *iname = GetChar(n, "sym:name"); - - destructor=1; - Language::destructorHandler(n); - destructor=0; - - // we don't give user access to destructors, they have to unset var - // and let php dispose instead - if(0 && shadow) { - // But we also need one per wrapped-class - if (cs_entry) Printf(cs_entry, - " ZEND_NAMED_FE(_destroy_%(lower)s,\n" - " _wrap_delete_%s, NULL)\n", iname,iname); - } - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberconstantHandler() - * ------------------------------------------------------------ */ - - virtual int memberconstantHandler(Node *n) { - wrapping_member = 1; - Language::memberconstantHandler(n); - wrapping_member = 0; - return SWIG_OK; - } - - // This method is quite stale and ought to be factored out - void cpp_func(char *iname, SwigType *t, ParmList *l, String *php_function_name, String *handler_name = NULL) { - if(!shadow) return; - - // if they didn't provide a handler name, use the realname - if (! handler_name) handler_name=php_function_name; - - if(l) { - if(SwigType_type(Getattr(l, "type")) == T_VOID) { - l = nextSibling(l); - } - } - - // But we also need one per wrapped-class - // Printf(f_h, "x ZEND_NAMED_FUNCTION(%s);\n", Swig_name_wrapper(handler_name)); - if (cs_entry && !(variable_wrapper_flag && shadow)) Printf(cs_entry, - " ZEND_NAMED_FE(%(lower)s,\n" - " %s, NULL)\n", php_function_name,Swig_name_wrapper(handler_name)); - - if(variable_wrapper_flag) { return; } - - /* Workaround to overcome Getignore(p) not working - p does not always - * have the Getignore attribute set. Noticeable when cpp_func is called - * from cpp_member_func() - */ - - Wrapper *f = NewWrapper(); - emit_args(NULL, l, f); - DelWrapper(f); - - /*Workaround end */ - - } - -}; /* class PHP4 */ - -/* ----------------------------------------------------------------------------- - * swig_php() - Instantiate module - * ----------------------------------------------------------------------------- */ - -static PHP4 *maininstance=0; - -// We use this function to be able to write out zend_register_list_destructor_ex -// lines for most things in the type table -// NOTE: it's a function NOT A PHP4::METHOD -extern "C" -void typetrace(SwigType *ty, String *mangled, String *clientdata) { - Node *class_node; - if (!zend_types) { - zend_types=NewHash(); - } - // we want to know if the type which reduced to this has a constructor - if ((class_node=maininstance->classLookup(ty))) { - if (! Getattr(zend_types,mangled)) { - // OK it may have been set before by a different SwigType but it would - // have had the same underlying class node I think - // - it is certainly required not to have different originating class - // nodes for the same SwigType - Setattr(zend_types,mangled,class_node); - } - } else { // a non-class pointer - Setattr(zend_types,mangled,NOTCLASS); - } - if (r_prevtracefunc) (*r_prevtracefunc)(ty, mangled, (String *) clientdata); -} - -extern "C" Language * -swig_php(void) { - maininstance=new PHP4(); - if (! r_prevtracefunc) { - r_prevtracefunc=SwigType_remember_trace(typetrace); - } else { - Printf(stderr,"php4 Typetrace vector already saved!\n"); - assert(0); - } - return maininstance; -} - diff --git a/Source/Modules1.1/pike.cxx b/Source/Modules1.1/pike.cxx deleted file mode 100644 index bcd51763e..000000000 --- a/Source/Modules1.1/pike.cxx +++ /dev/null @@ -1,881 +0,0 @@ -/*********************************************************************** - * Pike language module for SWIG - ***********************************************************************/ - -char cvsroot_pike_cxx[] = "$Header$"; - -#include "swigmod.h" -#ifndef MACSWIG -#include "swigconfig.h" -#endif - -class PIKE : public Language { -private: - - File *f_runtime; - File *f_header; - File *f_wrappers; - File *f_init; - String *PrefixPlusUnderscore; - int current; - - // Wrap modes - enum { - NO_CPP, - MEMBER_FUNC, - CONSTRUCTOR, - DESTRUCTOR, - MEMBER_VAR, - CLASS_CONST, - STATIC_FUNC, - STATIC_VAR - }; - -public: - - /* --------------------------------------------------------------------- - * PIKE() - * - * Initialize member data - * --------------------------------------------------------------------- */ - - PIKE() { - f_runtime = 0; - f_header = 0; - f_wrappers = 0; - f_init = 0; - PrefixPlusUnderscore = 0; - current = NO_CPP; - } - - /* --------------------------------------------------------------------- - * main() - * - * Parse command line options and initializes variables. - * --------------------------------------------------------------------- */ - - virtual void main(int argc, char *argv[]) { - - /* Set location of SWIG library */ - SWIG_library_directory("pike"); - - /* Look for certain command line options */ - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp (argv[i], "-ldflags") == 0) { - printf("%s\n", SWIG_PIKE_RUNTIME); - SWIG_exit(EXIT_SUCCESS); - } - } - } - - /* Add a symbol to the parser for conditional compilation */ - Preprocessor_define("SWIGPIKE 1", 0); - - /* Set language-specific configuration file */ - SWIG_config_file("pike.swg"); - - /* Set typemap language */ - SWIG_typemap_lang("pike"); - - /* Enable overloaded methods support */ - allow_overloading(); - } - - /* --------------------------------------------------------------------- - * top() - * --------------------------------------------------------------------- */ - - virtual int top(Node *n) { - /* Get the module name */ - String *module = Getattr(n, "name"); - - /* Get the output file name */ - String *outfile = Getattr(n, "outfile"); - - /* Open the output file */ - f_runtime = NewFile(outfile, "w"); - if (!f_runtime) { - Printf(stderr, "*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header", f_header); - Swig_register_filebyname("wrapper", f_wrappers); - Swig_register_filebyname("runtime", f_runtime); - Swig_register_filebyname("init", f_init); - - /* Standard stuff for the SWIG runtime section */ - Swig_banner(f_runtime); - if (NoInclude) { - Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); - } - - Printf(f_header, "#define SWIG_init pike_module_init\n"); - Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); - - /* Change naming scheme for constructors and destructors */ - Swig_name_register("construct","%c_create"); - Swig_name_register("destroy","%c_destroy"); - - /* Current wrap type */ - current = NO_CPP; - - /* Emit code for children */ - Language::top(n); - - /* Close the initialization function */ - Printf(f_init, "}\n"); - SwigType_emit_type_table(f_runtime, f_wrappers); - - /* Close all of the files */ - Dump(f_header, f_runtime); - Dump(f_wrappers, f_runtime); - Wrapper_pretty_print(f_init, f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - Delete(f_runtime); - - /* Done */ - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * importDirective() - * ------------------------------------------------------------ */ - - virtual int importDirective(Node *n) { - String *modname = Getattr(n,"module"); - if (modname) { - Printf(f_init,"pike_require(\"%s\");\n", modname); - } - return Language::importDirective(n); - } - - /* ------------------------------------------------------------ - * strip() - * - * For names that begin with the current class prefix plus an - * underscore (e.g. "Foo_enum_test"), return the base function - * name (i.e. "enum_test"). - * ------------------------------------------------------------ */ - - String *strip(const DOHString_or_char *name) { - String *s = Copy(name); - if (Strncmp(name, PrefixPlusUnderscore, Len(PrefixPlusUnderscore)) != 0) { - return s; - } - Replaceall(s, PrefixPlusUnderscore, ""); - return s; - } - - /* ------------------------------------------------------------ - * add_method() - * ------------------------------------------------------------ */ - - void add_method(Node *n, const DOHString_or_char *name, const DOHString_or_char *function, const DOHString_or_char *description) { - String *rename; - if (current != NO_CPP) { - rename = strip(name); - } else { - rename = NewString(name); - } - Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); - Delete(rename); - } - - /* --------------------------------------------------------------------- - * functionWrapper() - * - * Create a function declaration and register it with the interpreter. - * --------------------------------------------------------------------- */ - - virtual int functionWrapper(Node *n) { - - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *d = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - - Parm *p; - String *tm; - int i; - - String *overname = 0; - if (Getattr(n,"sym:overloaded")) { - overname = Getattr(n,"sym:overname"); - } else { - if (!addSymbol(iname,n)) return SWIG_ERROR; - } - - Wrapper *f = NewWrapper(); - - /* Write code to extract function parameters. */ - emit_args(d, l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - - /* Get number of required and total arguments */ - int num_arguments = emit_num_arguments(l); - int varargs = emit_isvarargs(l); - - /* Which input argument to start with? */ - int start = (current == MEMBER_FUNC || current == MEMBER_VAR || current == DESTRUCTOR) ? 1 : 0; - - /* Offset to skip over the attribute name */ - // int offset = (current == MEMBER_VAR) ? 1 : 0; - int offset = 0; - - String *wname = Swig_name_wrapper(iname); - if (overname) { - Append(wname,overname); - } - - Printv(f->def, "static void ", wname, "(INT32 args) {", NIL); - - /* Generate code for argument marshalling */ - String *description = NewString(""); - char source[64]; - for (i = 0, p = l; i < num_arguments; i++) { - - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *ln = Getattr(p,"lname"); - - if (i < start) { - String *lstr = SwigType_lstr(pt,0); - Printf(f->code, "%s = (%s) THIS;\n", ln, lstr); - Delete(lstr); - } else { - /* Look for an input typemap */ - sprintf(source, "sp[%d-args]", i-start+offset); - if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", ln); - Replaceall(tm, "$input", source); - Setattr(p, "emit:input", source); - Printf(f->code, "%s\n", tm); - String *pikedesc = Getattr(p, "tmap:in:pikedesc"); - if (pikedesc) { - Printv(description, pikedesc, " ", NIL); - } - p = Getattr(p,"tmap:in:next"); - continue; - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, - "Unable to use type %s as a function argument.\n",SwigType_str(pt,0)); - break; - } - } - p = nextSibling(p); - } - - /* Check for trailing varargs */ - if (varargs) { - if (p && (tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$input", "varargs"); - Printv(f->code,tm,"\n",NIL); - } - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - String *cleanup = NewString(""); - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - String *outarg = NewString(""); - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$target","resultobj"); - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - /* Emit the function call */ - emit_action(n,f); - - /* Clear the return stack */ - Printf(f->code, "pop_n_elems(args);\n"); - - /* Return the function value */ - if (current == CONSTRUCTOR) { - Printv(f->code, "THIS = (void *) result;\n", NIL); - Printv(description, ", tVoid", NIL); - } else if (current == DESTRUCTOR) { - Printv(description, ", tVoid", NIL); - } else { - Wrapper_add_local(f, "resultobj", "struct object *resultobj"); - Printv(description, ", ", NIL); - if ((tm = Swig_typemap_lookup_new("out",n,"result",0))) { - Replaceall(tm,"$source", "result"); - Replaceall(tm,"$target", "resultobj"); - Replaceall(tm,"$result", "resultobj"); - if (Getattr(n,"feature:new")) { - Replaceall(tm,"$owner","1"); - } else { - Replaceall(tm,"$owner","0"); - } - String *pikedesc = Getattr(n, "tmap:out:pikedesc"); - if (pikedesc) { - Printv(description, pikedesc, NIL); - } - Printf(f->code,"%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, - "Unable to use return type %s in function %s.\n", SwigType_str(d,0), name); - } - } - - /* Output argument output code */ - Printv(f->code,outarg,NIL); - - /* Output cleanup code */ - Printv(f->code,cleanup,NIL); - - /* Look to see if there is any newfree cleanup code */ - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n",tm); - } - } - - /* See if there is any return cleanup code */ - if ((tm = Swig_typemap_lookup_new("ret", n, "result", 0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n",tm); - } - - /* Close the function */ - Printf(f->code, "}\n"); - - /* Substitute the cleanup code */ - Replaceall(f->code,"$cleanup",cleanup); - - /* Substitute the function name */ - Replaceall(f->code,"$symname",iname); - Replaceall(f->code,"$result","resultobj"); - - /* Dump the function out */ - Wrapper_print(f,f_wrappers); - - /* Now register the function with the interpreter. */ - if (!Getattr(n,"sym:overloaded")) { - add_method(n, iname, wname, description); - } else { - Setattr(n,"wrap:name", wname); - if (!Getattr(n,"sym:nextSibling")) { - dispatchFunction(n); - } - } - - Delete(cleanup); - Delete(outarg); - Delete(description); - Delete(wname); - DelWrapper(f); - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * dispatchFunction() - * - * Emit overloading dispatch function - * ------------------------------------------------------------ */ - - void dispatchFunction(Node *n) { - /* Last node in overloaded chain */ - - int maxargs; - String *tmp = NewString(""); - String *dispatch = Swig_overload_dispatch(n,"return %s(self,args);",&maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *f = NewWrapper(); - String *symname = Getattr(n,"sym:name"); - String *wname = Swig_name_wrapper(symname); - - Printv(f->def, - "struct object *", wname, - "(struct object *self, struct object *args) {", - NULL); - - - Wrapper_add_local(f,"argc","INT32 argc"); - Printf(tmp,"struct object *argv[%d]", maxargs+1); - Wrapper_add_local(f,"argv",tmp); - Wrapper_add_local(f,"ii","INT32 ii"); - Printf(f->code,"argc = sizeof(args);\n"); - Printf(f->code,"for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n",maxargs); - Printf(f->code,"argv[ii] = array_index(args,&argv[ii],ii);\n"); - Printf(f->code,"}\n"); - - Replaceall(dispatch,"$args","self,args"); - Printv(f->code,dispatch,"\n",NIL); - Printf(f->code,"No matching function for overloaded '%s'\n", symname); - Printf(f->code,"return NULL;\n"); - Printv(f->code,"}\n",NIL); - Wrapper_print(f,f_wrappers); - add_method(n,symname,wname,0); - - DelWrapper(f); - Delete(dispatch); - Delete(tmp); - Delete(wname); - } - - /* ------------------------------------------------------------ - * variableWrapper() - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - // return Language::variableWrapper(n); - - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - - String *wname; - // static int have_globals = 0; - String *tm; - Wrapper *getf, *setf; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - getf = NewWrapper(); - setf = NewWrapper(); - - wname = Swig_name_wrapper(iname); - - /* Create a function for setting the value of the variable */ - - Printf(setf->def,"static int %s_set(object *_val) {", wname); - if (!Getattr(n,"feature:immutable")) { - if ((tm = Swig_typemap_lookup_new("varin",n,name,0))) { - Replaceall(tm,"$source","_val"); - Replaceall(tm,"$target",name); - Replaceall(tm,"$input","_val"); - Printf(setf->code,"%s\n",tm); - Delete(tm); - } else { - Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, - "Unable to set variable of type %s.\n", SwigType_str(t,0)); - } - Printf(setf->code," return 0;\n"); - } else { - /* Is a readonly variable. Issue an error */ - - Printv(setf->code, - tab4, "Variable $iname is read-only.\n", - tab4, "return 1;\n", - NIL); - - } - - Printf(setf->code,"}\n"); - Wrapper_print(setf,f_wrappers); - - /* Create a function for getting the value of a variable */ - Printf(getf->def,"static object *%s_get() {", wname); - Wrapper_add_local(getf,"pikeobj", "object *pyobj"); - if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { - Replaceall(tm,"$source",name); - Replaceall(tm,"$target","pikeobj"); - Replaceall(tm,"$result","pikeobj"); - Printf(getf->code,"%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, - "Unable to link with type %s\n", SwigType_str(t,0)); - } - - Printf(getf->code," return pikeobj;\n}\n"); - Wrapper_print(getf,f_wrappers); - - /* Now add this to the variable linking mechanism */ - Printf(f_init,"\t SWIG_addvarlink(SWIG_globals,(char*)\"%s\",%s_get, %s_set);\n", iname, wname, wname); - - DelWrapper(setf); - DelWrapper(getf); - return SWIG_OK; - - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - - Swig_require(&n, "*sym:name", "type", "value", NIL); - - String *symname = Getattr(n, "sym:name"); - SwigType *type = Getattr(n, "type"); - String *value = Getattr(n, "value"); - - /* Special hook for member pointer */ - if (SwigType_type(type) == T_MPOINTER) { - String *wname = Swig_name_wrapper(symname); - Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); - value = wname; - } - - /* Perform constant typemap substitution */ - String *tm = Swig_typemap_lookup_new("constant", n, value, 0); - if (tm) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", symname); - Replaceall(tm, "$symname", symname); - Replaceall(tm, "$value", value); - Printf(f_init, "%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, - "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); - } - - Swig_restore(&n); - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * nativeWrapper() - * ------------------------------------------------------------ */ - - virtual int nativeWrapper(Node *n) { - // return Language::nativeWrapper(n); - String *name = Getattr(n,"sym:name"); - String *wrapname = Getattr(n,"wrap:name"); - - if (!addSymbol(wrapname,n)) return SWIG_ERROR; - - add_method(n, name, wrapname,0); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * enumDeclaration() - * ------------------------------------------------------------ */ - - virtual int enumDeclaration(Node *n) { - return Language::enumDeclaration(n); - } - - /* ------------------------------------------------------------ - * enumvalueDeclaration() - * ------------------------------------------------------------ */ - - virtual int enumvalueDeclaration(Node *n) { - return Language::enumvalueDeclaration(n); - } - - /* ------------------------------------------------------------ - * classDeclaration() - * ------------------------------------------------------------ */ - - virtual int classDeclaration(Node *n) { - return Language::classDeclaration(n); - } - - /* ------------------------------------------------------------ - * classHandler() - * ------------------------------------------------------------ */ - - virtual int classHandler(Node *n) { - - String *symname = Getattr(n, "sym:name"); - if (!addSymbol(symname, n)) - return SWIG_ERROR; - - PrefixPlusUnderscore = NewStringf("%s_", getClassPrefix()); - - Printf(f_init, "start_new_program();\n"); - - /* Handle inheritance */ - List *baselist = Getattr(n,"bases"); - if (baselist && Len(baselist) > 0) { - Node *base = Firstitem(baselist); - while (base) { - char *basename = Char(Getattr(base,"name")); - if (SwigType_istemplate(basename)) { - basename = Char(SwigType_namestr(basename)); - } - SwigType *basetype = NewString(basename); - SwigType_add_pointer(basetype); - SwigType_remember(basetype); - String *basemangle = SwigType_manglestr(basetype); - Printf(f_init, "low_inherit((struct program *) SWIGTYPE%s->clientdata, 0, 0, 0, 0, 0);\n", basemangle); - Delete(basemangle); - Delete(basetype); - base = Nextitem(baselist); - } - } else { - Printf(f_init, "ADD_STORAGE(swig_object_wrapper);\n"); - } - - Language::classHandler(n); - - /* Accessors for member variables */ - /* - List *membervariables = Getattr(n,"membervariables"); - if (membervariables && Len(membervariables) > 0) { - membervariableAccessors(membervariables); - } - */ - - /* Done, close the class */ - Printf(f_init, "add_program_constant(\"%s\", pr = end_program(), 0);\n", symname); - - SwigType *tt = NewString(symname); - SwigType_add_pointer(tt); - SwigType_remember(tt); - String *tm = SwigType_manglestr(tt); - Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) pr);\n", tm); - Delete(tm); - Delete(tt); - - Delete(PrefixPlusUnderscore); PrefixPlusUnderscore = 0; - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberfunctionHandler() - * - * Method for adding C++ member function - * ------------------------------------------------------------ */ - - virtual int memberfunctionHandler(Node *n) { - current = MEMBER_FUNC; - Language::memberfunctionHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constructorHandler() - * - * Method for adding C++ member constructor - * ------------------------------------------------------------ */ - - virtual int constructorHandler(Node *n) { - current = CONSTRUCTOR; - Language::constructorHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * destructorHandler() - * ------------------------------------------------------------ */ - - virtual int destructorHandler(Node *n) { - current = DESTRUCTOR; - Language::destructorHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * membervariableAccessors() - * ------------------------------------------------------------ */ - - void membervariableAccessors(List *membervariables) { - String *name; - Node *n; - bool need_setter; - String *funcname; - - /* If at least one of them is mutable, we need a setter */ - need_setter = false; - n = Firstitem(membervariables); - while (n) { - if (!Getattr(n, "feature:immutable")) { - need_setter = true; - break; - } - n = Nextitem(membervariables); - } - - /* Create a function to set the values of the (mutable) variables */ - if (need_setter) { - Wrapper *wrapper = NewWrapper(); - String *setter = Swig_name_member(getClassPrefix(), (char *) "`->="); - String *wname = Swig_name_wrapper(setter); - Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); - Printf(wrapper->locals, "char *name = (char *) STR0(sp[0-args].u.string);\n"); - - n = Firstitem(membervariables); - while (n) { - if (!Getattr(n, "feature:immutable")) { - name = Getattr(n, "name"); - funcname = Swig_name_wrapper(Swig_name_set(Swig_name_member(getClassPrefix(), name))); - Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); - Printf(wrapper->code, "%s(args);\n", funcname); - Printf(wrapper->code, "return;\n"); - Printf(wrapper->code, "}\n"); - Delete(funcname); - } - n = Nextitem(membervariables); - } - - /* Close the function */ - Printf(wrapper->code, "pop_n_elems(args);\n"); - Printf(wrapper->code, "}\n"); - - /* Dump wrapper code to the output file */ - Wrapper_print(wrapper, f_wrappers); - - /* Register it with Pike */ - String *description = NewString("tStr tFloat, tVoid"); - add_method(Firstitem(membervariables), "`->=", wname, description); - Delete(description); - - /* Clean up */ - Delete(wname); - Delete(setter); - DelWrapper(wrapper); - } - - /* Create a function to get the values of the (mutable) variables */ - Wrapper *wrapper = NewWrapper(); - String *getter = Swig_name_member(getClassPrefix(), (char *) "`->"); - String *wname = Swig_name_wrapper(getter); - Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); - Printf(wrapper->locals, "char *name = (char *) STR0(sp[0-args].u.string);\n"); - - n = Firstitem(membervariables); - while (n) { - name = Getattr(n, "name"); - funcname = Swig_name_wrapper(Swig_name_get(Swig_name_member(getClassPrefix(), name))); - Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); - Printf(wrapper->code, "%s(args);\n", funcname); - Printf(wrapper->code, "return;\n"); - Printf(wrapper->code, "}\n"); - Delete(funcname); - n = Nextitem(membervariables); - } - - /* Close the function */ - Printf(wrapper->code, "pop_n_elems(args);\n"); - Printf(wrapper->code, "}\n"); - - /* Dump wrapper code to the output file */ - Wrapper_print(wrapper, f_wrappers); - - /* Register it with Pike */ - String *description = NewString("tStr, tMix"); - add_method(Firstitem(membervariables), "`->", wname, description); - Delete(description); - - /* Clean up */ - Delete(wname); - Delete(getter); - DelWrapper(wrapper); - } - - /* ------------------------------------------------------------ - * membervariableHandler() - * ------------------------------------------------------------ */ - - virtual int membervariableHandler(Node *n) { - List *membervariables = Getattr(getCurrentClass(),"membervariables"); - if (!membervariables) { - membervariables = NewList(); - Setattr(getCurrentClass(),"membervariables",membervariables); - } - Append(membervariables,n); - current = MEMBER_VAR; - Language::membervariableHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ----------------------------------------------------------------------- - * staticmemberfunctionHandler() - * - * Wrap a static C++ function - * ---------------------------------------------------------------------- */ - - virtual int staticmemberfunctionHandler(Node *n) { - current = STATIC_FUNC; - Language::staticmemberfunctionHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberconstantHandler() - * - * Create a C++ constant - * ------------------------------------------------------------ */ - - virtual int memberconstantHandler(Node *n) { - current = CLASS_CONST; - constantWrapper(n); - current = NO_CPP; - return SWIG_OK; - } - - /* --------------------------------------------------------------------- - * staticmembervariableHandler() - * --------------------------------------------------------------------- */ - - virtual int staticmembervariableHandler(Node *n) { - current = STATIC_VAR; - Language::staticmembervariableHandler(n); - current = NO_CPP; - return SWIG_OK; - } -}; - -/* ----------------------------------------------------------------------------- - * swig_pike() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language * -swig_pike(void) { - return new PIKE(); -} - - - - - diff --git a/Source/Modules1.1/python.cxx b/Source/Modules1.1/python.cxx deleted file mode 100644 index 6651ace92..000000000 --- a/Source/Modules1.1/python.cxx +++ /dev/null @@ -1,1268 +0,0 @@ -/* ----------------------------------------------------------------------------- - * python.cxx - * - * Python module. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1999-2000. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_python_cxx[] = "$Header$"; - -#include "swigmod.h" - -#ifndef MACSWIG -#include "swigconfig.h" -#endif - -#include - -#define PYSHADOW_MEMBER 0x2 - -static String *const_code = 0; -static String *shadow_methods = 0; -static String *module = 0; -static String *mainmodule = 0; -static String *interface = 0; -static String *global_name = 0; -static int shadow = 1; -static int use_kw = 0; - -static File *f_runtime = 0; -static File *f_header = 0; -static File *f_wrappers = 0; -static File *f_init = 0; -static File *f_shadow = 0; -static File *f_shadow_stubs = 0; - -static String *methods; -static String *class_name; -static String *shadow_indent = 0; -static int in_class = 0; -static int classic = 0; - -/* C++ Support + Shadow Classes */ - -static int have_constructor; -static int have_repr; -static String *real_classname; - -static const char *usage = (char *)"\ -Python Options (available with -python)\n\ - -ldflags - Print runtime libraries to link with\n\ - -globals name - Set name used to access C global variable ('cvar' by default).\n\ - -interface name - Set the lib name\n\ - -keyword - Use keyword arguments\n\ - -classic - Use classic classes only\n\ - -noexcept - No automatic exception handling.\n\ - -noproxy - Don't generate proxy classes. \n\n"; - -class PYTHON : public Language { -public: - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main(int argc, char *argv[]) { - - SWIG_library_directory("python"); - - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if(strcmp(argv[i],"-interface") == 0) { - if (argv[i+1]) { - interface = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - /* end added */ - } else if (strcmp(argv[i],"-globals") == 0) { - if (argv[i+1]) { - global_name = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if ((strcmp(argv[i],"-shadow") == 0) || ((strcmp(argv[i],"-proxy") == 0))) { - shadow = 1; - Swig_mark_arg(i); - } else if ((strcmp(argv[i],"-noproxy") == 0)) { - shadow = 0; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-keyword") == 0) { - use_kw = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-classic") == 0) { - classic = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-help") == 0) { - fputs(usage,stderr); - } else if (strcmp (argv[i], "-ldflags") == 0) { - printf("%s\n", SWIG_PYTHON_RUNTIME); - SWIG_exit (EXIT_SUCCESS); - } - } - } - if (!global_name) global_name = NewString("cvar"); - Preprocessor_define("SWIGPYTHON 1", 0); - SWIG_typemap_lang("python"); - SWIG_config_file("python.swg"); - allow_overloading(); - } - - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("init",f_init); - - const_code = NewString(""); - shadow_methods = NewString(""); - methods = NewString(""); - - Swig_banner(f_runtime); - - Printf(f_runtime,"#define SWIGPYTHON\n"); - if (NoInclude) - Printf(f_runtime,"#define SWIG_NOINCLUDE\n"); - - /* Set module name */ - module = Copy(Getattr(n,"name")); - mainmodule = Getattr(n,"name"); - - char filen[256]; - - /* If shadow classing is enabled, we're going to change the module name to "_module" */ - if (shadow) { - sprintf(filen,"%s%s.py", Swig_file_dirname(outfile), Char(module)); - // If we don't have an interface then change the module name X to _X - if (interface) module = interface; - else Insert(module,0,"_"); - if ((f_shadow = NewFile(filen,"w")) == 0) { - Printf(stderr,"Unable to open %s\n", filen); - SWIG_exit (EXIT_FAILURE); - } - f_shadow_stubs = NewString(""); - - Swig_register_filebyname("shadow",f_shadow); - Swig_register_filebyname("python",f_shadow); - - Printv(f_shadow, - "# This file was created automatically by SWIG.\n", - "# Don't modify this file, modify the SWIG interface instead.\n", - "# This file is compatible with both classic and new-style classes.\n", - NIL); - - Printf(f_shadow,"import %s\n", module); - - // Python-2.2 object hack - - - Printv(f_shadow, - "def _swig_setattr(self,class_type,name,value):\n", - tab4, "if (name == \"this\"):\n", - tab4, tab4, "if isinstance(value, class_type):\n", - tab4, tab8, "self.__dict__[name] = value.this\n", - tab4, tab8, "if hasattr(value,\"thisown\"): self.__dict__[\"thisown\"] = value.thisown\n", - tab4, tab8, "del value.thisown\n", - tab4, tab8, "return\n", - // tab8, "if (name == \"this\") or (name == \"thisown\"): self.__dict__[name] = value; return\n", - tab4, "method = class_type.__swig_setmethods__.get(name,None)\n", - tab4, "if method: return method(self,value)\n", - tab4, "self.__dict__[name] = value\n\n", - NIL); - - Printv(f_shadow, - "def _swig_getattr(self,class_type,name):\n", - tab4, "method = class_type.__swig_getmethods__.get(name,None)\n", - tab4, "if method: return method(self)\n", - tab4, "raise AttributeError,name\n\n", - NIL); - - if (!classic) { - Printv(f_shadow, - "import types\n", - "try:\n", - " _object = types.ObjectType\n", - " _newclass = 1\n", - "except AttributeError:\n", - " class _object : pass\n", - " _newclass = 0\n", - "\n\n", - NIL); - } - - // Include some information in the code - Printf(f_header,"\n/*-----------------------------------------------\n @(target):= %s.so\n\ - ------------------------------------------------*/\n", module); - - } - - Printf(f_header,"#define SWIG_init init%s\n\n", module); - Printf(f_header,"#define SWIG_name \"%s\"\n", module); - - Printf(f_wrappers,"#ifdef __cplusplus\n"); - Printf(f_wrappers,"extern \"C\" {\n"); - Printf(f_wrappers,"#endif\n"); - Printf(const_code,"static swig_const_info swig_const_table[] = {\n"); - Printf(methods,"static PyMethodDef SwigMethods[] = {\n"); - - /* emit code */ - Language::top(n); - - /* Close language module */ - Printf(methods,"\t { NULL, NULL }\n"); - Printf(methods,"};\n"); - Printf(f_wrappers,"%s\n",methods); - - SwigType_emit_type_table(f_runtime,f_wrappers); - - Printf(const_code, "{0}};\n"); - Printf(f_wrappers,"%s\n",const_code); - Printf(f_init,"}\n"); - - Printf(f_wrappers,"#ifdef __cplusplus\n"); - Printf(f_wrappers,"}\n"); - Printf(f_wrappers,"#endif\n"); - - if (shadow) { - Printv(f_shadow, f_shadow_stubs, "\n",NIL); - Close(f_shadow); - Delete(f_shadow); - } - - /* Close all of the files */ - Dump(f_header,f_runtime); - Dump(f_wrappers,f_runtime); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * importDirective() - * ------------------------------------------------------------ */ - - virtual int importDirective(Node *n) { - if (shadow) { - String *modname = Getattr(n,"module"); - if (modname) { - Printf(f_shadow,"import %s\n", modname); - } - } - return Language::importDirective(n); - } - - /* ------------------------------------------------------------ - * add_method() - * ------------------------------------------------------------ */ - - void add_method(String *name, String *function, int kw) { - if (!kw) - Printf(methods,"\t { (char *)\"%s\", %s, METH_VARARGS },\n", name, function); - else - Printf(methods,"\t { (char *)\"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS },\n", name, function); - } - - /* ------------------------------------------------------------ - * functionWrapper() - * ------------------------------------------------------------ */ - - virtual int functionWrapper(Node *n) { - - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *d = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - - Parm *p; - int i; - char wname[256]; - char source[64]; - Wrapper *f; - String *parse_args; - String *arglist; - String *get_pointers; - String *cleanup; - String *outarg; - String *kwargs; - String *tm; - String *overname = 0; - - int num_required; - int num_arguments; - int varargs = 0; - int allow_kwargs = (use_kw || Getattr(n,"feature:kwargs")) ? 1 : 0; - - if (Getattr(n,"sym:overloaded")) { - overname = Getattr(n,"sym:overname"); - } else { - if (!addSymbol(iname,n)) return SWIG_ERROR; - } - - f = NewWrapper(); - parse_args = NewString(""); - arglist = NewString(""); - get_pointers = NewString(""); - cleanup = NewString(""); - outarg = NewString(""); - kwargs = NewString(""); - - Wrapper_add_local(f,"resultobj", "PyObject *resultobj"); - - /* Write code to extract function parameters. */ - emit_args(d, l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - /* Get number of required and total arguments */ - num_arguments = emit_num_arguments(l); - num_required = emit_num_required(l); - varargs = emit_isvarargs(l); - - strcpy(wname,Char(Swig_name_wrapper(iname))); - if (overname) { - strcat(wname,Char(overname)); - } - - if (!allow_kwargs || Getattr(n,"sym:overloaded")) { - if (!varargs) { - Printv(f->def, - "static PyObject *", wname, - "(PyObject *self, PyObject *args) {", - NIL); - } else { - Printv(f->def, - "static PyObject *", wname, "__varargs__", - "(PyObject *self, PyObject *args, PyObject *varargs) {", - NIL); - } - if (allow_kwargs) { - Swig_warning(WARN_LANG_OVERLOAD_KEYWORD, input_file, line_number, - "Can't use keyword arguments with overloaded functions.\n"); - allow_kwargs = 0; - } - } else { - if (varargs) { - Swig_warning(WARN_LANG_VARARGS_KEYWORD, input_file, line_number, - "Can't wrap varargs with keyword arguments enabled\n"); - varargs = 0; - } - Printv(f->def, - "static PyObject *", wname, - "(PyObject *self, PyObject *args, PyObject *kwargs) {", - NIL); - } - if (!allow_kwargs) { - Printf(parse_args," if(!PyArg_ParseTuple(args,(char *)\""); - } else { - Printf(parse_args," if(!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)\""); - Printf(arglist,",kwnames"); - } - - /* Generate code for argument marshalling */ - - Printf(kwargs,"{ "); - for (i = 0, p=l; i < num_arguments; i++) { - - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *pn = Getattr(p,"name"); - String *ln = Getattr(p,"lname"); - - sprintf(source,"obj%d",i); - - Putc(',',arglist); - if (i == num_required) Putc('|', parse_args); /* Optional argument separator */ - - /* Keyword argument handling */ - if (Len(pn)) { - Printf(kwargs,"\"%s\",", pn); - } else { - Printf(kwargs,"\"arg%d\",", i+1); - } - - /* Look for an input typemap */ - if ((tm = Getattr(p,"tmap:in"))) { - String *parse = Getattr(p,"tmap:in:parse"); - if (!parse) { - Replaceall(tm,"$source",source); - Replaceall(tm,"$target",ln); - Replaceall(tm,"$input", source); - Setattr(p,"emit:input", source); /* Save the location of the object */ - - if (Getattr(p,"wrap:disown") || (Getattr(p,"tmap:in:disown"))) { - Replaceall(tm,"$disown","SWIG_POINTER_DISOWN"); - } else { - Replaceall(tm,"$disown","0"); - } - - Putc('O',parse_args); - Wrapper_add_localv(f, source, "PyObject *",source, " = 0", NIL); - Printf(arglist,"&%s",source); - if (i >= num_required) - Printv(get_pointers, "if (", source, ") {\n", NIL); - Printv(get_pointers,tm,"\n", NIL); - if (i >= num_required) - Printv(get_pointers, "}\n", NIL); - - } else { - Printf(parse_args,"%s",parse); - Printf(arglist,"&%s", ln); - } - p = Getattr(p,"tmap:in:next"); - continue; - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, - "Unable to use type %s as a function argument.\n",SwigType_str(pt,0)); - break; - } - p = nextSibling(p); - } - - /* finish argument marshalling */ - Printf(kwargs," NULL }"); - if (allow_kwargs) { - Printv(f->locals,tab4, "char *kwnames[] = ", kwargs, ";\n", NIL); - } - - Printf(parse_args,":%s\"", iname); - Printv(parse_args, - arglist, ")) goto fail;\n", - NIL); - - /* Now piece together the first part of the wrapper function */ - Printv(f->code, parse_args, get_pointers, NIL); - - /* Check for trailing varargs */ - if (varargs) { - if (p && (tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$input", "varargs"); - Printv(f->code,tm,"\n",NIL); - } - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$target","resultobj"); - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - /* Emit the function call */ - emit_action(n,f); - - /* This part below still needs cleanup */ - - /* Return the function value */ - if ((tm = Swig_typemap_lookup_new("out",n,"result",0))) { - Replaceall(tm,"$source", "result"); - Replaceall(tm,"$target", "resultobj"); - Replaceall(tm,"$result", "resultobj"); - if (Getattr(n,"feature:new")) { - Replaceall(tm,"$owner","1"); - } else { - Replaceall(tm,"$owner","0"); - } - Printf(f->code,"%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, - "Unable to use return type %s in function %s.\n", SwigType_str(d,0), name); - } - - /* Output argument output code */ - Printv(f->code,outarg,NIL); - - /* Output cleanup code */ - Printv(f->code,cleanup,NIL); - - /* Look to see if there is any newfree cleanup code */ - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n",tm); - } - } - - /* See if there is any return cleanup code */ - if ((tm = Swig_typemap_lookup_new("ret", n, "result", 0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n",tm); - } - - Printf(f->code," return resultobj;\n"); - - /* Error handling code */ - - Printf(f->code,"fail:\n"); - Printv(f->code,cleanup,NIL); - Printf(f->code,"return NULL;\n"); - Printf(f->code,"}\n"); - - /* Substitute the cleanup code */ - Replaceall(f->code,"$cleanup",cleanup); - - /* Substitute the function name */ - Replaceall(f->code,"$symname",iname); - Replaceall(f->code,"$result","resultobj"); - - /* Dump the function out */ - Wrapper_print(f,f_wrappers); - - /* If varargs. Need to emit a varargs stub */ - if (varargs) { - DelWrapper(f); - f = NewWrapper(); - Printv(f->def, - "static PyObject *", wname, - "(PyObject *self, PyObject *args) {", - NIL); - Wrapper_add_local(f,"resultobj", "PyObject *resultobj"); - Wrapper_add_local(f,"varargs", "PyObject *varargs"); - Wrapper_add_local(f,"newargs", "PyObject *newargs"); - Printf(f->code,"newargs = PyTuple_GetSlice(args,0,%d);\n", num_arguments); - Printf(f->code,"varargs = PyTuple_GetSlice(args,%d,PyTuple_Size(args)+1);\n", num_arguments); - Printf(f->code,"resultobj = %s__varargs__(self,newargs,varargs);\n", wname); - Printf(f->code,"Py_XDECREF(newargs);\n"); - Printf(f->code,"Py_XDECREF(varargs);\n"); - Printf(f->code,"return resultobj;\n"); - Printf(f->code,"}\n"); - Wrapper_print(f,f_wrappers); - } - - Setattr(n,"wrap:name", wname); - - /* Now register the function with the interpreter. */ - if (!Getattr(n,"sym:overloaded")) { - add_method(iname, wname, allow_kwargs); - - /* Create a shadow for this function (if enabled and not in a member function) */ - if ((shadow) && (!(shadow & PYSHADOW_MEMBER))) { - if (in_class) { - Printv(f_shadow_stubs,iname, " = ", module, ".", iname, "\n\n", NIL); - } else { - Printv(f_shadow,iname, " = ", module, ".", iname, "\n\n", NIL); - } - } - } else { - if (!Getattr(n,"sym:nextSibling")) { - dispatchFunction(n); - } - } - Delete(parse_args); - Delete(arglist); - Delete(get_pointers); - Delete(cleanup); - Delete(outarg); - Delete(kwargs); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * dispatchFunction() - * ------------------------------------------------------------ */ - void dispatchFunction(Node *n) { - /* Last node in overloaded chain */ - - int maxargs; - String *tmp = NewString(""); - String *dispatch = Swig_overload_dispatch(n,"return %s(self,args);",&maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *f = NewWrapper(); - String *symname = Getattr(n,"sym:name"); - String *wname = Swig_name_wrapper(symname); - - Printv(f->def, - "static PyObject *", wname, - "(PyObject *self, PyObject *args) {", - NIL); - - Wrapper_add_local(f,"argc","int argc"); - Printf(tmp,"PyObject *argv[%d]", maxargs+1); - Wrapper_add_local(f,"argv",tmp); - Wrapper_add_local(f,"ii","int ii"); - Printf(f->code,"argc = PyObject_Length(args);\n"); - Printf(f->code,"for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n",maxargs); - Printf(f->code,"argv[ii] = PyTuple_GetItem(args,ii);\n"); - Printf(f->code,"}\n"); - - Replaceall(dispatch,"$args","self,args"); - Printv(f->code,dispatch,"\n",NIL); - Printf(f->code,"PyErr_SetString(PyExc_TypeError,\"No matching function for overloaded '%s'\");\n", symname); - Printf(f->code,"return NULL;\n"); - Printv(f->code,"}\n",NIL); - Wrapper_print(f,f_wrappers); - add_method(symname,wname,0); - - /* Create a shadow for this function (if enabled and not in a member function) */ - if ((shadow) && (!(shadow & PYSHADOW_MEMBER))) { - Printv(f_shadow_stubs,symname, " = ", module, ".", symname, "\n\n", NIL); - } - DelWrapper(f); - Delete(dispatch); - Delete(tmp); - Delete(wname); - } - - /* ------------------------------------------------------------ - * variableWrapper() - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - - String *wname; - static int have_globals = 0; - String *tm; - Wrapper *getf, *setf; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - getf = NewWrapper(); - setf = NewWrapper(); - - /* If this is our first call, add the globals variable to the - Python dictionary. */ - - if (!have_globals) { - Printf(f_init,"\t PyDict_SetItemString(d,(char*)\"%s\", SWIG_globals);\n",global_name); - have_globals=1; - if ((shadow) && (!(shadow & PYSHADOW_MEMBER))) { - Printf(f_shadow_stubs,"%s = %s.%s\n", global_name, module, global_name); - } - } - - if ((shadow) && (SwigType_isconst(t))) { - if (!in_class) { - Printf(f_shadow_stubs,"%s = %s.%s\n", iname, global_name, iname); - } - } - - wname = Swig_name_wrapper(iname); - - /* Create a function for setting the value of the variable */ - - Printf(setf->def,"static int %s_set(PyObject *_val) {", wname); - if (!Getattr(n,"feature:immutable")) { - if ((tm = Swig_typemap_lookup_new("varin",n,name,0))) { - Replaceall(tm,"$source","_val"); - Replaceall(tm,"$target",name); - Replaceall(tm,"$input","_val"); - Printf(setf->code,"%s\n",tm); - Delete(tm); - } else { - Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, - "Unable to set variable of type %s.\n", SwigType_str(t,0)); - } - Printf(setf->code," return 0;\n"); - } else { - /* Is a readonly variable. Issue an error */ - Printv(setf->code, - tab4, "PyErr_SetString(PyExc_TypeError,\"Variable ", iname, - " is read-only.\");\n", - tab4, "return 1;\n", - NIL); - } - - Printf(setf->code,"}\n"); - Wrapper_print(setf,f_wrappers); - - /* Create a function for getting the value of a variable */ - Printf(getf->def,"static PyObject *%s_get() {", wname); - Wrapper_add_local(getf,"pyobj", "PyObject *pyobj"); - if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { - Replaceall(tm,"$source",name); - Replaceall(tm,"$target","pyobj"); - Replaceall(tm,"$result","pyobj"); - Printf(getf->code,"%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, - "Unable to link with type %s\n", SwigType_str(t,0)); - } - - Printf(getf->code," return pyobj;\n}\n"); - Wrapper_print(getf,f_wrappers); - - /* Now add this to the variable linking mechanism */ - Printf(f_init,"\t SWIG_addvarlink(SWIG_globals,(char*)\"%s\",%s_get, %s_set);\n", iname, wname, wname); - - DelWrapper(setf); - DelWrapper(getf); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - String *tm; - int have_tm = 0; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - /* Special hook for member pointer */ - if (SwigType_type(type) == T_MPOINTER) { - String *wname = Swig_name_wrapper(iname); - Printf(f_header, "static %s = %s;\n", SwigType_str(type,wname), value); - value = wname; - } - if ((tm = Swig_typemap_lookup_new("consttab",n,name,0))) { - Replaceall(tm,"$source",value); - Replaceall(tm,"$target",name); - Replaceall(tm,"$value", value); - Printf(const_code,"%s,\n", tm); - have_tm = 1; - } - if ((tm = Swig_typemap_lookup_new("constcode", n, name, 0))) { - Replaceall(tm,"$source",value); - Replaceall(tm,"$target",name); - Replaceall(tm,"$value",value); - Printf(f_init, "%s\n", tm); - have_tm = 1; - } - if (!have_tm) { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, - "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } - if ((shadow) && (!(shadow & PYSHADOW_MEMBER))) { - if (!in_class) { - Printv(f_shadow,iname, " = ", module, ".", iname, "\n", NIL); - } else { - Printv(f_shadow_stubs,iname, " = ", module, ".", iname, "\n", NIL); - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * nativeWrapper() - * ------------------------------------------------------------ */ - - virtual int nativeWrapper(Node *n) { - String *name = Getattr(n,"sym:name"); - String *wrapname = Getattr(n,"wrap:name"); - - if (!addSymbol(wrapname,n)) return SWIG_ERROR; - - add_method(name, wrapname,0); - if (shadow) { - Printv(f_shadow_stubs, name, " = ", module, ".", name, "\n\n", NIL); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * classDeclaration() - * ------------------------------------------------------------ */ - - virtual int classDeclaration(Node *n) { - String *importname; - Node *mod; - if (shadow) { - mod = Getattr(n,"module"); - if (mod) { - String *modname = Getattr(mod,"name"); - if (Strcmp(modname,mainmodule) != 0) { - importname = NewStringf("%s.%s", modname, Getattr(n,"sym:name")); - } else { - importname = NewString(Getattr(n,"sym:name")); - } - Setattr(n,"python:proxy",importname); - } - } - return Language::classDeclaration(n); - } - - /* ------------------------------------------------------------ - * classHandler() - * ------------------------------------------------------------ */ - - virtual int classHandler(Node *n) { - int oldclassic = classic; - - if (shadow) { - - /* Create new strings for building up a wrapper function */ - have_constructor = 0; - have_repr = 0; - - if (Getattr(n,"cplus:exceptionclass")) { - classic = 1; - } - if (Getattr(n,"feature:classic")) classic = 1; - - shadow_indent = (String *) tab4; - - class_name = Getattr(n,"sym:name"); - real_classname = Getattr(n,"name"); - - if (!addSymbol(class_name,n)) return SWIG_ERROR; - - /* Handle inheritance */ - String *base_class = NewString(""); - List *baselist = Getattr(n,"bases"); - if (baselist && Len(baselist)) { - Node *base = Firstitem(baselist); - while (base) { - String *bname = Getattr(base, "python:proxy"); - if (!bname) { - base = Nextitem(baselist); - continue; - } - Printv(base_class,bname,NIL); - base = Nextitem(baselist); - if (base) { - Putc(',',base_class); - } - } - } - Printv(f_shadow,"class ", class_name, NIL); - - if (Len(base_class)) { - Printf(f_shadow,"(%s)", base_class); - } else { - if (!classic) { - Printf(f_shadow,"(_object)"); - } - } - Printf(f_shadow,":\n"); - - Printv(f_shadow,tab4,"__swig_setmethods__ = {}\n",NIL); - if (Len(base_class)) { - Printf(f_shadow,"%sfor _s in [%s]: __swig_setmethods__.update(_s.__swig_setmethods__)\n",tab4,base_class); - } - - Printv(f_shadow, - tab4, "__setattr__ = lambda self, name, value: _swig_setattr(self, ", class_name, ", name, value)\n", - NIL); - - Printv(f_shadow,tab4,"__swig_getmethods__ = {}\n",NIL); - if (Len(base_class)) { - Printf(f_shadow,"%sfor _s in [%s]: __swig_getmethods__.update(_s.__swig_getmethods__)\n",tab4,base_class); - } - - Printv(f_shadow, - tab4, "__getattr__ = lambda self, name: _swig_getattr(self, ", class_name, ", name)\n", - NIL); - } - - /* Emit all of the members */ - - in_class = 1; - Language::classHandler(n); - in_class = 0; - - /* Complete the class */ - if (shadow) { - /* Generate a class registration function */ - { - SwigType *ct = NewStringf("p.%s", real_classname); - SwigType_remember(ct); - Printv(f_wrappers, - "static PyObject * ", class_name, "_swigregister(PyObject *self, PyObject *args) {\n", - tab4, "PyObject *obj;\n", - tab4, "if (!PyArg_ParseTuple(args,(char*)\"O\", &obj)) return NULL;\n", - tab4, "SWIG_TypeClientData(SWIGTYPE", SwigType_manglestr(ct),", obj);\n", - tab4, "Py_INCREF(obj);\n", - tab4, "return Py_BuildValue((char *)\"\");\n", - "}\n",NIL); - String *cname = NewStringf("%s_swigregister", class_name); - add_method(cname, cname, 0); - Delete(cname); - Delete(ct); - } - if (!have_constructor) { - Printv(f_shadow,tab4,"def __init__(self): raise RuntimeError, \"No constructor defined\"\n",NIL); - } - - if (!have_repr) { - /* Supply a repr method for this class */ - Printv(f_shadow, - tab4, "def __repr__(self):\n", - tab8, "return \"\" % (self.this,)\n", - NIL); - } - /* Now build the real class with a normal constructor */ - Printv(f_shadow, - "\nclass ", class_name, "Ptr(", class_name, "):\n", - tab4, "def __init__(self,this):\n", - tab8, "self.this = this\n", - tab8, "if not hasattr(self,\"thisown\"): self.thisown = 0\n", - // tab8,"try: self.this = this.this; self.thisown = getattr(this,'thisown',0); this.thisown=0\n", - // tab8,"except AttributeError: self.this = this\n" - tab8, "self.__class__ = ", class_name, "\n", - NIL); - - Printf(f_shadow,"%s.%s_swigregister(%sPtr)\n", module, class_name, class_name,0); - shadow_indent = 0; - Printf(f_shadow,"%s\n", f_shadow_stubs); - Clear(f_shadow_stubs); - } - classic = oldclassic; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberfunctionHandler() - * ------------------------------------------------------------ */ - - virtual int memberfunctionHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - int oldshadow; - - /* Create the default member function */ - oldshadow = shadow; /* Disable shadowing when wrapping member functions */ - if (shadow) shadow = shadow | PYSHADOW_MEMBER; - Language::memberfunctionHandler(n); - shadow = oldshadow; - - if (!Getattr(n,"sym:nextSibling")) { - if (shadow) { - int allow_kwargs = (use_kw || Getattr(n,"feature:kwargs")) ? 1 : 0; - if (Strcmp(symname,"__repr__") == 0) - have_repr = 1; - - if (Getattr(n,"feature:shadow")) { - String *pycode = pythoncode(Getattr(n,"feature:shadow"),tab4); - Printv(f_shadow,pycode,"\n",NIL); - } else { - if (allow_kwargs && !Getattr(n,"sym:overloaded")) { - Printv(f_shadow,tab4, "def ", symname, "(*args, **kwargs): ", NIL); - Printv(f_shadow, "return apply(", module, ".", Swig_name_member(class_name,symname), ",args, kwargs)\n", NIL); - } else { - Printv(f_shadow, tab4, "def ", symname, "(*args): ", NIL); - Printv(f_shadow, "return apply(", module, ".", Swig_name_member(class_name,symname), ",args)\n",NIL); - } - } - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * staticmemberfunctionHandler() - * ------------------------------------------------------------ */ - - virtual int staticmemberfunctionHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - Language::staticmemberfunctionHandler(n); - if (shadow) { - Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = lambda x: ", module, ".", Swig_name_member(class_name, symname), "\n", NIL); - if (!classic) { - Printv(f_shadow, tab4, "if _newclass:", symname, " = staticmethod(", module, ".", - Swig_name_member(class_name, symname), ")\n", NIL); - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constructorDeclaration() - * ------------------------------------------------------------ */ - - virtual int constructorHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - int oldshadow = shadow; - - if (shadow) shadow = shadow | PYSHADOW_MEMBER; - Language::constructorHandler(n); - shadow = oldshadow; - - if (!Getattr(n,"sym:nextSibling")) { - if (shadow) { - int allow_kwargs = (use_kw || Getattr(n,"feature:kwargs")) ? 1 : 0; - if (!have_constructor) { - if (Getattr(n,"feature:shadow")) { - String *pycode = pythoncode(Getattr(n,"feature:shadow"),tab4); - Printv(f_shadow,pycode,"\n",NIL); - } else { - if ((allow_kwargs) && (!Getattr(n,"sym:overloaded"))) { - Printv(f_shadow, tab4, "def __init__(self,*args,**kwargs):\n", NIL); - Printv(f_shadow, tab8, "self.this = apply(", module, ".", Swig_name_construct(symname), ",args,kwargs)\n", NIL); - } else { - Printv(f_shadow, tab4, "def __init__(self,*args):\n",NIL); - Printv(f_shadow, tab8, "self.this = apply(", module, ".", Swig_name_construct(symname), ",args)\n", NIL); - } - Printv(f_shadow, - tab8, "self.thisown = 1\n", - NIL); - } - have_constructor = 1; - } else { - /* Hmmm. We seem to be creating a different constructor. We're just going to create a - function for it. */ - - if (Getattr(n,"feature:shadow")) { - String *pycode = pythoncode(Getattr(n,"feature:shadow"),""); - Printv(f_shadow_stubs,pycode,"\n",NIL); - } else { - if ((allow_kwargs) && (!Getattr(n,"sym:overloaded"))) - Printv(f_shadow_stubs, "def ", symname, "(*args,**kwargs):\n", NIL); - else - Printv(f_shadow_stubs, "def ", symname, "(*args):\n", NIL); - - Printv(f_shadow_stubs, tab4, "val = apply(", NIL); - if ((allow_kwargs) && (!Getattr(n,"sym:overloaded"))) - Printv(f_shadow_stubs, module, ".", Swig_name_construct(symname), ",args,kwargs)\n", NIL); - else - Printv(f_shadow_stubs, module, ".", Swig_name_construct(symname), ",args)\n", NIL); - Printv(f_shadow_stubs,tab4, "val.thisown = 1\n", - tab4, "return val\n\n", NIL); - } - } - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * destructorHandler() - * ------------------------------------------------------------ */ - - virtual int destructorHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - int oldshadow = shadow; - - if (shadow) shadow = shadow | PYSHADOW_MEMBER; - Language::destructorHandler(n); - shadow = oldshadow; - if (shadow) { - Printv(f_shadow, tab4, "def __del__(self, destroy= ", module, ".", Swig_name_destroy(symname), "):\n", NIL); - Printv(f_shadow, tab8, "try:\n", NIL); - Printv(f_shadow, tab4, tab8, "if self.thisown: destroy(self)\n", NIL); - Printv(f_shadow, tab8, "except: pass\n", NIL); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * membervariableHandler() - * ------------------------------------------------------------ */ - - virtual int membervariableHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - - int oldshadow = shadow; - if (shadow) shadow = shadow | PYSHADOW_MEMBER; - Language::membervariableHandler(n); - shadow = oldshadow; - - if (shadow) { - int immutable = 0; - if (!Getattr(n,"feature:immutable")) { - Printv(f_shadow, tab4, "__swig_setmethods__[\"", symname, "\"] = ", module, ".", Swig_name_set(Swig_name_member(class_name,symname)), "\n", NIL); - } else { - immutable = 1; - } - Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = ", module, ".", Swig_name_get(Swig_name_member(class_name,symname)),"\n", NIL); - - if (!classic) { - if (immutable) { - Printv(f_shadow,tab4,"if _newclass:", symname," = property(", module, ".", - Swig_name_get(Swig_name_member(class_name,symname)),")\n", NIL); - } else { - Printv(f_shadow,tab4,"if _newclass:", symname," = property(", - module, ".", Swig_name_get(Swig_name_member(class_name,symname)),",", - module, ".", Swig_name_set(Swig_name_member(class_name,symname)),")\n", NIL); - } - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * staticmembervariableHandler() - * ------------------------------------------------------------ */ - - virtual int staticmembervariableHandler(Node *n) { - String *symname; - SwigType *t; - - Language::staticmembervariableHandler(n); - if (shadow) { - t = Getattr(n,"type"); - symname = Getattr(n,"sym:name"); - if (SwigType_isconst(t) && !Getattr(n, "value")) { - Printf(f_shadow,"%s%s = %s.%s.%s\n", tab4, symname, module, global_name, Swig_name_member(class_name,symname)); - } - } - return SWIG_OK; - - } - - /* ------------------------------------------------------------ - * memberconstantHandler() - * ------------------------------------------------------------ */ - - virtual int memberconstantHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - int oldshadow = shadow; - if (shadow) shadow = shadow | PYSHADOW_MEMBER; - Language::memberconstantHandler(n); - shadow = oldshadow; - - if (shadow) { - Printv(f_shadow, tab4, symname, " = ", module, ".", Swig_name_member(class_name,symname), "\n", NIL); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * pythoncode() - Output python code into the shadow file - * ------------------------------------------------------------ */ - - String *pythoncode(String *code, const String *indent) { - String *out = NewString(""); - String *temp; - char *t; - if (!indent) indent = ""; - - temp = NewString(code); - - t = Char(temp); - if (*t == '{') { - Delitem(temp,0); - Delitem(temp,DOH_END); - } - /* Split the input text into lines */ - List *clist = DohSplit(temp,'\n',-1); - Delete(temp); - int initial = 0; - String *s; - - /* Get the initial indentation */ - for (s = Firstitem(clist); s; s = Nextitem(clist)) { - if (Len(s)) { - char *c = Char(s); - while (*c) { - if (!isspace(*c)) break; - initial++; - c++; - } - if (*c && !isspace(*c)) break; - else { - initial = 0; - } - } - } - while (s) { - if (Len(s) > initial) { - char *c = Char(s); - c += initial; - Printv(out,indent,c,"\n",NIL); - } else { - Printv(out,"\n",NIL); - } - s = Nextitem(clist); - } - Delete(clist); - return out; - } - - /* ------------------------------------------------------------ - * insertDirective() - * - * Hook for %insert directive. We're going to look for special %shadow inserts - * as a special case so we can do indenting correctly - * ------------------------------------------------------------ */ - - virtual int insertDirective(Node *n) { - String *code = Getattr(n,"code"); - String *section = Getattr(n,"section"); - - if ((!ImportMode) && ((Cmp(section,"python") == 0) || (Cmp(section,"shadow") == 0))) { - if (shadow) { - String *pycode = pythoncode(code,shadow_indent); - Printv(f_shadow, pycode, "\n", NIL); - Delete(pycode); - } - } else { - Language::insertDirective(n); - } - return SWIG_OK; - } -}; - -/* ----------------------------------------------------------------------------- - * swig_python() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language * -swig_python(void) { - return new PYTHON(); -} diff --git a/Source/Modules1.1/ruby.cxx b/Source/Modules1.1/ruby.cxx deleted file mode 100644 index f5f0a796a..000000000 --- a/Source/Modules1.1/ruby.cxx +++ /dev/null @@ -1,1440 +0,0 @@ -/******************************************************************** - * Ruby module for SWIG - * - * $Header$ - * - * Copyright (C) 2000 Network Applied Communication Laboratory, Inc. - * Copyright (C) 2000 Information-technology Promotion Agency, Japan - * - * Masaki Fukushima - * - ********************************************************************/ - -char cvsroot_ruby_cxx[] = "$Header$"; - -#include "swigmod.h" - -#ifndef MACSWIG -#include "swigconfig.h" -#endif - -#include -#include -#include /* for INT_MAX */ - -class RClass { - private: - String *temp; - public: - String *name; /* class name (renamed) */ - String *cname; /* original C class/struct name */ - String *mname; /* Mangled name */ - String *vname; /* variable name */ - String *type; - String *prefix; - String *header; - String *init; - - int constructor_defined; - int destructor_defined; - - RClass() { - temp = NewString(""); - name = NewString(""); - cname = NewString(""); - mname = NewString(""); - vname = NewString(""); - type = NewString(""); - prefix = NewString(""); - header = NewString(""); - init = NewString(""); - constructor_defined = 0; - destructor_defined = 0; - } - - ~RClass() { - Delete(name); - Delete(cname); - Delete(vname); - Delete(mname); - Delete(type); - Delete(prefix); - Delete(header); - Delete(init); - Delete(temp); - } - - void set_name(const String_or_char *cn, const String_or_char *rn, const String_or_char *valn) { - Clear(cname); - Append(cname,cn); - Delete(mname); - mname = Swig_name_mangle(cname); - Clear(name); - Append(name,valn); - Clear(vname); - Printf(vname,"c%s.klass",name); - Clear(prefix); - Printv(prefix,(rn ? rn : cn), "_", NIL); - } - - char *strip(const String_or_char *s) { - Clear(temp); - Append(temp, s); - if (Strncmp(s, prefix, Len(prefix)) == 0) { - Replaceall(temp,prefix,""); - } - return Char(temp); - } -}; - - -#ifdef RUBY_SUPPORTS_KEYWORD_ARGS -static const char * -usage = "\ -Ruby Options (available with -ruby)\n\ - -ldflags - Print runtime libraries to link with\n\ - -feature name - Set feature name (used by `require')\n\ - -keyword - Use keyword arguments\n"; -#else -static const char * -usage = "\ -Ruby Options (available with -ruby)\n\ - -ldflags - Print runtime libraries to link with\n\ - -feature name - Set feature name (used by `require')\n"; -#endif - -#define RCLASS(hash, name) (RClass*)(Getattr(hash, name) ? Data(Getattr(hash, name)) : 0) -#define SET_RCLASS(hash, name, klass) Setattr(hash, name, NewVoid(klass, 0)) - - -class RUBY : public Language { -private: - - String *module; - String *modvar; - String *feature; - int current; - Hash *classes; /* key=cname val=RClass */ - RClass *klass; /* Currently processing class */ - Hash *special_methods; /* Python style special method name table */ - File *f_runtime; - File *f_header; - File *f_wrappers; - File *f_init; - bool use_kw; - - // Wrap modes - enum { - NO_CPP, - MEMBER_FUNC, - CONSTRUCTOR_ALLOCATE, - CONSTRUCTOR_INITIALIZE, - DESTRUCTOR, - MEMBER_VAR, - CLASS_CONST, - STATIC_FUNC, - STATIC_VAR - }; - -public: - - /* --------------------------------------------------------------------- - * RUBY() - * - * Initialize member data - * --------------------------------------------------------------------- */ - - RUBY() { - module = 0; - modvar = 0; - feature = 0; - current = NO_CPP; - classes = 0; - klass = 0; - special_methods = 0; - f_runtime = 0; - f_header = 0; - f_wrappers = 0; - f_init = 0; - use_kw = false; - } - - /* --------------------------------------------------------------------- - * main() - * - * Parse command line options and initializes variables. - * --------------------------------------------------------------------- */ - - virtual void main(int argc, char *argv[]) { - - /* Set location of SWIG library */ - SWIG_library_directory("ruby"); - - /* Look for certain command line options */ - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp(argv[i],"-feature") == 0) { - if (argv[i+1]) { - char *name = argv[i+1]; - feature = NewString(name); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else { - Swig_arg_error(); - } - } else if (strcmp(argv[i],"-help") == 0) { - Printf(stderr,"%s\n", usage); - } else if (strcmp (argv[i],"-ldflags") == 0) { - printf("%s\n", SWIG_RUBY_RUNTIME); - SWIG_exit (EXIT_SUCCESS); - } else if (strcmp(argv[i],"-keyword") == 0) { - use_kw = true; - Swig_mark_arg(i); - } - } - } - - /* Add a symbol to the parser for conditional compilation */ - Preprocessor_define("SWIGRUBY 1", 0); - - /* Add typemap definitions */ - SWIG_typemap_lang("ruby"); - SWIG_config_file("ruby.swg"); - allow_overloading(); - } - - /* --------------------------------------------------------------------- - * top() - * --------------------------------------------------------------------- */ - - virtual int top(Node *n) { - - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("init",f_init); - - modvar = 0; - current = NO_CPP; - klass = 0; - classes = NewHash(); - special_methods = NewHash(); - - /* Python style special method name. */ - /* Basic */ - Setattr(special_methods, "__repr__", "inspect"); - Setattr(special_methods, "__str__", "to_s"); - Setattr(special_methods, "__cmp__", "<=>"); - Setattr(special_methods, "__hash__", "hash"); - Setattr(special_methods, "__nonzero__", "nonzero?"); - - /* Callable */ - Setattr(special_methods, "__call__", "call"); - - /* Collection */ - Setattr(special_methods, "__len__", "length"); - Setattr(special_methods, "__getitem__", "[]"); - Setattr(special_methods, "__setitem__", "[]="); - - /* Operators */ - Setattr(special_methods, "__add__", "+"); - Setattr(special_methods, "__pos__", "+@"); - Setattr(special_methods, "__sub__", "-"); - Setattr(special_methods, "__neg__", "-@"); - Setattr(special_methods, "__mul__", "*"); - Setattr(special_methods, "__div__", "/"); - Setattr(special_methods, "__mod__", "%"); - Setattr(special_methods, "__lshift__", "<<"); - Setattr(special_methods, "__rshift__", ">>"); - Setattr(special_methods, "__and__", "&"); - Setattr(special_methods, "__or__", "|"); - Setattr(special_methods, "__xor__", "^"); - Setattr(special_methods, "__invert__", "~"); - Setattr(special_methods, "__lt__", "<"); - Setattr(special_methods, "__le__", "<="); - Setattr(special_methods, "__gt__", ">"); - Setattr(special_methods, "__ge__", ">="); - Setattr(special_methods, "__eq__", "=="); - - /* Other numeric */ - Setattr(special_methods, "__divmod__", "divmod"); - Setattr(special_methods, "__pow__", "**"); - Setattr(special_methods, "__abs__", "abs"); - Setattr(special_methods, "__int__", "to_i"); - Setattr(special_methods, "__float__", "to_f"); - Setattr(special_methods, "__coerce__", "coerce"); - - Swig_banner(f_runtime); - - if (NoInclude) { - Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); - } - - /* typedef void *VALUE */ - SwigType *value = NewSwigType(T_VOID); - SwigType_add_pointer(value); - SwigType_typedef(value,(char*)"VALUE"); - Delete(value); - - /* Set module name */ - set_module(Char(Getattr(n,"name"))); - - Printf(f_header,"#define SWIG_init Init_%s\n", feature); - Printf(f_header,"#define SWIG_name \"%s\"\n\n", module); - Printf(f_header,"static VALUE %s;\n", modvar); - - /* Start generating the initialization function */ - Printv(f_init, - "\n", - "#ifdef __cplusplus\n", - "extern \"C\"\n", - "#endif\n", - "void Init_", feature, "(void) {\n", - "int i;\n", - "\n", - NIL); - - Printv(f_init, tab4, "SWIG_InitRuntime();\n", NIL); - - /* Account for nested modules */ - List *modules = Split(module,':',INT_MAX); - if (modules != 0 && Len(modules) > 0) { - String *mv = 0; - String *m = Firstitem(modules); - while (m != 0) { - if (Len(m) > 0) { - if (mv != 0) { - Printv(f_init, tab4, modvar, - " = rb_define_module_under(", modvar, ", \"", m, "\");\n", NIL); - } else { - Printv(f_init, tab4, modvar, - " = rb_define_module(\"", m, "\");\n", NIL); - mv = NewString(modvar); - } - } - m = Nextitem(modules); - } - Delete(mv); - Delete(modules); - } - - Printv(f_init, - "\n", - "for (i = 0; swig_types_initial[i]; i++) {\n", - "swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]);\n", - "SWIG_define_class(swig_types[i]);\n", - "}\n", - NIL); - Printf(f_init,"\n"); - - Language::top(n); - - /* Finish off our init function */ - Printf(f_init,"}\n"); - SwigType_emit_type_table(f_runtime,f_wrappers); - - /* Close all of the files */ - Dump(f_header,f_runtime); - Dump(f_wrappers,f_runtime); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - Delete(f_runtime); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * importDirective() - * ----------------------------------------------------------------------------- */ - - virtual int importDirective(Node *n) { - String *modname = Getattr(n,"module"); - if (modname) { - Printf(f_init,"rb_require(\"%s\");\n", modname); - } - return Language::importDirective(n); - } - - /* --------------------------------------------------------------------- - * set_module(const char *mod_name) - * - * Sets the module name. Does nothing if it's already set (so it can - * be overridden as a command line option). - *---------------------------------------------------------------------- */ - - void set_module(const char *s) { - String *mod_name = NewString(s); - if (module == 0) { - /* Start with the empty string */ - module = NewString(""); - - /* Account for nested modules */ - List *modules = Split(mod_name,':',INT_MAX); - if (modules != 0 && Len(modules) > 0) { - String *last = 0; - String *m = Firstitem(modules); - while (m != 0) { - if (Len(m) > 0) { - String *cap = NewString(m); - (Char(cap))[0] = toupper((Char(cap))[0]); - if (last != 0) { - Append(module, "::"); - } - Append(module, cap); - last = m; - } - m = Nextitem(modules); - } - if (feature == 0) { - feature = Copy(last); - } - (Char(last))[0] = toupper((Char(last))[0]); - modvar = NewStringf("m%s", last); - Delete(modules); - } - } - Delete(mod_name); - } - - /* -------------------------------------------------------------------------- - * nativeWrapper() - * -------------------------------------------------------------------------- */ - virtual int nativeWrapper(Node *n) { - String *funcname = Getattr(n,"wrap:name"); - Swig_warning(WARN_LANG_NATIVE_UNIMPL, input_file, line_number, - "Adding native function %s not supported (ignored).\n", funcname); - return SWIG_NOWRAP; - } - - /* --------------------------------------------------------------------- - * create_command(Node *n, char *iname) - * - * Creates a new command from a C function. - * iname = Name of function in scripting language - * --------------------------------------------------------------------- */ - - void create_command(Node *n, const String_or_char *iname) { - - String *wname = Swig_name_wrapper(iname); - if (CPlusPlus) { - Insert(wname,0,"VALUEFUNC("); - Append(wname,")"); - } - if (current != NO_CPP) - iname = klass->strip(iname); - if (Getattr(special_methods, iname)) { - iname = GetChar(special_methods, iname); - } - - String *s = NewString(""); - String *temp = NewString(""); - - switch (current) { - case MEMBER_FUNC: - Printv(klass->init, tab4, "rb_define_method(", klass->vname, ", \"", - iname, "\", ", wname, ", -1);\n", NIL); - break; - case CONSTRUCTOR_ALLOCATE: - Printv(s, tab4, "rb_define_singleton_method(", klass->vname, - ", \"new\", ", wname, ", -1);\n", NIL); - Replaceall(klass->init,"$allocator", s); - break; - case CONSTRUCTOR_INITIALIZE: - Printv(s, tab4, "rb_define_method(", klass->vname, - ", \"initialize\", ", wname, ", -1);\n", NIL); - Replaceall(klass->init,"$initializer", s); - break; - case MEMBER_VAR: - Append(temp,iname); - Replaceall(temp,"_set", "="); - Replaceall(temp,"_get", ""); - Printv(klass->init, tab4, "rb_define_method(", klass->vname, ", \"", - temp, "\", ", wname, ", -1);\n", NIL); - break; - case STATIC_FUNC: - Printv(klass->init, tab4, "rb_define_singleton_method(", klass->vname, - ", \"", iname, "\", ", wname, ", -1);\n", NIL); - break; - default: - Printv(s, tab4, "rb_define_module_function(", modvar, ", \"", - iname, "\", ", wname, ", -1);\n",NIL); - Printv(f_init,s,NIL); - break; - } - - /* Process the comma-separated list of aliases (if any) */ - String *aliasv = Getattr(n,"feature:alias"); - if (aliasv) { - List *aliases = Split(aliasv,',',INT_MAX); - if (aliases && Len(aliases) > 0) { - String *alias = Firstitem(aliases); - while (alias) { - if (Len(alias) > 0) { - Printv(klass->init, tab4, "rb_define_alias(", klass->vname, ", \"", alias, "\", \"", iname, "\");\n", NIL); - } - alias = Nextitem(aliases); - } - } - Delete(aliases); - } - - Delete(temp); - Delete(s); - Delete(wname); - } - - /* --------------------------------------------------------------------- - * marshalInputArgs(int numarg, int numreq, int start, Wrapper *f) - * - * Checks each of the parameters in the parameter list for a "check" - * typemap and (if it finds one) inserts the typemapping code into - * the function wrapper. - * --------------------------------------------------------------------- */ - - void marshalInputArgs(ParmList *l, int numarg, int numreq, int start, String *kwargs, bool allow_kwargs, Wrapper *f) { - int i; - Parm *p; - String *tm; - char source[256], target[256]; - - int use_self = (current == MEMBER_FUNC || current == MEMBER_VAR) ? 1 : 0; - int varargs = emit_isvarargs(l); - - Printf(kwargs,"{ "); - for (i = 0, p = l; i < numarg; i++) { - - /* Skip ignored arguments */ - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *pn = Getattr(p,"name"); - String *ln = Getattr(p,"lname"); - - /* Produce string representation of source and target arguments */ - int selfp = (use_self && i == 0); - if (selfp) - strcpy(source,"self"); - else - sprintf(source,"argv[%d]",i-start); - - sprintf(target,"%s", Char(ln)); - - if (i >= (numreq)) { /* Check if parsing an optional argument */ - Printf(f->code," if (argc > %d) {\n", i - start); - } - - /* Record argument name for keyword argument handling */ - if (Len(pn)) { - Printf(kwargs,"\"%s\",", pn); - } else { - Printf(kwargs,"\"arg%d\",", i+1); - } - - /* Look for an input typemap */ - if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$target",ln); - Replaceall(tm,"$source",source); - Replaceall(tm,"$input",source); - Setattr(p,"emit:input",source); - Printf(f->code,"%s\n", tm); - p = Getattr(p,"tmap:in:next"); - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, - "Unable to use type %s as a function argument.\n", SwigType_str(pt,0)); - p = nextSibling(p); - } - if (i >= numreq) { - Printf(f->code,"}\n"); - } - } - - /* Finish argument marshalling */ - Printf(kwargs," NULL }"); - if (allow_kwargs) { - Printv(f->locals, tab4, "char *kwnames[] = ", kwargs, ";\n", NIL); - } - - /* Trailing varargs */ - if (varargs) { - if (p && (tm = Getattr(p,"tmap:in"))) { - sprintf(source,"argv[%d]",i-start); - Replaceall(tm,"$input",source); - Setattr(p,"emit:input",source); - Printf(f->code,"if (argc > %d) {\n", i-start); - Printv(f->code,tm,"\n",NIL); - Printf(f->code,"}\n"); - } - } - } - - /* --------------------------------------------------------------------- - * insertConstraintCheckingCode(ParmList *l, Wrapper *f) - * - * Checks each of the parameters in the parameter list for a "check" - * typemap and (if it finds one) inserts the typemapping code into - * the function wrapper. - * --------------------------------------------------------------------- */ - - void insertConstraintCheckingCode(ParmList *l, Wrapper *f) { - Parm *p; - String *tm; - for (p = l; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - } - - /* --------------------------------------------------------------------- - * insertCleanupCode(ParmList *l, String *cleanup) - * - * Checks each of the parameters in the parameter list for a "freearg" - * typemap and (if it finds one) inserts the typemapping code into - * the function wrapper. - * --------------------------------------------------------------------- */ - - void insertCleanupCode(ParmList *l, String *cleanup) { - String *tm; - for (Parm *p = l; p; ) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - } - - /* --------------------------------------------------------------------- - * insertCleanupCode(ParmList *l, String *cleanup) - * - * Checks each of the parameters in the parameter list for a "argout" - * typemap and (if it finds one) inserts the typemapping code into - * the function wrapper. - * --------------------------------------------------------------------- */ - - void insertArgOutputCode(ParmList *l, String *outarg, int& need_result) { - String *tm; - for (Parm *p = l; p; ) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$target","vresult"); - Replaceall(tm,"$result","vresult"); - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - need_result = 1; - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - } - - /* --------------------------------------------------------------------- - * validIdentifier() - * - * Is this a valid identifier in the scripting language? - * Ruby method names can include any combination of letters, numbers - * and underscores. A Ruby method name may optionally end with - * a question mark ("?"), exclamation point ("!") or equals sign ("="). - * - * Methods whose names end with question marks are, by convention, - * predicate methods that return true or false (e.g. Array#empty?). - * - * Methods whose names end with exclamation points are, by convention, - * "mutators" that modify the instance in place (e.g. Array#sort!). - * - * Methods whose names end with an equals sign are attribute setters - * (e.g. Thread#critical=). - * --------------------------------------------------------------------- */ - - virtual int validIdentifier(String *s) { - char *c = Char(s); - while (*c) { - if ( !( isalnum(*c) || (*c == '_') || (*c == '?') || (*c == '!') || (*c == '=') ) ) return 0; - c++; - } - return 1; - } - - /* --------------------------------------------------------------------- - * functionWrapper() - * - * Create a function declaration and register it with the interpreter. - * --------------------------------------------------------------------- */ - - virtual int functionWrapper(Node *n) { - String *symname = Copy(Getattr(n,"sym:name")); - SwigType *t = Getattr(n,"type"); - ParmList *l = Getattr(n,"parms"); - String *tm; - - int need_result = 0; - - /* Ruby needs no destructor wrapper */ - if (current == DESTRUCTOR) - return SWIG_NOWRAP; - - /* If the C++ class constructor is overloaded, we only want to - * write out the "new" singleton method once since it is always - * the same. (It's the "initialize" method that will handle the - * overloading). */ - - if (current == CONSTRUCTOR_ALLOCATE && - Swig_symbol_isoverloaded(n) && - Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; - - String *overname = 0; - if (Getattr(n, "sym:overloaded")) { - overname = Getattr(n, "sym:overname"); - } else { - if (!addSymbol(symname, n)) - return SWIG_ERROR; - } - - String *cleanup = NewString(""); - String *outarg = NewString(""); - String *kwargs = NewString(""); - Wrapper *f = NewWrapper(); - - /* Rename predicate methods */ - if (Getattr(n, "feature:predicate")) { - Append(symname, "?"); - } - - /* Determine the name of the SWIG wrapper function */ - String *wname = Swig_name_wrapper(symname); - if (overname && current != CONSTRUCTOR_ALLOCATE) { - Append(wname,overname); - } - - /* Emit arguments */ - if (current != CONSTRUCTOR_ALLOCATE) { - emit_args(t,l,f); - } - - /* Attach standard typemaps */ - if (current != CONSTRUCTOR_ALLOCATE) { - emit_attach_parmmaps(l, f); - } - Setattr(n, "wrap:parms", l); - - /* Get number of arguments */ - int numarg = emit_num_arguments(l); - int numreq = emit_num_required(l); - int varargs = emit_isvarargs(l); - bool allow_kwargs = use_kw || Getattr(n,"feature:kwargs"); - - int start = (current == MEMBER_FUNC || current == MEMBER_VAR) ? 1 : 0; - - /* Now write the wrapper function itself */ - Printv(f->def, "static VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); - - if (current != CONSTRUCTOR_ALLOCATE) { - if (!varargs) { - Printf(f->code,"if ((argc < %d) || (argc > %d))\n", numreq-start, numarg-start); - } else { - Printf(f->code,"if (argc < %d)\n", numreq-start); - } - Printf(f->code,"rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc);\n",numreq-start); - } - - /* Now walk the function parameter list and generate code */ - /* to get arguments */ - if (current != CONSTRUCTOR_ALLOCATE) { - marshalInputArgs(l, numarg, numreq, start, kwargs, allow_kwargs, f); - } - - /* Insert constraint checking code */ - insertConstraintCheckingCode(l, f); - - /* Insert cleanup code */ - insertCleanupCode(l, cleanup); - - /* Insert argument output code */ - insertArgOutputCode(l, outarg, need_result); - - /* Now write code to make the function call */ - if (current != CONSTRUCTOR_ALLOCATE) { - if (current == CONSTRUCTOR_INITIALIZE) { - String *action = Getattr(n,"wrap:action"); - if (action) { - Append(action,"DATA_PTR(self) = result;"); - } - } - emit_action(n,f); - } - - int newobj = 0; - if (Getattr(n,"feature:new")) newobj = 1; - - /* Return value if necessary */ - if (SwigType_type(t) != T_VOID && current != CONSTRUCTOR_ALLOCATE && current != CONSTRUCTOR_INITIALIZE) { - need_result = 1; - if (Getattr(n, "feature:predicate")) { - Printv(f->code, tab4, "vresult = (result ? Qtrue : Qfalse);\n", NIL); - } else { - tm = Swig_typemap_lookup_new("out",n,"result",0); - if (tm) { - Replaceall(tm,"$result","vresult"); - Replaceall(tm,"$source","result"); - Replaceall(tm,"$target","vresult"); - Replaceall(tm,"$owner", newobj ? "1" : "0"); - Printv(f->code, tm, "\n", NIL); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, - "Unable to use return type %s.\n", SwigType_str(t,0)); - } - } - } - - /* Extra code needed for new and initialize methods */ - if (current == CONSTRUCTOR_ALLOCATE) { - need_result = 1; - Printf(f->code, "VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE%s);\n", Char(SwigType_manglestr(t))); - Printf(f->code, "rb_obj_call_init(vresult, argc, argv);\n"); - } else if (current == CONSTRUCTOR_INITIALIZE) { - need_result = 1; - // Printf(f->code, "DATA_PTR(self) = result;\n"); - } - - /* Dump argument output code; */ - Printv(f->code,outarg,NIL); - - /* Dump the argument cleanup code */ - if (current != CONSTRUCTOR_ALLOCATE) - Printv(f->code,cleanup,NIL); - - /* Look for any remaining cleanup. This processes the %new directive */ - if (newobj) { - tm = Swig_typemap_lookup_new("newfree",n,"result",0); - if (tm) { - Replaceall(tm,"$source","result"); - Printv(f->code,tm, "\n",NIL); - } - } - - /* Special processing on return value. */ - tm = Swig_typemap_lookup_new("ret",n,"result",0); - if (tm) { - Replaceall(tm,"$source","result"); - Printv(f->code,tm, NIL); - } - - /* Wrap things up (in a manner of speaking) */ - if (need_result) { - if (current == CONSTRUCTOR_ALLOCATE) { - Printv(f->code, tab4, "return vresult;\n}\n", NIL); - } else if (current == CONSTRUCTOR_INITIALIZE) { - Printv(f->code, tab4, "return self;\n}\n", NIL); - } else { - Wrapper_add_local(f,"vresult","VALUE vresult = Qnil"); - Printv(f->code, tab4, "return vresult;\n}\n", NIL); - } - } else { - Printv(f->code, tab4, "return Qnil;\n}\n", NIL); - } - - /* Substitute the cleanup code */ - Replaceall(f->code,"$cleanup",cleanup); - - /* Emit the function */ - Wrapper_print(f, f_wrappers); - - /* Now register the function with the interpreter */ - if (!Swig_symbol_isoverloaded(n)) { - create_command(n, symname); - } else { - if (current == CONSTRUCTOR_ALLOCATE) { - create_command(n, symname); - } else { - Setattr(n, "wrap:name", wname); - if (!Getattr(n, "sym:nextSibling")) - dispatchFunction(n); - } - } - - Delete(kwargs); - Delete(cleanup); - Delete(outarg); - DelWrapper(f); - Delete(symname); - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * dispatchFunction() - * ------------------------------------------------------------ */ - - void dispatchFunction(Node *n) { - /* Last node in overloaded chain */ - - int maxargs; - String *tmp = NewString(""); - String *dispatch = Swig_overload_dispatch(n, "return %s(nargs, args, self);", &maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *f = NewWrapper(); - String *symname = Getattr(n, "sym:name"); - String *wname = Swig_name_wrapper(symname); - - Printv(f->def, - "static VALUE ", wname, - "(int nargs, VALUE *args, VALUE self) {", - NIL); - - Wrapper_add_local(f, "argc", "int argc"); - if (current == MEMBER_FUNC || current == MEMBER_VAR) { - Printf(tmp, "VALUE argv[%d]", maxargs+1); - } else { - Printf(tmp, "VALUE argv[%d]", maxargs); - } - Wrapper_add_local(f, "argv", tmp); - Wrapper_add_local(f, "ii", "int ii"); - if (current == MEMBER_FUNC || current == MEMBER_VAR) { - Printf(f->code, "argc = nargs + 1;\n"); - Printf(f->code, "argv[0] = self;\n"); - Printf(f->code, "for (ii = 1; (ii < argc) && (ii < %d); ii++) {\n", maxargs); - Printf(f->code, "argv[ii] = args[ii-1];\n"); - Printf(f->code, "}\n"); - } else { - Printf(f->code, "argc = nargs;\n"); - Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n", maxargs); - Printf(f->code, "argv[ii] = args[ii];\n"); - Printf(f->code, "}\n"); - } - - Replaceall(dispatch, "$args", "nargs, args, self"); - Printv(f->code, dispatch, "\n", NIL); - Printf(f->code, "rb_raise(rb_eArgError, \"No matching function for overloaded '%s'\");\n", symname); - Printf(f->code,"return Qnil;\n"); - Printv(f->code, "}\n", NIL); - Wrapper_print(f, f_wrappers); - create_command(n, Char(symname)); - - DelWrapper(f); - Delete(dispatch); - Delete(tmp); - Delete(wname); - } - - /* --------------------------------------------------------------------- - * variableWrapper() - * --------------------------------------------------------------------- */ - - virtual int variableWrapper(Node *n) { - - char *name = GetChar(n,"name"); - char *iname = GetChar(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - String *tm; - String *getfname, *setfname; - Wrapper *getf, *setf; - - getf = NewWrapper(); - setf = NewWrapper(); - - /* create getter */ - getfname = NewString(Swig_name_get(iname)); - Printv(getf->def, "static VALUE\n", getfname, "(", NIL); - Printf(getf->def, "VALUE self"); - Printf(getf->def, ") {"); - Wrapper_add_local(getf,"_val","VALUE _val"); - - tm = Swig_typemap_lookup_new("varout",n, name, 0); - if (tm) { - Replaceall(tm,"$result","_val"); - Replaceall(tm,"$target","_val"); - Replaceall(tm,"$source",name); - Printv(getf->code,tm, NIL); - } else { - Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, - "Unable to read variable of type %s\n", SwigType_str(t,0)); - } - Printv(getf->code, tab4, "return _val;\n}\n", NIL); - Wrapper_print(getf,f_wrappers); - - if (Getattr(n,"feature:immutable")) { - setfname = NewString("NULL"); - } else { - /* create setter */ - setfname = NewString(Swig_name_set(iname)); - Printv(setf->def, "static VALUE\n", setfname, "(VALUE self, ", NIL); - Printf(setf->def, "VALUE _val) {"); - - tm = Swig_typemap_lookup_new("varin",n,name,0); - if (tm) { - Replaceall(tm,"$input","_val"); - Replaceall(tm,"$source","_val"); - Replaceall(tm,"$target",name); - Printv(setf->code,tm,"\n",NIL); - } else { - Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, - "Unable to set variable of type %s\n", SwigType_str(t,0)); - } - Printv(setf->code, tab4, "return _val;\n",NIL); - Printf(setf->code,"}\n"); - Wrapper_print(setf,f_wrappers); - } - - /* define accessor method */ - if (CPlusPlus) { - Insert(getfname,0,"VALUEFUNC("); - Append(getfname,")"); - Insert(setfname,0,"VALUEFUNC("); - Append(setfname,")"); - } - - String *s = NewString(""); - switch (current) { - case STATIC_VAR: - /* C++ class variable */ - Printv(s, - tab4, "rb_define_singleton_method(", klass->vname, ", \"", - klass->strip(iname), "\", ", getfname, ", 0);\n", - NIL); - if (!Getattr(n,"feature:immutable")) { - Printv(s, - tab4, "rb_define_singleton_method(", klass->vname, ", \"", - klass->strip(iname), "=\", ", setfname, ", 1);\n", - NIL); - } - Printv(klass->init,s,NIL); - break; - default: - /* C global variable */ - /* wrapped in Ruby module attribute */ - Printv(s, - tab4, "rb_define_singleton_method(", modvar, ", \"", - iname, "\", ", getfname, ", 0);\n", - NIL); - if (!Getattr(n,"feature:immutable")) { - Printv(s, - tab4, "rb_define_singleton_method(", modvar, ", \"", - iname, "=\", ", setfname, ", 1);\n", - NIL); - } - Printv(f_init,s,NIL); - Delete(s); - break; - } - Delete(getfname); - Delete(setfname); - DelWrapper(setf); - DelWrapper(getf); - return SWIG_OK; - } - - - /* --------------------------------------------------------------------- - * validate_const_name(char *name) - * - * Validate constant name. - * --------------------------------------------------------------------- */ - - char * - validate_const_name(char *name, const char *reason) { - if (!name || name[0] == '\0') - return name; - - if (isupper(name[0])) - return name; - - if (islower(name[0])) { - name[0] = toupper(name[0]); - Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, - "Wrong %s name (corrected to `%s')\n", reason, name); - return name; - } - - Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, - "Wrong %s name\n", reason); - - return name; - } - - /* --------------------------------------------------------------------- - * constantWrapper() - * --------------------------------------------------------------------- */ - - virtual int constantWrapper(Node *n) { - Swig_require(&n, "*sym:name", "type", "value", NIL); - - char *iname = GetChar(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - char *value = GetChar(n,"value"); - - if (current == CLASS_CONST) { - iname = klass->strip(iname); - } - validate_const_name(iname, "constant"); - SetChar(n, "sym:name", iname); - - /* Special hook for member pointer */ - if (SwigType_type(type) == T_MPOINTER) { - String *wname = Swig_name_wrapper(iname); - Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); - value = Char(wname); - } - String *tm = Swig_typemap_lookup_new("constant", n, value, 0); - if (tm) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", iname); - Replaceall(tm, "$symname", iname); - Replaceall(tm, "$value", value); - if (current == CLASS_CONST) { - Replaceall(tm, "$module", klass->vname); - Printv(klass->init, tm, "\n", NIL); - } else { - Replaceall(tm,"$module", modvar); - Printf(f_init, "%s\n", tm); - } - } else { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, - "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); - } - Swig_restore(&n); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * classDeclaration() - * - * Records information about classes---even classes that might be defined in - * other modules referenced by %import. - * ----------------------------------------------------------------------------- */ - - virtual int classDeclaration(Node *n) { - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - String *tdname = Getattr(n,"tdname"); - - name = tdname ? tdname : name; - String *namestr = SwigType_namestr(name); - klass = RCLASS(classes, Char(namestr)); - if (!klass) { - klass = new RClass(); - String *valid_name = NewString(symname ? symname : namestr); - validate_const_name(Char(valid_name), "class"); - klass->set_name(namestr, symname, valid_name); - SET_RCLASS(classes, Char(namestr), klass); - Delete(valid_name); - } - Delete(namestr); - return Language::classDeclaration(n); - } - - /* ---------------------------------------------------------------------- - * classHandler() - * ---------------------------------------------------------------------- */ - - virtual int classHandler(Node *n) { - - String *name = Getattr(n,"name"); - String *symname = Getattr(n,"sym:name"); - String *namestr = SwigType_namestr(name); // does template expansion - - klass = RCLASS(classes, Char(namestr)); - assert(klass); - Delete(namestr); - String *valid_name = NewString(symname); - validate_const_name(Char(valid_name), "class"); - - Clear(klass->type); - Printv(klass->type, Getattr(n,"classtype"), NIL); - Printv(klass->header, "\nswig_class c", valid_name, ";\n", NIL); - Printv(klass->init, "\n", tab4, NIL); - Printv(klass->init, klass->vname, " = rb_define_class_under(", modvar, - ", \"", klass->name, "\", $super);\n", NIL); - - SwigType *tt = NewString(name); - SwigType_add_pointer(tt); - SwigType_remember(tt); - String *tm = SwigType_manglestr(tt); - Printf(klass->init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) &c%s);\n", tm, valid_name); - Delete(tm); - Delete(tt); - Delete(valid_name); - - /* Process the comma-separated list of mixed-in module names (if any) */ - String *mixin = Getattr(n,"feature:mixin"); - if (mixin) { - List *modules = Split(mixin,',',INT_MAX); - if (modules && Len(modules) > 0) { - String *mod = Firstitem(modules); - while (mod) { - if (Len(mod) > 0) { - Printf(klass->init, "rb_include_module(%s, rb_eval_string(\"%s\"));\n", klass->vname, mod); - } - mod = Nextitem(modules); - } - } - Delete(modules); - } - - Printv(klass->init, "$allocator",NIL); - Printv(klass->init, "$initializer",NIL); - - Printv(klass->header, - "$freeproto", - NIL); - - Language::classHandler(n); - - /* Handle inheritance */ - List *baselist = Getattr(n,"bases"); - if (baselist && Len(baselist)) { - Node *base = Firstitem(baselist); - String *basename = Getattr(base,"name"); - String *basenamestr = SwigType_namestr(basename); - RClass *super = RCLASS(classes, Char(basenamestr)); - Delete(basenamestr); - if (super) { - SwigType *btype = NewString(basename); - SwigType_add_pointer(btype); - SwigType_remember(btype); - String *bmangle = SwigType_manglestr(btype); - Insert(bmangle,0,"((swig_class *) SWIGTYPE"); - Append(bmangle,"->clientdata)->klass"); - Replaceall(klass->init,"$super",bmangle); - Delete(bmangle); - Delete(btype); - } - - /* Warn about multiple inheritance if additional base class(es) listed */ - base = Nextitem(baselist); - while (base) { - basename = Getattr(n,"name"); - Swig_warning(WARN_RUBY_MULTIPLE_INHERITANCE, input_file, line_number, - "Warning for %s: Base %s ignored. Multiple inheritance is not supported in Ruby.\n", basename, basename); - base = Nextitem(baselist); - } - } - - /* Check to see if a %markfunc was specified */ - String *markfunc = Getattr(n, "feature:markfunc"); - if (markfunc) { - Printf(klass->init, "c%s.mark = (void (*)(void *)) %s;\n", klass->name, markfunc); - } else { - Printf(klass->init, "c%s.mark = 0;\n", klass->name); - } - - /* Check to see if a %freefunc was specified */ - String *freefunc = Getattr(n, "feature:freefunc"); - if (freefunc) { - Printf(klass->init, "c%s.destroy = (void (*)(void *)) %s;\n", klass->name, freefunc); - } else { - if (klass->destructor_defined) { - Printf(klass->init, "c%s.destroy = (void (*)(void *)) free_%s;\n", klass->name, klass->mname); - } - } - Replaceall(klass->header,"$freeproto", ""); - - Printv(f_header, klass->header,NIL); - - String *s = NewString(""); - Printv(s, tab4, "rb_undef_method(CLASS_OF(", klass->vname, - "), \"new\");\n", NIL); - Replaceall(klass->init,"$allocator", s); - Replaceall(klass->init,"$initializer", ""); - Replaceall(klass->init,"$super", "rb_cObject"); - Delete(s); - - Printv(f_init,klass->init,NIL); - klass = 0; - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * memberfunctionHandler() - * - * Method for adding C++ member function - * - * By default, we're going to create a function of the form : - * - * Foo_bar(this,args) - * - * Where Foo is the classname, bar is the member name and the this pointer - * is explicitly attached to the beginning. - * - * The renaming only applies to the member function part, not the full - * classname. - * - * --------------------------------------------------------------------- */ - - virtual int memberfunctionHandler(Node *n) { - current = MEMBER_FUNC; - Language::memberfunctionHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* --------------------------------------------------------------------- - * constructorHandler() - * - * Method for adding C++ member constructor - * -------------------------------------------------------------------- */ - - virtual int constructorHandler(Node *n) { - /* First wrap the new singleton method */ - current = CONSTRUCTOR_ALLOCATE; - Swig_name_register((String_or_char *) "construct", (String_or_char *) "%c_allocate"); - Language::constructorHandler(n); - - /* Now do the instance initialize method */ - current = CONSTRUCTOR_INITIALIZE; - Swig_name_register((String_or_char *) "construct", (String_or_char *) "new_%c"); - Language::constructorHandler(n); - - /* Done */ - Swig_name_unregister((String_or_char *) "construct"); - current = NO_CPP; - klass->constructor_defined = 1; - return SWIG_OK; - } - - /* --------------------------------------------------------------------- - * destructorHandler() - * -------------------------------------------------------------------- */ - - virtual int destructorHandler(Node *n) { - current = DESTRUCTOR; - Language::destructorHandler(n); - - String *freefunc = NewString(""); - String *freeproto = NewString(""); - String *freebody = NewString(""); - - Printv(freefunc, "free_", klass->mname, NIL); - Printv(freeproto, "static void ", freefunc, "(", klass->type, " *);\n", NIL); - Printv(freebody, "static void\n", - freefunc, "(", klass->type, " *", Swig_cparm_name(0,0), ") {\n", - tab4, NIL); - if (Extend) { - String *wrap = Getattr(n, "wrap:code"); - if (wrap) { - File *f_code = Swig_filebyname("header"); - if (f_code) { - Printv(f_code, wrap, NIL); - } - } - /* Printv(freebody, Swig_name_destroy(name), "(", Swig_cparm_name(0,0), ")", NIL); */ - Printv(freebody,Getattr(n,"wrap:action"), NIL); - } else { - /* When no extend mode, swig emits no destroy function. */ - if (CPlusPlus) - Printf(freebody, "delete %s", Swig_cparm_name(0,0)); - else - Printf(freebody, "free((char*) %s)", Swig_cparm_name(0,0)); - } - Printv(freebody, ";\n}\n", NIL); - - Replaceall(klass->header,"$freeproto", freeproto); - Printv(f_wrappers, freebody, NIL); - - klass->destructor_defined = 1; - current = NO_CPP; - Delete(freefunc); - Delete(freeproto); - Delete(freebody); - return SWIG_OK; - } - - /* --------------------------------------------------------------------- - * membervariableHandler() - * - * This creates a pair of functions to set/get the variable of a member. - * -------------------------------------------------------------------- */ - - virtual int - membervariableHandler(Node *n) { - current = MEMBER_VAR; - Language::membervariableHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ----------------------------------------------------------------------- - * staticmemberfunctionHandler() - * - * Wrap a static C++ function - * ---------------------------------------------------------------------- */ - - virtual int - staticmemberfunctionHandler(Node *n) { - current = STATIC_FUNC; - Language::staticmemberfunctionHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * memberconstantHandler() - * - * Create a C++ constant - * --------------------------------------------------------------------- */ - - virtual int - memberconstantHandler(Node *n) { - current = CLASS_CONST; - Language::memberconstantHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* --------------------------------------------------------------------- - * staticmembervariableHandler() - * --------------------------------------------------------------------- */ - - virtual int - staticmembervariableHandler(Node *n) { - current = STATIC_VAR; - Language::staticmembervariableHandler(n); - current = NO_CPP; - return SWIG_OK; - } - -}; /* class RUBY */ - -/* ----------------------------------------------------------------------------- - * swig_ruby() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language * -swig_ruby(void) { - return new RUBY(); -} - - -/* - * Local Variables: - * c-basic-offset: 2 - * End: - */ - diff --git a/Source/Modules1.1/s-exp.cxx b/Source/Modules1.1/s-exp.cxx deleted file mode 100644 index 2a9f2dcc1..000000000 --- a/Source/Modules1.1/s-exp.cxx +++ /dev/null @@ -1,401 +0,0 @@ -/* ----------------------------------------------------------------------------- - * s-exp.cxx - * - * A parse tree represented as Lisp s-expressions. - * - * Author(s) : Matthias Koeppe (mkoeppe@mail.math.uni-magdeburg.de) - * - * Copyright (C) 2002. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -/* Derived from xml.cxx 1.1.2.2 */ - -char cvsroot_s_exp_cxx[] = "$Header$"; -static const char *usage = "\ -S-Exp Options (available with -sexp)\n\ - -typemaplang lang - Typemap language.\n\n"; - -#include "swigmod.h" - -//static Node *view_top = 0; -static File *out = 0; - -class Sexp : public Language { -public: - int indent_level; - Sexp() : indent_level( 0 ) {} - virtual ~Sexp() {} - virtual void main(int argc, char *argv[]) { - SWIG_typemap_lang("sexp"); - for( int iX = 0; iX < argc; iX++ ) - { - if( strcmp( argv[iX], "-typemaplang" ) == 0 ) - { - Swig_mark_arg (iX); - iX++; - SWIG_typemap_lang(argv[iX]); - Swig_mark_arg (iX); - continue; - } - if( strcmp( argv[iX], "-help" ) == 0 ) - { - fputs( usage, stderr ); - } - } - } - - DOHHash *print_circle_hash; - int print_circle_count; - int hanging_parens; - bool need_whitespace; - bool need_newline; - - /* Top of the parse tree */ - virtual int top(Node *n) - { - if( out == 0 ) - { - String *outfile = Getattr(n,"outfile"); - Replaceall(outfile,"_wrap.cxx", ".lisp"); - out = NewFile(outfile,"w"); - if (!out) - { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - } - Language::top(n); - Printf( out, ";;; Lisp parse tree produced by SWIG\n" ); - print_circle_hash = DohNewHash(); - print_circle_count = 0; - hanging_parens = 0; - need_whitespace = 0; - need_newline = 0; - Sexp_print_node(n); - flush_parens(); - return SWIG_OK; - } - - void print_indent() - { - int i; - for (i = 0; i < indent_level; i++) - { - Printf(out, " "); - } - } - - void open_paren(const String *oper) - { - flush_parens(); - Printf(out, "("); - if (oper) Printf(out, "%s ", oper); - indent_level += 2; - } - - void close_paren(bool need_newline = false) - { - hanging_parens++; - if (need_newline) - print_lazy_whitespace(); - indent_level -= 2; - } - - void flush_parens() - { - int i; - if (hanging_parens) { - for (i = 0; i", obj); - } - } - } - } - - void Sexp_print_as_keyword(const DOH *k) - { - /* Print key, replacing ":" with "-" because : is CL's package prefix */ - flush_parens(); - String *key = NewString(k); - Replaceall(key, ":", "-"); - Replaceall(key, "_", "-"); - Printf(out,":%s ", key); - Delete(key); - } - - void Sexp_print_plist_noparens(DOH *obj) - { - /* attributes map names to objects */ - String *k; - bool first; - for (k = Firstkey(obj), first = true; k; k = Nextkey(obj), first=false) { - if (!internal_key_p(k)) { - DOH *value = Getattr(obj, k); - flush_parens(); - if (!first) { - Printf(out, " "); - } - Sexp_print_as_keyword(k); - /* Print value */ - Sexp_print_value_of_key(value, k); - } - } - } - - void Sexp_print_plist(DOH *obj) - { - flush_parens(); - if (print_circle(obj, true)) { - open_paren(NIL); - Sexp_print_plist_noparens(obj); - close_paren(); - } - } - - void Sexp_print_attributes(Node * obj) - { - Sexp_print_plist_noparens(obj); - } - - void Sexp_print_node(Node *obj) - { - Node *cobj; - open_paren(nodeType(obj)); - /* A node has an attribute list... */ - Sexp_print_attributes(obj); - /* ... and child nodes. */ - cobj = firstChild(obj); - if (cobj) { - print_lazy_newline(); - flush_parens(); - Sexp_print_as_keyword("children"); - open_paren(NIL); - for (; cobj; cobj = nextSibling(cobj)) { - Sexp_print_node(cobj); - } - close_paren(); - } - close_paren(); - } - - - virtual int functionWrapper(Node *n) - { - ParmList *l = Getattr(n,"parms"); - Wrapper *f = NewWrapper(); - emit_attach_parmmaps(l,f); - Setattr(n,"wrap:parms",l); - return SWIG_OK; - } - -}; - - -extern "C" -{ - Language * swig_sexp( void ) - { - return new Sexp(); - } -} diff --git a/Source/Modules1.1/swigmain.cxx b/Source/Modules1.1/swigmain.cxx deleted file mode 100644 index 2048bb82c..000000000 --- a/Source/Modules1.1/swigmain.cxx +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************************* - * Simplified Wrapper and Interface Generator (SWIG) - * - * swigmain.cxx - * - * This file is the main entry point to SWIG. It collects the command - * line options, registers built-in language modules, and instantiates - * a module for code generation. If adding new language modules - * to SWIG, you would modify this file. - * - * 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. - *******************************************************************************/ - -char cvsroot_swigmain_cxx[] = "$Header$"; - -#ifndef MACSWIG -#include "swigconfig.h" -#endif - -#include "swigmod.h" - -/* Module factories. These functions are used to instantiate - the built-in language modules. If adding a new language - module to SWIG, place a similar function here. Make sure - the function has "C" linkage. This is required so that modules - can be dynamically loaded in future versions. */ - -extern "C" { - Language *swig_tcl(void); - Language *swig_python(void); - Language *swig_perl5(void); - Language *swig_ruby(void); - Language *swig_guile(void); - Language *swig_mzscheme(void); - Language *swig_java(void); - Language *swig_php(void); - Language *swig_ocaml(void); - Language *swig_pike(void); - Language *swig_sexp(void); - Language *swig_xml(void); -} - -struct swig_module { - const char *name; - ModuleFactory fac; - const char *help; -}; - -/* Association of command line options to language modules. - Place an entry for new language modules here, keeping the - list sorted alphabetically. */ - -swig_module modules[] = { - {"-guile", swig_guile, "Guile"}, - {"-java", swig_java, "Java"}, - {"-mzscheme", swig_mzscheme, "Mzscheme"}, - {"-ocaml", swig_ocaml, "Ocaml"}, - {"-perl", swig_perl5, "Perl"}, - {"-perl5", swig_perl5, 0}, - {"-php", swig_php, "PHP"}, - {"-php4", swig_php, 0}, - {"-pike", swig_pike, "Pike"}, - {"-python", swig_python, "Python"}, - {"-ruby", swig_ruby, "Ruby"}, - {"-sexp", swig_sexp, "Lisp S-Expressions"}, - {"-tcl", swig_tcl, "Tcl"}, - {"-tcl8", swig_tcl, 0}, - {"-xml", swig_xml, "XML"}, - {NULL, NULL, NULL} -}; - -#ifdef MACSWIG -#include -#include -#endif - -#ifndef SWIG_LANG -#define SWIG_LANG "-python" -#endif - -//----------------------------------------------------------------- -// main() -// -// Main program. Initializes the files and starts the parser. -//----------------------------------------------------------------- - - -int main(int argc, char **argv) { - int i; - Language *dl = 0; - ModuleFactory fac = 0; - - extern int SWIG_main(int, char **, Language *); - -#ifdef MACSWIG - SIOUXSettings.asktosaveonclose = false; - argc = ccommand(&argv); -#endif - - /* Register built-in modules */ - for (i = 0; modules[i].name; i++) { - Swig_register_module(modules[i].name, modules[i].fac); - } - - Swig_init_args(argc,argv); - - /* Get options */ - for (i = 1; i < argc; i++) { - if (argv[i]) { - fac = Swig_find_module(argv[i]); - if (fac) { - dl = (fac)(); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-nolang") == 0) { - dl = new Language; - Swig_mark_arg(i); - } else if ((strcmp(argv[i],"-dnone") == 0) || - (strcmp(argv[i],"-dhtml") == 0) || - (strcmp(argv[i],"-dlatex") == 0) || - (strcmp(argv[i],"-dascii") == 0) || - (strcmp(argv[i],"-stat") == 0)) - { - Printf(stderr,"swig: Warning. %s option deprecated.\n",argv[i]); - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-help") == 0) { - Printf(stderr,"Target Language Options:\n"); - for (int j = 0; modules[j].name; j++) { - if (modules[j].help) { - Printf(stderr," %-15s - Generate %s wrappers.\n", modules[j].name, modules[j].help); - } - } - Swig_mark_arg(i); - } - } - } - if (!dl) { - fac = Swig_find_module(SWIG_LANG); - if (fac) { - dl = (fac)(); - } - } - return SWIG_main(argc,argv,dl); -} - diff --git a/Source/Modules1.1/swigmod.h b/Source/Modules1.1/swigmod.h deleted file mode 100644 index 2668b0cb5..000000000 --- a/Source/Modules1.1/swigmod.h +++ /dev/null @@ -1,255 +0,0 @@ -/* ----------------------------------------------------------------------------- - * swigmod.h - * - * Main header file for SWIG modules - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1998-2000. The University of Chicago - * Copyright (C) 1995-1998. The University of Utah and The Regents of the - * University of California. - * - * See the file LICENSE for information on usage and redistribution. - * - * $Header$ - * ----------------------------------------------------------------------------- */ - -#include -#include -#include - -#include "swigver.h" - -extern "C" { -#include "swig.h" -extern Hash *Preprocessor_define(const String_or_char *str, int swigmacro); -} - -#include "swigwarn.h" - -#define NOT_VIRTUAL 0 -#define PLAIN_VIRTUAL 1 -#define PURE_VIRTUAL 2 - -extern char *input_file; -extern int line_number; -extern int start_line; -extern int CPlusPlus; // C++ mode -extern int Extend; // Extend mode -extern int NoInclude; // NoInclude flag -extern int Verbose; -extern int IsVirtual; -extern int ImportMode; -extern int NoExcept; // -no_except option - -/* Miscellaneous stuff */ - -#define tab2 " " -#define tab4 " " -#define tab8 " " - -class Dispatcher { - public: - - virtual int emit_one(Node *n); - virtual int emit_children(Node *n); - virtual int defaultHandler(Node *n); - - /* Top of the parse tree */ - virtual int top(Node *n) = 0; - - /* SWIG directives */ - - virtual int applyDirective(Node *n); - virtual int clearDirective(Node *n); - virtual int constantDirective(Node *n); - virtual int extendDirective(Node *n); - virtual int fragmentDirective(Node *n); - virtual int importDirective(Node *n); - virtual int includeDirective(Node *n); - virtual int insertDirective(Node *n); - virtual int moduleDirective(Node *n); - virtual int nativeDirective(Node *n); - virtual int pragmaDirective(Node *n); - virtual int typemapDirective(Node *n); - virtual int typemapitemDirective(Node *n); - virtual int typemapcopyDirective(Node *n); - virtual int typesDirective(Node *n); - - /* C/C++ parsing */ - - virtual int cDeclaration(Node *n); - virtual int externDeclaration(Node *n); - virtual int enumDeclaration(Node *n); - virtual int enumvalueDeclaration(Node *n); - virtual int classDeclaration(Node *n); - virtual int classforwardDeclaration(Node *n); - virtual int constructorDeclaration(Node *n); - virtual int destructorDeclaration(Node *n); - virtual int accessDeclaration(Node *n); - virtual int usingDeclaration(Node *n); - virtual int namespaceDeclaration(Node *n); - virtual int templateDeclaration(Node *n); -}; - -/************************************************************************ - * 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. - *************************************************************************/ - -class Language : public Dispatcher { -public: - Language(); - virtual ~Language(); - virtual int emit_one(Node *n); - - /* Parse command line options */ - - virtual void main(int argc, char *argv[]); - - /* Top of the parse tree */ - - virtual int top(Node *n); - - /* SWIG directives */ - - - virtual int applyDirective(Node *n); - virtual int clearDirective(Node *n); - virtual int constantDirective(Node *n); - virtual int extendDirective(Node *n); - virtual int fragmentDirective(Node *n); - virtual int importDirective(Node *n); - virtual int includeDirective(Node *n); - virtual int insertDirective(Node *n); - virtual int moduleDirective(Node *n); - virtual int nativeDirective(Node *n); - virtual int pragmaDirective(Node *n); - virtual int typemapDirective(Node *n); - virtual int typemapcopyDirective(Node *n); - virtual int typesDirective(Node *n); - - /* C/C++ parsing */ - - virtual int cDeclaration(Node *n); - virtual int externDeclaration(Node *n); - virtual int enumDeclaration(Node *n); - virtual int enumvalueDeclaration(Node *n); - virtual int classDeclaration(Node *n); - virtual int classforwardDeclaration(Node *n); - virtual int constructorDeclaration(Node *n); - virtual int destructorDeclaration(Node *n); - virtual int accessDeclaration(Node *n); - virtual int namespaceDeclaration(Node *n); - virtual int usingDeclaration(Node *n); - - /* Function handlers */ - - virtual int functionHandler(Node *n); - virtual int globalfunctionHandler(Node *n); - virtual int memberfunctionHandler(Node *n); - virtual int staticmemberfunctionHandler(Node *n); - virtual int callbackfunctionHandler(Node *n); - - /* Variable handlers */ - - virtual int variableHandler(Node *n); - virtual int globalvariableHandler(Node *n); - virtual int membervariableHandler(Node *n); - virtual int staticmembervariableHandler(Node *n); - - /* C++ handlers */ - - virtual int memberconstantHandler(Node *n); - virtual int constructorHandler(Node *n); - virtual int copyconstructorHandler(Node *n); - virtual int destructorHandler(Node *n); - virtual int classHandler(Node *n); - - /* Miscellaneous */ - - virtual int typedefHandler(Node *n); - - /* Low-level code generation */ - - virtual int constantWrapper(Node *n); - virtual int variableWrapper(Node *n); - virtual int functionWrapper(Node *n); - virtual int nativeWrapper(Node *n); - - /* Miscellaneous */ - - virtual int validIdentifier(String *s); /* valid identifier? */ - virtual int addSymbol(String *s, Node *n); /* Add symbol */ - virtual Node *symbolLookup(String *s); /* Symbol lookup */ - virtual Node *classLookup(SwigType *s); /* Class lookup */ - - protected: - /* Patch C++ pass-by-value */ - static void patch_parms(Parm *p); - - /* Allow overloaded functions */ - void allow_overloading(int val = 1); - - /* Allow multiple-input typemaps */ - void allow_multiple_input(int val = 1); - - /* Wrapping class query */ - int is_wrapping_class(); - - /* Return the node for the current class */ - Node *getCurrentClass() const; - - /* Return the real name of the current class */ - String *getClassName() const; - - /* Return the current class prefix */ - String *getClassPrefix() const; - - /* Fully qualified type name to use */ - String *getClassType() const; - - private: - Hash *symbols; - Hash *classtypes; - int overloading; - int multiinput; -}; - -extern int SWIG_main(int, char **, Language *); -extern void emit_args(SwigType *, ParmList *, Wrapper *f); -extern void SWIG_exit(int); /* use EXIT_{SUCCESS,FAILURE} */ -extern void SWIG_config_file(const String_or_char *); -extern void SWIG_config_cppext(const char *ext); - -extern "C" void SWIG_typemap_lang(const char *); -extern void SWIG_library_directory(const char *); -extern int emit_num_arguments(ParmList *); -extern int emit_num_required(ParmList *); -extern int emit_isvarargs(ParmList *); -extern void emit_attach_parmmaps(ParmList *, Wrapper *f); -extern void emit_action(Node *n, Wrapper *f); -extern List *Swig_overload_rank(Node *n); -extern String *Swig_overload_dispatch(Node *n, const String_or_char *fmt, int *); - - -extern "C" { - typedef Language *(*ModuleFactory)(void); -} - -extern void Swig_register_module(const char *name, ModuleFactory fac); -extern ModuleFactory Swig_find_module(const char *name); - -/* swig11.h ends here */ - - - - - - - - - diff --git a/Source/Modules1.1/tcl8.cxx b/Source/Modules1.1/tcl8.cxx deleted file mode 100644 index 0f9738715..000000000 --- a/Source/Modules1.1/tcl8.cxx +++ /dev/null @@ -1,832 +0,0 @@ -/* ----------------------------------------------------------------------------- - * tcl8.cxx - * - * Tcl8.0 wrapper module. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1999-2000. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_tcl8_cxx[] = "$Header$"; - -#include "swigmod.h" - -#ifndef MACSWIG -#include "swigconfig.h" -#endif - -static const char *usage = (char*)"\ -Tcl 8 Options (available with -tcl)\n\ - -ldflags - Print runtime libraries to link with\n\ - -prefix name - Set a prefix to be appended to all names\n\ - -namespace - Build module into a Tcl 8 namespace. \n\ - -pkgversion - Set package version.\n\n"; - -static String *cmd_tab = 0; /* Table of command names */ -static String *var_tab = 0; /* Table of global variables */ -static String *const_tab = 0; /* Constant table */ -static String *methods_tab = 0; /* Methods table */ -static String *attr_tab = 0; /* Attribute table */ -static String *prefix = 0; -static String *module = 0; -static int nspace = 0; -static String *init_name = 0; -static String *ns_name = 0; -static int have_constructor; -static int have_destructor; -static String *destructor_action = 0; -static String *version = (String *) "0.0"; -static String *class_name = 0; - -static File *f_header = 0; -static File *f_wrappers = 0; -static File *f_init = 0; -static File *f_runtime = 0; - -class TCL8 : public Language { -public: - - /* ------------------------------------------------------------ - * TCL8::main() - * ------------------------------------------------------------ */ - - virtual void main(int argc, char *argv[]) { - - SWIG_library_directory("tcl"); - - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp(argv[i],"-prefix") == 0) { - if (argv[i+1]) { - prefix = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } else Swig_arg_error(); - } else if (strcmp(argv[i],"-pkgversion") == 0) { - if (argv[i+1]) { - version = NewString(argv[i+1]); - Swig_mark_arg(i); - Swig_mark_arg(i+1); - i++; - } - } else if (strcmp(argv[i],"-namespace") == 0) { - nspace = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i],"-help") == 0) { - fputs(usage,stderr); - } else if (strcmp (argv[i], "-ldflags") == 0) { - printf("%s\n", SWIG_TCL_RUNTIME); - SWIG_exit (EXIT_SUCCESS); - } - } - } - Preprocessor_define("SWIGTCL 1",0); - Preprocessor_define("SWIGTCL8 1", 0); - SWIG_typemap_lang("tcl8"); - SWIG_config_file("tcl8.swg"); - allow_overloading(); - } - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - - /* Initialize all of the output files */ - String *outfile = Getattr(n,"outfile"); - - f_runtime = NewFile(outfile,"w"); - if (!f_runtime) { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header",f_header); - Swig_register_filebyname("wrapper",f_wrappers); - Swig_register_filebyname("runtime",f_runtime); - Swig_register_filebyname("init",f_init); - - /* Initialize some variables for the object interface */ - - cmd_tab = NewString(""); - var_tab = NewString(""); - methods_tab = NewString(""); - const_tab = NewString(""); - - Swig_banner(f_runtime); - - /* Include a Tcl configuration file */ - if (NoInclude) { - Printf(f_runtime,"#define SWIG_NOINCLUDE\n"); - } - - /* Set the module name, namespace, and prefix */ - - module = NewStringf("%(lower)s", Getattr(n,"name")); - init_name = NewStringf("%(title)s_Init",module); - - ns_name = prefix ? Copy(prefix) : Copy(module); - if (prefix) Append(prefix,"_"); - - /* Generate some macros used throughout code generation */ - - Printf(f_header,"#define SWIG_init %s\n", init_name); - Printf(f_header,"#define SWIG_name \"%s\"\n", module); - if (nspace) { - Printf(f_header,"#define SWIG_prefix \"%s::\"\n", ns_name); - Printf(f_header,"#define SWIG_namespace \"%s\"\n\n", ns_name); - } else { - Printf(f_header,"#define SWIG_prefix \"%s\"\n", prefix); - } - Printf(f_header,"#define SWIG_version \"%s\"\n", version); - - Printf(cmd_tab, "\nstatic swig_command_info swig_commands[] = {\n"); - Printf(var_tab, "\nstatic swig_var_info swig_variables[] = {\n"); - Printf(const_tab, "\nstatic swig_const_info swig_constants[] = {\n"); - - Printf(f_wrappers,"#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); - - /* Start emitting code */ - Language::top(n); - - /* Done. Close up the module */ - Printv(cmd_tab, tab4, "{0, 0, 0}\n", "};\n",NIL); - Printv(var_tab, tab4, "{0,0,0,0}\n", "};\n",NIL); - Printv(const_tab, tab4, "{0,0,0,0,0,0}\n", "};\n", NIL); - - Printv(f_wrappers, cmd_tab, var_tab, const_tab,NIL); - - /* Dump the pointer equivalency table */ - SwigType_emit_type_table(f_runtime, f_wrappers); - - Printf(f_wrappers,"#ifdef __cplusplus\n}\n#endif\n"); - - /* Close the init function and quit */ - Printf(f_init,"return TCL_OK;\n}\n"); - - /* Close all of the files */ - Printv(f_runtime, f_header, f_wrappers,NIL); - Wrapper_pretty_print(f_init,f_runtime); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Close(f_runtime); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * functionWrapper() - * ------------------------------------------------------------ */ - - virtual int functionWrapper(Node *n) { - String *name = Getattr(n,"name"); /* Like to get rid of this */ - String *iname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - ParmList *parms = Getattr(n,"parms"); - String *overname = 0; - - Parm *p; - int i; - String *tm; - Wrapper *f; - String *incode, *cleanup, *outarg, *argstr, *args; - int num_arguments = 0; - int num_required = 0; - int varargs = 0; - - char source[64]; - - if (Getattr(n,"sym:overloaded")) { - overname = Getattr(n,"sym:overname"); - } else { - if (!addSymbol(iname,n)) return SWIG_ERROR; - } - - incode = NewString(""); - cleanup = NewString(""); - outarg = NewString(""); - argstr = NewString("\""); - args = NewString(""); - - f = NewWrapper(); - String *wname = Swig_name_wrapper(iname); - if (overname) { - Append(wname, overname); - } - Setattr(n,"wrap:name",wname); - - Printv(f->def, - "static int\n ", wname, "(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", - NIL); - - /* Print out variables for storing arguments. */ - emit_args(type,parms, f); - - /* Attach standard typemaps */ - emit_attach_parmmaps(parms,f); - Setattr(n,"wrap:parms",parms); - - /* Get number of require and total arguments */ - num_arguments = emit_num_arguments(parms); - num_required = emit_num_required(parms); - varargs = emit_isvarargs(parms); - - /* Unmarshal parameters */ - - for (i = 0, p = parms; i < num_arguments; i++) { - /* Skip ignored arguments */ - - while (checkAttribute(p,"tmap:in:numinputs","0")) { - p = Getattr(p,"tmap:in:next"); - } - - SwigType *pt = Getattr(p,"type"); - String *ln = Getattr(p,"lname"); - - /* Produce string representations of the source and target arguments */ - sprintf(source,"objv[%d]",i+1); - - if (i == num_required) Putc('|',argstr); - if ((tm = Getattr(p,"tmap:in"))) { - String *parse = Getattr(p,"tmap:in:parse"); - if (!parse) { - Replaceall(tm,"$target",ln); - Replaceall(tm,"$source",source); - Replaceall(tm,"$input",source); - Setattr(p,"emit:input",source); - - if (Getattr(p,"wrap:disown") || (Getattr(p,"tmap:in:disown"))) { - Replaceall(tm,"$disown","SWIG_POINTER_DISOWN"); - } else { - Replaceall(tm,"$disown","0"); - } - - Putc('o',argstr); - Printf(args,",0"); - if (i >= num_required) { - Printf(incode, "if (objc > %d) {\n", i+1); - } - Printf(incode,"%s\n", tm); - if (i >= num_required) { - Printf(incode, "}\n"); - } - } else { - Printf(argstr,"%s",parse); - Printf(args,",&%s",ln); - if (Strcmp(parse,"p") == 0) { - SwigType *lt = SwigType_ltype(pt); - SwigType_remember(pt); - if (Cmp(lt,"p.void") == 0) { - Printf(args,",0"); - } else { - Printf(args,",SWIGTYPE%s", SwigType_manglestr(pt)); - } - Delete(lt); - } - } - p = Getattr(p,"tmap:in:next"); - continue; - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, - "Unable to use type %s as a function argument.\n", SwigType_str(pt,0)); - } - p = nextSibling(p); - } - - if (!varargs) { - Putc(':',argstr); - } else { - Putc(';',argstr); - /* If variable length arguments we need to emit the in typemap here */ - if (p && (tm = Getattr(p,"tmap:in"))) { - sprintf(source,"objv[%d]", i+1); - Printf(incode,"if (objc > %d) {\n", i); - Replaceall(tm,"$input",source); - Printv(incode,tm,"\n", NIL); - Printf(incode,"}\n"); - } - } - - Printf(argstr,"%s\"",usage_string(Char(iname),type,parms)); - - Printv(f->code, - "if (SWIG_GetArgs(interp, objc, objv,", argstr, args, ") == TCL_ERROR) SWIG_fail;\n", - NIL); - - Printv(f->code,incode,NIL); - - /* Insert constraint checking code */ - for (p = parms; p;) { - if ((tm = Getattr(p,"tmap:check"))) { - Replaceall(tm,"$target",Getattr(p,"lname")); - Printv(f->code,tm,"\n",NIL); - p = Getattr(p,"tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - for (i = 0, p = parms; p; i++) { - if ((tm = Getattr(p,"tmap:freearg"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Printv(cleanup,tm,"\n",NIL); - p = Getattr(p,"tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - for (i=0,p = parms; p;i++) { - if ((tm = Getattr(p,"tmap:argout"))) { - Replaceall(tm,"$source",Getattr(p,"lname")); - Replaceall(tm,"$target","(Tcl_GetObjResult(interp))"); - Replaceall(tm,"$result","(Tcl_GetObjResult(interp))"); - Replaceall(tm,"$arg",Getattr(p,"emit:input")); - Replaceall(tm,"$input",Getattr(p,"emit:input")); - Printv(outarg,tm,"\n",NIL); - p = Getattr(p,"tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - /* Now write code to make the function call */ - emit_action(n,f); - - /* Need to redo all of this code (eventually) */ - - /* Return value if necessary */ - if ((tm = Swig_typemap_lookup_new("out",n,"result",0))) { - Replaceall(tm,"$source", "result"); - Replaceall(tm,"$target", "Tcl_GetObjResult(interp)"); - Replaceall(tm,"$result", "Tcl_GetObjResult(interp)"); - Printf(f->code,"%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, - "Unable to use return type %s in function %s.\n", SwigType_str(type,0), name); - } - - /* Dump output argument code */ - Printv(f->code,outarg,NIL); - - /* Dump the argument cleanup code */ - Printv(f->code,cleanup,NIL); - - /* Look for any remaining cleanup */ - if (Getattr(n,"feature:new")) { - if ((tm = Swig_typemap_lookup_new("newfree",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n", tm); - } - } - - if ((tm = Swig_typemap_lookup_new("ret",n,"result",0))) { - Replaceall(tm,"$source","result"); - Printf(f->code,"%s\n", tm); - } - Printv(f->code, "return TCL_OK;\n", NIL); - Printv(f->code, "fail:\n", cleanup, "return TCL_ERROR;\n", NIL); - Printv(f->code,"}\n", NIL); - - /* Substitute the cleanup code */ - Replaceall(f->code,"$cleanup",cleanup); - Replaceall(f->code,"$symname", iname); - - /* Dump out the function */ - Wrapper_print(f,f_wrappers); - - if (!Getattr(n,"sym:overloaded")) { - /* Register the function with Tcl */ - Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", Swig_name_wrapper(iname), ", NULL},\n", NIL); - } else { - if (!Getattr(n,"sym:nextSibling")) { - /* Emit overloading dispatch function */ - - int maxargs; - String *dispatch = Swig_overload_dispatch(n,"return %s(clientData, interp, objc, objv);",&maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *df = NewWrapper(); - String *dname = Swig_name_wrapper(iname); - - Printv(df->def, - "static int\n", dname, - "(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", - NIL); - Printf(df->code,"Tcl_Obj *CONST *argv = objv+1;\n"); - Printf(df->code,"int argc = objc-1;\n"); - Printv(df->code,dispatch,"\n",NIL); - Printf(df->code,"Tcl_SetResult(interp,(char *) \"No matching function for overloaded '%s'\", TCL_STATIC);\n", iname); - Printf(df->code,"return TCL_ERROR;\n"); - Printv(df->code,"}\n",NIL); - Wrapper_print(df,f_wrappers); - Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", dname, ", NULL},\n", NIL); - DelWrapper(df); - Delete(dispatch); - Delete(dname); - } - } - - Delete(incode); - Delete(cleanup); - Delete(outarg); - Delete(argstr); - Delete(args); - DelWrapper(f); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * variableWrapper() - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *t = Getattr(n,"type"); - - String *setname = 0; - String *getname = 0; - Wrapper *setf = 0, *getf = 0; - int readonly = 0; - String *tm; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - /* Create a function for getting a variable */ - getf = NewWrapper(); - getname = Swig_name_wrapper(Swig_name_get(iname)); - Printv(getf->def,"static char *",getname,"(ClientData clientData, Tcl_Interp *interp, char *name1, char *name2, int flags) {",NIL); - Wrapper_add_local(getf,"value", "Tcl_Obj *value = 0"); - - if ((tm = Swig_typemap_lookup_new("varout",n,name,0))) { - Replaceall(tm,"$source", name); - Replaceall(tm,"$target","value"); - Replaceall(tm,"$result", "value"); - Printf(getf->code, "%s\n",tm); - Printf(getf->code, "if (value) {\n"); - Printf(getf->code, "Tcl_SetVar2(interp,name1,name2,Tcl_GetStringFromObj(value,NULL), flags);\n"); - Printf(getf->code, "Tcl_DecrRefCount(value);\n"); - Printf(getf->code, "}\n"); - Printf(getf->code, "return NULL;\n"); - Printf(getf->code,"}\n"); - Wrapper_print(getf,f_wrappers); - } else { - Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, - "Can't link to variable of type %s\n", SwigType_str(t,0)); - DelWrapper(getf); - return SWIG_NOWRAP; - } - DelWrapper(getf); - - /* Try to create a function setting a variable */ - if (!Getattr(n,"feature:immutable")) { - setf = NewWrapper(); - setname = Swig_name_wrapper(Swig_name_set(iname)); - Printv(setf->def,"static char *",setname, "(ClientData clientData, Tcl_Interp *interp, char *name1, char *name2, int flags) {",NIL); - Wrapper_add_local(setf,"value", "Tcl_Obj *value = 0"); - Wrapper_add_local(setf,"name1o", "Tcl_Obj *name1o = 0"); - - if ((tm = Swig_typemap_lookup_new("varin", n, name, 0))) { - Replaceall(tm,"$source","value"); - Replaceall(tm,"$target",name); - Replaceall(tm,"$input", "value"); - Printf(setf->code,"name1o = Tcl_NewStringObj(name1,-1);\n"); - Printf(setf->code,"value = Tcl_ObjGetVar2(interp, name1o, 0, flags);\n"); - Printf(setf->code,"Tcl_DecrRefCount(name1o);\n"); - Printf(setf->code,"if (!value) return NULL;\n"); - Printf(setf->code,"%s\n", tm); - Printf(setf->code,"return NULL;\n"); - Printf(setf->code,"}\n"); - if (setf) Wrapper_print(setf,f_wrappers); - } else { - Swig_warning(WARN_TYPEMAP_VARIN_UNDEF,input_file, line_number, - "Variable %s will be read-only without a varin typemap.\n", name); - readonly = 1; - } - DelWrapper(setf); - } - - Printv(var_tab, tab4,"{ SWIG_prefix \"", iname, "\", 0, (swig_variable_func) ", getname, ",", NIL); - if (readonly || Getattr(n,"feature:immutable")) { - static int readonlywrap = 0; - if (!readonlywrap) { - Wrapper *ro = NewWrapper(); - Printf(ro->def, "static const char *swig_readonly(ClientData clientData, Tcl_Interp *interp, char *name1, char *name2, int flags) {"); - Printv(ro->code, "return (char*) \"Variable is read-only\";\n", "}\n", NIL); - Wrapper_print(ro,f_wrappers); - readonlywrap = 1; - DelWrapper(ro); - } - Printf(var_tab, "(swig_variable_func) swig_readonly},\n"); - } else { - Printv(var_tab, "(swig_variable_func) ", setname, "},\n",NIL); - } - Delete(setname); - Delete(getname); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - String *name = Getattr(n,"name"); - String *iname = Getattr(n,"sym:name"); - SwigType *type = Getattr(n,"type"); - String *value = Getattr(n,"value"); - String *tm; - - if (!addSymbol(iname,n)) return SWIG_ERROR; - - /* Special hook for member pointer */ - if (SwigType_type(type) == T_MPOINTER) { - String *wname = Swig_name_wrapper(iname); - Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type,wname), value); - value = Char(wname); - } - if ((tm = Swig_typemap_lookup_new("consttab",n,name,0))) { - Replaceall(tm,"$source",value); - Replaceall(tm,"$target",name); - Replaceall(tm,"$value",value); - Printf(const_tab,"%s,\n", tm); - } else if ((tm = Swig_typemap_lookup_new("constcode", n, name, 0))) { - Replaceall(tm,"$source", value); - Replaceall(tm,"$target", name); - Replaceall(tm,"$value",value); - Printf(f_init, "%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, - input_file, line_number, "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * nativeWrapper() - * ------------------------------------------------------------ */ - - virtual int nativeWrapper(Node *n) { - String *name = Getattr(n,"sym:name"); - String *funcname = Getattr(n,"wrap:name"); - if (!addSymbol(funcname,n)) return SWIG_ERROR; - - Printf(f_init,"\t Tcl_CreateObjCommand(interp, SWIG_prefix \"%s\", (swig_wrapper_func) %s, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);\n",name, funcname); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * classHandler() - * ------------------------------------------------------------ */ - - virtual int classHandler(Node *n) { - - String *mangled_classname = 0; - String *real_classname = 0; - - have_constructor = 0; - have_destructor = 0; - destructor_action = 0; - - class_name = Getattr(n,"sym:name"); - if (!addSymbol(class_name,n)) return SWIG_ERROR; - - real_classname = Getattr(n,"name"); - mangled_classname = Swig_name_mangle(real_classname); - - attr_tab = NewString(""); - Printf(attr_tab, "static swig_attribute swig_"); - Printv(attr_tab, mangled_classname, "_attributes[] = {\n", NIL); - - methods_tab = NewStringf(""); - Printf(methods_tab,"static swig_method swig_"); - Printv(methods_tab, mangled_classname, "_methods[] = {\n", NIL); - - /* Generate normal wrappers */ - Language::classHandler(n); - - SwigType *t = Copy(Getattr(n,"name")); - SwigType_add_pointer(t); - - // Catch all: eg. a class with only static functions and/or variables will not have 'remembered' - // SwigType_remember(t); - String *wrap_class = NewStringf("&_wrap_class_%s", mangled_classname); - SwigType_remember_clientdata(t,wrap_class); - - // t = Copy(Getattr(n,"classtype")); - // SwigType_add_pointer(t); - - String *rt = Copy(Getattr(n,"classtype")); - SwigType_add_pointer(rt); - - // Register the class structure with the type checker - /* Printf(f_init,"SWIG_TypeClientData(SWIGTYPE%s, (void *) &_wrap_class_%s);\n", SwigType_manglestr(t), mangled_classname); */ - if (have_destructor) { - Printv(f_wrappers, "static void swig_delete_", class_name, "(void *obj) {\n", NIL); - if (destructor_action) { - Printv(f_wrappers, SwigType_str(rt,"arg1"), " = (", SwigType_str(rt,0), ") obj;\n", NIL); - Printv(f_wrappers, destructor_action, NIL); - } else { - if (CPlusPlus) { - Printv(f_wrappers," delete (", SwigType_str(rt,0), ") obj;\n",NIL); - } else { - Printv(f_wrappers," free((char *) obj);\n",NIL); - } - } - Printf(f_wrappers,"}\n"); - } - - Printf(methods_tab, " {0,0}\n};\n"); - Printv(f_wrappers,methods_tab,NIL); - - Printf(attr_tab, " {0,0,0}\n};\n"); - Printv(f_wrappers,attr_tab,NIL); - - /* Handle inheritance */ - - String *base_class = NewString(""); - List *baselist = Getattr(n,"bases"); - if (baselist && Len(baselist)) { - Node *base = Firstitem(baselist); - while (base) { - String *bname = Getattr(base, "name"); - if ((!bname) || Getattr(base,"feature:ignore") || (!Getattr(base,"module"))) { - base = Nextitem(baselist); - continue; - } - String *bmangle = Swig_name_mangle(bname); - Printv(f_wrappers,"extern swig_class _wrap_class_", bmangle, ";\n", NIL); - Printf(base_class,"&_wrap_class_%s",bmangle); - base = Nextitem(baselist); - Putc(',',base_class); - Delete(bmangle); - } - } - - Printv(f_wrappers,"static swig_class *swig_",mangled_classname,"_bases[] = {", base_class,"0};\n", NIL); - Delete(base_class); - - Printv(f_wrappers, "swig_class _wrap_class_", mangled_classname, " = { \"", class_name, - "\", &SWIGTYPE", SwigType_manglestr(t), ",",NIL); - - if (have_constructor) { - Printf(f_wrappers,"%s", Swig_name_wrapper(Swig_name_construct(class_name))); - } else { - Printf(f_wrappers,"0"); - } - if (have_destructor) { - Printv(f_wrappers, ", swig_delete_", class_name,NIL); - } else { - Printf(f_wrappers,",0"); - } - Printv(f_wrappers, ", swig_", mangled_classname, "_methods, swig_", mangled_classname, "_attributes, swig_", mangled_classname,"_bases };\n", NIL); - Printv(cmd_tab, tab4, "{ SWIG_prefix \"", class_name, "\", (swig_wrapper_func) SWIG_ObjectConstructor, &_wrap_class_", mangled_classname, "},\n", NIL); - Delete(t); - Delete(mangled_classname); - return SWIG_OK; - } - - - /* ------------------------------------------------------------ - * memberfunctionHandler() - * ------------------------------------------------------------ */ - - virtual int memberfunctionHandler(Node *n) { - String *name = Getattr(n,"name"); - String *iname = GetChar(n,"sym:name"); - - String *realname, *rname; - - Language::memberfunctionHandler(n); - - realname = iname ? iname : name; - rname = Swig_name_wrapper(Swig_name_member(class_name, realname)); - if (!Getattr(n,"sym:nextSibling")) { - Printv(methods_tab, tab4, "{\"", realname, "\", ", rname, "}, \n", NIL); - } - Delete(rname); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * membervariableHandler() - * ------------------------------------------------------------ */ - - virtual int membervariableHandler(Node *n) { - String *symname = Getattr(n,"sym:name"); - String *rname; - - Language::membervariableHandler(n); - Printv(attr_tab, tab4, "{ \"-", symname, "\",", NIL); - rname = Swig_name_wrapper(Swig_name_get(Swig_name_member(class_name,symname))); - Printv(attr_tab, rname, ", ", NIL); - Delete(rname); - if (!Getattr(n,"feature:immutable")) { - rname = Swig_name_wrapper(Swig_name_set(Swig_name_member(class_name,symname))); - Printv(attr_tab, rname, "},\n",NIL); - Delete(rname); - } else { - Printf(attr_tab, "0 },\n"); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constructorHandler() - * ------------------------------------------------------------ */ - - virtual int constructorHandler(Node *n) { - Language::constructorHandler(n); - have_constructor = 1; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * destructorHandler() - * ------------------------------------------------------------ */ - - virtual int destructorHandler(Node *n) { - Language::destructorHandler(n); - have_destructor = 1; - destructor_action = Getattr(n,"wrap:action"); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * validIdentifier() - * ------------------------------------------------------------ */ - - virtual int validIdentifier(String *s) { - if (Strchr(s,' ')) return 0; - return 1; - } - - /* ------------------------------------------------------------ - * usage_string() - * ------------------------------------------------------------ */ - - char * - usage_string(char *iname, SwigType *, ParmList *l) { - static String *temp = 0; - Parm *p; - int i, numopt,pcount; - - if (!temp) temp = NewString(""); - Clear(temp); - if (nspace) { - Printf(temp,"%s::%s", ns_name,iname); - } else { - Printf(temp,"%s ", iname); - } - /* Now go through and print parameters */ - i = 0; - pcount = ParmList_len(l); - numopt = 0; /*check_numopt(l); */ - for (p = l; p; p = nextSibling(p)) { - - SwigType *pt = Getattr(p,"type"); - String *pn = Getattr(p,"name"); - /* Only print an argument if not ignored */ - if (!checkAttribute(p,"tmap:in:numinputs","0")) { - if (i >= (pcount-numopt)) - Putc('?',temp); - if (Len(pn) > 0) { - Printf(temp, "%s",pn); - } else { - Printf(temp,"%s", SwigType_str(pt,0)); - } - if (i >= (pcount-numopt)) Putc('?',temp); - Putc(' ',temp); - i++; - } - } - return Char(temp); - } -}; - -/* ---------------------------------------------------------------------- - * swig_tcl() - Instantiate module - * ---------------------------------------------------------------------- */ - -extern "C" Language * -swig_tcl(void) { - return new TCL8(); -} - - - - diff --git a/Source/Modules1.1/typepass.cxx b/Source/Modules1.1/typepass.cxx deleted file mode 100644 index 3e4f74338..000000000 --- a/Source/Modules1.1/typepass.cxx +++ /dev/null @@ -1,966 +0,0 @@ -/* ----------------------------------------------------------------------------- - * typepass.cxx - * - * This module builds all of the internal type information by collecting - * typedef declarations as well as registering classes, structures, and unions. - * This information is needed to correctly handle shadow classes and other - * advanced features. This phase of compilation is also used to perform - * type-expansion. All types are fully qualified with namespace prefixes - * and other information needed for compilation. - * - * This module also handles the %varargs directive by looking for - * "feature:varargs" and substituting ... with an alternative set of - * arguments. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 1998-2002. The University of Chicago - * Copyright (C) 1995-1998. The University of Utah and The Regents of the - * University of California. - * - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_typepass_cxx[] = "$Header$"; - -#include "swigmod.h" - -struct normal_node { - Symtab *symtab; - Hash *typescope; - List *normallist; - normal_node *next; -}; - -static normal_node *patch_list = 0; - -class TypePass : public Dispatcher { - Node *inclass; - Node *module; - int importmode; - String *nsname; - Hash *classhash; - List *normalize; - - /* Normalize a type. Replaces type with fully qualified version */ - - void normalize_type(SwigType *ty) { - SwigType *qty; - /*qty = Swig_symbol_type_qualify(ty,0);*/ - /* if (SwigType_istemplate(ty)) { - qty = Swig_symbol_type_qualify(ty,0); - Clear(ty); - Append(ty,qty); - } - */ - - if (CPlusPlus) { - Replaceall(ty,"struct ",""); - Replaceall(ty,"union ",""); - Replaceall(ty,"class ",""); - } - - qty = SwigType_typedef_qualified(ty); - /* Printf(stdout,"%s --> %s\n", ty, qty);*/ - Clear(ty); - Append(ty,qty); - Delete(qty); - } - - /* Normalize a parameter list */ - - void normalize_parms(ParmList *p) { - while (p) { - SwigType *ty = Getattr(p,"type"); - normalize_type(ty); - String *value = Getattr(p,"value"); - if (value) { - Node *n = Swig_symbol_clookup(value,0); - if (n) { - String *q = Swig_symbol_qualified(n); - if (q && Len(q)) { - String *vb = Swig_scopename_last(value); - Clear(value); - Printf(value,"%s::%s", SwigType_namestr(q), vb); - Delete(q); - } - } - } - if (value && SwigType_istemplate(value)) { - String *nv = SwigType_namestr(value); - Setattr(p,"value",nv); - } - p = nextSibling(p); - } - } - - void normalize_later(ParmList *p) { - while (p) { - SwigType *ty = Getattr(p,"type"); - Append(normalize,ty); - p = nextSibling(p); - } - } - - /* Walk through entries in normalize list and patch them up */ - void normalize_list() { - Hash *currentsym = Swig_symbol_current(); - - normal_node *nn = patch_list; - normal_node *np; - while (nn) { - Swig_symbol_setscope(nn->symtab); - SwigType_set_scope(nn->typescope); - SwigType *t; - for (t = Firstitem(nn->normallist); t; t = Nextitem(nn->normallist)) { - normalize_type(t); - } - Delete(nn->normallist); - np = nn->next; - delete(nn); - nn = np; - } - Swig_symbol_setscope(currentsym); - } - - /* generate C++ inheritance type-relationships */ - void cplus_inherit_types(Node *first, Node *cls, String *clsname, String *cast = 0) { - - if (first == cls) return; /* The Marcelo check */ - if (!cls) cls = first; - - List *ilist = Getattr(cls,"bases"); - if (!ilist) { - List *nlist = Getattr(cls,"baselist"); - if (nlist) { - int len = Len(nlist); - int i; - for (i = 0; i < len; i++) { - Node *bcls = 0; - int clsforward = 0; - String *bname = Getitem(nlist,i); - String *sname = bname; - String *tname = 0; - - /* Try to locate the base class. We look in the symbol table and we chase - typedef declarations to get to the base class if necessary */ - Symtab *st = Getattr(cls,"sym:symtab"); - - if (SwigType_istemplate(bname)) { - tname = SwigType_typedef_resolve_all(bname); - sname = tname; - } - while (1) { - String *qsname = SwigType_typedef_qualified(sname); - bcls = Swig_symbol_clookup(qsname,st); - Delete(qsname); - if (bcls) { - if (Strcmp(nodeType(bcls),"class") != 0) { - /* Not a class. The symbol could be a typedef. */ - if (checkAttribute(bcls,"storage","typedef")) { - SwigType *decl = Getattr(bcls,"decl"); - if (!decl || !(Len(decl))) { - sname = Getattr(bcls,"type"); - st = Getattr(bcls,"sym:symtab"); - if (SwigType_istemplate(sname)) { - if (tname) Delete(tname); - tname = SwigType_typedef_resolve_all(sname); - sname = tname; - } - continue; - } - } - if (Strcmp(nodeType(bcls),"classforward") != 0) { - Swig_error(Getfile(bname),Getline(bname),"'%s' is not a class. \n",bname); - } else { - Swig_warning(WARN_TYPE_INCOMPLETE,Getfile(bname),Getline(bname),"Base class '%s' is incomplete.\n", bname); - clsforward = 1; - } - bcls = 0; - } else { - if (Getattr(bcls,"typepass:visit")) { - if (!ilist) ilist = NewList(); - Append(ilist,bcls); - } else { - Swig_error(Getfile(bcls),Getline(bcls),"class '%s' must be defined before it is used as a base class.\n", bname); - } - } - } - break; - } - - if (tname) Delete(tname); - if (!bcls) { - if (!clsforward) { - if (!Getmeta(bname,"already_warned")) { - Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname),Getline(bname),"Nothing known about class '%s'. Ignored.\n", SwigType_namestr(bname)); - if (Strchr(bname,'<')) { - Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Maybe you forgot to instantiate '%s' using %%template.\n", SwigType_namestr(bname)); - } - Setmeta(bname,"already_warned","1"); - } - } - SwigType_inherit(clsname,bname, cast); - } - } - } - if (ilist) { - Setattr(cls,"bases",ilist); - } - } - if (!ilist) return; - int len = Len(ilist); - int i; - for (i = 0; i < len; i++) { - Node *n = Getitem(ilist,i); - String *bname = Getattr(n,"name"); - Node *bclass = n; /* Getattr(n,"class"); */ - Hash *scopes = Getattr(bclass,"typescope"); - SwigType_inherit(clsname,bname, cast); - if (!importmode) { - String *btype = Copy(bname); - SwigType_add_pointer(btype); - SwigType_remember(btype); - Delete(btype); - } - if (scopes) { - SwigType_inherit_scope(scopes); - } - /* Set up inheritance in the symbol table */ - Symtab *s = Swig_symbol_current(); - Symtab *st = Getattr(cls,"symtab"); - Swig_symbol_setscope(st); - Swig_symbol_inherit(Getattr(bclass,"symtab")); - Swig_symbol_setscope(s); - - /* Recursively hit base classes */ - String *newcast = NewStringf("(%s *)%s", SwigType_namestr(Getattr(bclass,"name")), cast); - cplus_inherit_types(first,bclass,clsname, newcast); - Delete(newcast); - } - } - - /* Clean overloaded list. Removes templates, friends, ignored, and errors */ - - void clean_overloaded(Node *n) { - Node *nn = Getattr(n,"sym:overloaded"); - Node *first = 0; - int cnt = 0; - while (nn) { - if ((Strcmp(nodeType(nn),"template") == 0) || - (Getattr(nn,"feature:ignore")) || - (Getattr(nn,"error")) || - ((Strcmp(nodeType(nn),"using") == 0) && !firstChild(nn)) || - (checkAttribute(nn,"storage","friend"))) { - /* Remove from overloaded list */ - Node *ps = Getattr(nn,"sym:previousSibling"); - Node *ns = Getattr(nn,"sym:nextSibling"); - if (ps) { - Setattr(ps,"sym:nextSibling",ns); - } - if (ns) { - Setattr(ns,"sym:previousSibling",ps); - } - Delattr(nn,"sym:previousSibling"); - Delattr(nn,"sym:nextSibling"); - Delattr(nn,"sym:overloaded"); - nn = ns; - continue; - } else if ((Strcmp(nodeType(nn),"using") == 0)) { - /* A possibly dangerous parse tree hack. We're going to - cut the parse tree node out and stick in the resolved - using declarations */ - - Node *ps = Getattr(nn,"sym:previousSibling"); - Node *ns = Getattr(nn,"sym:nextSibling"); - Node *un = firstChild(nn); - Node *pn = un; - - if (!first) { - first = un; - } - while (pn) { - Node *ppn = Getattr(pn,"sym:nextSibling"); - Setattr(pn,"sym:overloaded",first); - Setattr(pn,"sym:overname", NewStringf("%s_%d", Getattr(nn,"sym:overname"), cnt++)); - if (ppn) pn = ppn; - else break; - } - if (ps) { - Setattr(ps,"sym:nextSibling",un); - Setattr(un,"sym:previousSibling",ps); - } - if (ns) { - Setattr(ns,"sym:previousSibling", pn); - Setattr(pn,"sym:nextSibling",ns); - } - if (!first) { - first = un; - Setattr(nn,"sym:overloaded",first); - } - } else { - if (!first) first = nn; - Setattr(nn,"sym:overloaded",first); - } - nn = Getattr(nn,"sym:nextSibling"); - } - if (!first || (first && !Getattr(first,"sym:nextSibling"))) { - Delattr(n,"sym:overloaded"); - } - } - -public: - - /* ------------------------------------------------------------ - * top() - * ------------------------------------------------------------ */ - - virtual int top(Node *n) { - importmode = 0; - module = Getattr(n,"module"); - inclass = 0; - normalize = 0; - nsname = 0; - classhash = Getattr(n,"classes"); - emit_children(n); - normalize_list(); - SwigType_set_scope(0); - return SWIG_OK; - } - - - /* ------------------------------------------------------------ - * moduleDirective() - * ------------------------------------------------------------ */ - - virtual int moduleDirective(Node *n) { - if (!module) { - module = n; - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * importDirective() - * ------------------------------------------------------------ */ - - virtual int importDirective(Node *n) { - String *oldmodule = module; - int oldimport = importmode; - importmode = 1; - module = 0; - emit_children(n); - importmode = oldimport; - module = oldmodule; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * includeDirective() - * externDirective() - * extendDirective() - * ------------------------------------------------------------ */ - - virtual int includeDirective(Node *n) { return emit_children(n); } - virtual int externDeclaration(Node *n) { return emit_children(n); } - virtual int extendDirective(Node *n) { return emit_children(n); } - - /* ------------------------------------------------------------ - * classDeclaration() - * ------------------------------------------------------------ */ - - virtual int classDeclaration(Node *n) { - String *name = Getattr(n,"name"); - String *tdname = Getattr(n,"tdname"); - String *unnamed = Getattr(n,"unnamed"); - String *storage = Getattr(n,"storage"); - String *kind = Getattr(n,"kind"); - Node *oldinclass = inclass; - List *olist = normalize; - Symtab *symtab; - String *nname = 0; - String *fname = 0; - String *scopename = 0; - - normalize = NewList(); - - if (name) { - - if (SwigType_istemplate(name)) { - // We need to fully resolve the name to make templates work correctly */ - Node *cn; - fname = SwigType_typedef_resolve_all(name); - if (Strcmp(fname,name) != 0) { - cn = Swig_symbol_clookup_local(fname,0); - if ((!cn) || (Strcmp(nodeType(cn),"template") == 0)) { - Swig_symbol_cadd(fname,n); - SwigType_typedef_class(fname); - scopename = Copy(fname); - } else { - Swig_warning(WARN_TYPE_REDEFINED,Getfile(n),Getline(n),"Template '%s' was already wrapped as '%s' at %s:%d.\n", - SwigType_namestr(name), SwigType_namestr(Getattr(cn,"name")), Getfile(cn), Getline(cn)); - scopename = 0; - } - } else { - Swig_symbol_cadd(fname,n); - SwigType_typedef_class(fname); - scopename = Copy(fname); - } - } else { - if ((CPlusPlus) || (unnamed)) { - SwigType_typedef_class(name); - } else { - SwigType_typedef_class(NewStringf("%s %s", kind, name)); - } - scopename = Copy(name); - } - } else { - scopename = 0; - } - - Setattr(n,"typepass:visit","1"); - - /* Need to set up a typedef if unnamed */ - if (unnamed && tdname && (Cmp(storage,"typedef") == 0)) { - SwigType_typedef(unnamed,tdname); - } - - if (nsname) { - nname = NewStringf("%s::%s", nsname, name); - } - SwigType_new_scope(scopename); - SwigType_attach_symtab(Getattr(n,"symtab")); - - /* Inherit type definitions into the class */ - if (name) { - cplus_inherit_types(n, 0, nname ? nname : (fname ? fname : name)); - } - - inclass = n; - symtab = Swig_symbol_setscope(Getattr(n,"symtab")); - emit_children(n); - Swig_symbol_setscope(symtab); - - Hash *ts = SwigType_pop_scope(); - Setattr(n,"typescope",ts); - Setattr(n,"module",module); - - /* Normalize deferred types */ - { - normal_node *nn = new normal_node(); - nn->normallist = normalize; - nn->symtab = Getattr(n,"symtab"); - nn->next = patch_list; - nn->typescope = Getattr(n,"typescope"); - patch_list = nn; - } - - normalize = olist; - - inclass = oldinclass; - - /* If in a namespace, patch the class name */ - if (nname) { - Setattr(n,"name",nname); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * namespaceDeclaration() - * ------------------------------------------------------------ */ - - virtual int templateDeclaration(Node *n) { - String *name = Getattr(n,"name"); - String *ttype = Getattr(n,"templatetype"); - if (Strcmp(ttype,"class") == 0) { - String *rname = SwigType_typedef_resolve_all(name); - SwigType_typedef_class(rname); - Delete(rname); - } else if (Strcmp(ttype,"classforward") == 0) { - String *rname = SwigType_typedef_resolve_all(name); - SwigType_typedef_class(rname); - Delete(rname); - /* SwigType_typedef_class(name);*/ - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * classforwardDeclaration() - * ------------------------------------------------------------ */ - - virtual int classforwardDeclaration(Node *n) { - - /* Temporary hack. Can't do inside a class because it breaks - C nested structure wrapping */ - - if ((!inclass) || (CPlusPlus)) { - String *name = Getattr(n,"name"); - String *nname; - SwigType_typedef_class(name); - if (nsname) { - nname = NewStringf("%s::%s", nsname, name); - Setattr(n,"name",nname); - } - - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * namespaceDeclaration() - * ------------------------------------------------------------ */ - - virtual int namespaceDeclaration(Node *n) { - Symtab *symtab; - String *name = Getattr(n,"name"); - String *alias = Getattr(n,"alias"); - List *olist = normalize; - normalize = NewList(); - if (alias) { - Typetab *ts = Getattr(n,"typescope"); - if (!ts) { - Node *ns; - /* Create a empty scope for the alias */ - ns = Getattr(n,"namespace"); - if (ns) { - SwigType_scope_alias(name, Getattr(ns,"typescope")); - } - ts = Getattr(ns,"typescope"); - Setattr(n,"typescope",ts); - } - /* Namespace alias */ - return SWIG_OK; - } else { - if (name) { - Node *nn = Swig_symbol_clookup(name,n); - Hash *ts = Getattr(nn,"typescope"); - if (!ts) { - SwigType_new_scope(name); - SwigType_attach_symtab(Getattr(n,"symtab")); - } else { - SwigType_set_scope(ts); - } - } - String *oldnsname = nsname; - nsname = Swig_symbol_qualified(Getattr(n,"symtab")); - symtab = Swig_symbol_setscope(Getattr(n,"symtab")); - emit_children(n); - Swig_symbol_setscope(symtab); - - if (name) { - Hash *ts = SwigType_pop_scope(); - Setattr(n,"typescope",ts); - } - - /* Normalize deferred types */ - { - normal_node *nn = new normal_node(); - nn->normallist = normalize; - nn->symtab = Getattr(n,"symtab"); - nn->next = patch_list; - nn->typescope = Getattr(n,"typescope"); - patch_list = nn; - } - normalize = olist; - - Delete(nsname); - nsname = oldnsname; - return SWIG_OK; - } - } - - /* ------------------------------------------------------------ - * cDeclaration() - * ------------------------------------------------------------ */ - - virtual int cDeclaration(Node *n) { - - if (NoExcept) { - Delattr(n,"throws"); - } - - /* Search for var args */ - if (Getattr(n,"feature:varargs")) { - ParmList *v = Getattr(n,"feature:varargs"); - Parm *p = Getattr(n,"parms"); - Parm *pp = 0; - while (p) { - SwigType *t = Getattr(p,"type"); - if (Strcmp(t,"v(...)") == 0) { - if (pp) { - set_nextSibling(pp,Copy(v)); - } else { - Setattr(n,"parms", Copy(v)); - } - break; - } - pp = p; - p = nextSibling(p); - } - } - - /* Normalize types. */ - SwigType *ty = Getattr(n,"type"); - normalize_type(ty); - SwigType *decl = Getattr(n,"decl"); - if (decl) { - normalize_type(decl); - } - normalize_parms(Getattr(n,"parms")); - normalize_parms(Getattr(n,"throws")); - - if (checkAttribute(n,"storage","typedef")) { - String *name = Getattr(n,"name"); - ty = Getattr(n,"type"); - decl = Getattr(n,"decl"); - SwigType *t = Copy(ty); - { - /* If the typename is qualified, make sure the scopename is fully qualified when making a typedef */ - if (Swig_scopename_check(t)) { - String *base, *prefix, *qprefix; - base = Swig_scopename_last(t); - prefix = Swig_scopename_prefix(t); - qprefix = SwigType_typedef_qualified(prefix); - Delete(t); - t = NewStringf("%s::%s", qprefix,base); - Delete(base); - Delete(prefix); - Delete(qprefix); - } - } - SwigType_push(t,decl); - if (CPlusPlus) { - Replaceall(t,"struct ",""); - Replaceall(t,"union ",""); - Replaceall(t,"class ",""); - } - SwigType_typedef(t,name); - } - /* If namespaces are active. We need to patch the name with a namespace prefix */ - if (nsname && !inclass) { - String *name = Getattr(n,"name"); - if (name) { - String *nname = NewStringf("%s::%s", nsname, name); - Setattr(n,"name", nname); - Delete(nname); - } - } - clean_overloaded(n); - return SWIG_OK; - } - - - /* ------------------------------------------------------------ - * constructorDeclaration() - * ------------------------------------------------------------ */ - - virtual int constructorDeclaration(Node *n) { - if (NoExcept) { - Delattr(n,"throws"); - } - - /* Search for var args */ - if (Getattr(n,"feature:varargs")) { - ParmList *v = Getattr(n,"feature:varargs"); - Parm *p = Getattr(n,"parms"); - Parm *pp = 0; - while (p) { - SwigType *t = Getattr(p,"type"); - if (Strcmp(t,"v(...)") == 0) { - if (pp) { - set_nextSibling(pp,Copy(v)); - } else { - Setattr(n,"parms", Copy(v)); - } - break; - } - pp = p; - p = nextSibling(p); - } - } - normalize_parms(Getattr(n,"parms")); - normalize_parms(Getattr(n,"throws")); - - /* If in a namespace, patch the class name */ - if (nsname) { - String *nname = NewStringf("%s::%s", nsname, Getattr(n,"name")); - Setattr(n,"name",nname); - } - clean_overloaded(n); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * destructorDeclaration() - * ------------------------------------------------------------ */ - - virtual int destructorDeclaration(Node *n) { - /* If in a namespace, patch the class name */ - if (nsname) { - String *nname = NewStringf("%s::%s", nsname, Getattr(n,"name")); - Setattr(n,"name",nname); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constantDirective() - * ------------------------------------------------------------ */ - - virtual int constantDirective(Node *n) { - SwigType *ty = Getattr(n,"type"); - if (ty) { - Setattr(n,"type",SwigType_typedef_qualified(ty)); - } - return SWIG_OK; - } - - - /* ------------------------------------------------------------ - * enumDeclaration() - * ------------------------------------------------------------ */ - - virtual int enumDeclaration(Node *n) { - String *name = Getattr(n,"name"); - if (name) { - SwigType *t = NewStringf("enum %s", name); - SwigType_typedef(t,name); - Delete(t); - } - emit_children(n); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * enumvalueDeclaration() - * ------------------------------------------------------------ */ - - virtual int enumvalueDeclaration(Node *n) { - String *name = Getattr(n,"name"); - String *value = Getattr(n,"value"); - if (!value) value = name; - if (Strcmp(value,name) == 0) { - String *new_value; - if ((nsname) || (inclass)) { - new_value = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); - } else { - new_value = NewString(value); - } - Setattr(n,"value",new_value); - Delete(new_value); - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * usingDeclaration() - * ------------------------------------------------------------ */ - - virtual int usingDeclaration(Node *n) { - if (Getattr(n,"namespace")) { - /* using namespace id */ - - /* For a namespace import. We set up inheritance in the type system */ - Node *ns = Getattr(n,"node"); - if (ns) { - Typetab *ts = Getattr(ns,"typescope"); - if (ts) { - SwigType_using_scope(ts); - } - } - return SWIG_OK; - } else { - Node *ns; - /* using id */ - - if (Getattr(n,"sym:symtab")) { - ns = Swig_symbol_clookup(Getattr(n,"uname"), Getattr(n,"sym:symtab")); - } else { - ns = 0; - } - if (!ns) { - if (!Getattr(n,"access") || ((Strcmp(Getattr(n,"access"),"public") == 0))) { - Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(n), Getline(n), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(n,"uname"))); - } - } else { - - /* Only a single symbol is being used. There are only a few symbols that - we actually care about. These are typedef, class declarations, and enum */ - - String *ntype = nodeType(ns); - if (Strcmp(ntype,"cdecl") == 0) { - if (checkAttribute(ns,"storage","typedef")) { - /* A typedef declaration */ - String *uname = Getattr(n,"uname"); - SwigType_typedef_using(uname); - } else { - /* A normal C declaration. */ - if ((inclass) && (!Getattr(n,"feature:ignore")) && (Getattr(n,"sym:name"))) { - Node *c = ns; - Node *unodes = 0, *last_unodes = 0; - int ccount = 0; - String *symname = Getattr(n,"sym:name"); - while (c) { - if (Strcmp(nodeType(c),"cdecl") == 0) { - if (!(checkAttribute(c,"storage","static") - || checkAttribute(c,"storage","typedef") - || checkAttribute(c,"storage","friend") - || (Getattr(c,"feature:extend") && !Getattr(c,"code")) - || Getattr(c,"feature:ignore"))) { - - String *csymname = Getattr(c,"sym:name"); - if (!csymname || (Strcmp(csymname,symname) == 0)) { - /* Check for existence in overload list already */ - { - String *decl = Getattr(c,"decl"); - Node *over = Getattr(n,"sym:overloaded"); - int match = 0; - while (over) { - String *odecl = Getattr(over,"decl"); - if (Cmp(decl, odecl) == 0) { - match = 1; - break; - } - over = Getattr(over,"sym:nextSibling"); - } - if (match) { - c = Getattr(c,"csym:nextSibling"); - continue; - } - } - Node *nn = copyNode(c); - if (!Getattr(nn,"sym:name")) Setattr(nn,"sym:name", symname); - - if (!Getattr(nn,"feature:ignore")) { - Setattr(nn,"parms",CopyParmList(Getattr(c,"parms"))); - ccount++; - if (!last_unodes) { - last_unodes = nn; - unodes = nn; - } else { - Setattr(nn,"previousSibling",last_unodes); - Setattr(last_unodes,"nextSibling", nn); - Setattr(nn,"sym:previousSibling", last_unodes); - Setattr(last_unodes,"sym:nextSibling", nn); - Setattr(nn,"sym:overloaded", unodes); - Setattr(unodes,"sym:overloaded", unodes); - last_unodes = nn; - } - } else { - Delete(nn); - } - } - } - } - c = Getattr(c,"csym:nextSibling"); - } - if (unodes) { - set_firstChild(n,unodes); - if (ccount > 1) { - if (!Getattr(n,"sym:overloaded")) { - Setattr(n,"sym:overloaded",n); - Setattr(n,"sym:overname","_SWIG_0"); - } - } - } - } - } - } else if ((Strcmp(ntype,"class") == 0) || ((Strcmp(ntype,"classforward") == 0))) { - /* We install the using class name as kind of a typedef back to the original class */ - String *uname = Getattr(n,"uname"); - /* Import into current type scope */ - SwigType_typedef_using(uname); - } else if (Strcmp(ntype,"enum") == 0) { - SwigType_typedef_using(Getattr(n,"uname")); - } - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * typemapDirective() - * ------------------------------------------------------------ */ - - virtual int typemapDirective(Node *n) { - if (inclass || nsname) { - Node *items = firstChild(n); - while (items) { - Parm *pattern = Getattr(items,"pattern"); - Parm *parms = Getattr(items,"parms"); - normalize_later(pattern); - normalize_later(parms); - items = nextSibling(items); - } - } - return SWIG_OK; - } - - - /* ------------------------------------------------------------ - * typemapcopyDirective() - * ------------------------------------------------------------ */ - - virtual int typemapcopyDirective(Node *n) { - if (inclass || nsname) { - Node *items = firstChild(n); - ParmList *pattern = Getattr(n,"pattern"); - normalize_later(pattern); - while (items) { - ParmList *npattern = Getattr(items,"pattern"); - normalize_later(npattern); - items = nextSibling(items); - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * applyDirective() - * ------------------------------------------------------------ */ - - virtual int applyDirective(Node *n) { - if (inclass || nsname) { - ParmList *pattern = Getattr(n,"pattern"); - normalize_later(pattern); - Node *items = firstChild(n); - while (items) { - Parm *apattern = Getattr(items,"pattern"); - normalize_later(apattern); - items = nextSibling(items); - } - } - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * clearDirective() - * ------------------------------------------------------------ */ - - virtual int clearDirective(Node *n) { - if (inclass || nsname) { - Node *p; - for (p = firstChild(n); p; p = nextSibling(p)) { - ParmList *pattern = Getattr(p,"pattern"); - normalize_later(pattern); - } - } - return SWIG_OK; - } -}; - -void Swig_process_types(Node *n) { - if (!n) return; - TypePass *t = new TypePass; - t->top(n); - delete t; -} - - - - - - - diff --git a/Source/Modules1.1/xml.cxx b/Source/Modules1.1/xml.cxx deleted file mode 100644 index 261f3e348..000000000 --- a/Source/Modules1.1/xml.cxx +++ /dev/null @@ -1,318 +0,0 @@ -/* ----------------------------------------------------------------------------- - * Xml.cxx - * - * A web-base parse tree Xml using SWILL. This is an optional - * feature that's normally disabled. - * - * Author(s) : David Beazley (beazley@cs.uchicago.edu) - * - * Copyright (C) 2002. The University of Chicago - * See the file LICENSE for information on usage and redistribution. - * ----------------------------------------------------------------------------- */ - -char cvsroot_xml_cxx[] = "$Header$"; -static const char *usage = "\ -XML Options (available with -xml)\n\ - -xml output.xml - Use output.xml as output file (extension .xml mandatory)\n\ - -xmllang lang - Typedef language.\n\n"; - -#include "swigmod.h" - -//static Node *view_top = 0; -static File *out = 0; - -class XML -: public Language -{ - - - -public: - - int indent_level; - long id; - XML() - : indent_level( 0 ) - , id( 0 ) - { - } - - virtual ~XML() - { - } - - virtual void main(int argc, char *argv[]) - { - SWIG_typemap_lang("xml"); - for( int iX = 0; iX < argc; iX++ ) - { - if( strcmp( argv[iX], "-xml" ) == 0 ) - { - char * extension = argv[iX+1]+strlen(argv[iX+1])-4; - if( strcmp( extension, ".xml" ) ) - continue; - iX++; - Swig_mark_arg (iX); - String * outfile = NewString( argv[iX] ); - out = NewFile(outfile,"w"); - if (!out) - { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - continue; - } - if( strcmp( argv[iX], "-xmllang" ) == 0 ) - { - Swig_mark_arg (iX); - iX++; - SWIG_typemap_lang(argv[iX]); - Swig_mark_arg (iX); - continue; - } - if( strcmp( argv[iX], "-help" ) == 0 ) - { - fputs( usage, stderr ); - } - } - } - - /* Top of the parse tree */ - - virtual int top(Node *n) - { - if( out == 0 ) - { - String *outfile = Getattr(n,"outfile"); - Replaceall(outfile,"_wrap.cxx", ".xml"); - out = NewFile(outfile,"w"); - if (!out) - { - Printf(stderr,"*** Can't open '%s'\n", outfile); - SWIG_exit(EXIT_FAILURE); - } - } - Printf( out, " \n" ); - Xml_print_tree(n); - return SWIG_OK; - } - - - - void print_indent(int l) - { - int i; - for (i = 0; i < indent_level; i++) - { - Printf(out, " "); - } - if (l) - { - Printf(out, " "); - } - } - - void Xml_print_tree(DOH *obj) - { - while (obj) - { - Xml_print_node(obj); - obj = nextSibling(obj); - } - } - - void Xml_print_attributes(Node * obj) - { - String *k; - indent_level += 4; - print_indent(0); - Printf( out, "\n", ++id, obj ); - indent_level += 4; - - k = Firstkey(obj); - while (k) - { - if ((Cmp(k,"nodeType") == 0) - || (Cmp(k,"firstChild") == 0) - || (Cmp(k,"lastChild") == 0) - || (Cmp(k,"parentNode") == 0) - || (Cmp(k,"nextSibling") == 0) - || (Cmp(k,"previousSibling") == 0) - || (*(Char(k)) == '$')) - { - /* Do nothing */ - } - else if (Cmp(k,"module") == 0) - { - Xml_print_module( Getattr(obj,k) ); - } - else if (Cmp(k,"baselist") == 0) - { - Xml_print_baselist( Getattr(obj,k) ); - } - else if (Cmp(k,"typescope") == 0) - { - Xml_print_typescope( Getattr(obj,k) ); - } - else if (Cmp(k,"typetab") == 0) - { - Xml_print_typetab( Getattr(obj,k) ); - } - else if (Cmp(k,"kwargs") == 0) - { - Xml_print_kwargs( Getattr(obj,k) ); - } - else if (Cmp(k,"parms") == 0 || Cmp(k, "pattern") == 0 ) - { - Xml_print_parmlist( Getattr(obj,k) ); - } - else - { - DOH *o; - print_indent(0); - if (DohIsString(Getattr(obj,k))) - { - o = Str(Getattr(obj,k)); - Replaceall( k, ":", "_" ); - Replaceall( o, "<", "<" ); - Replaceall( o, "&", "&" ); - Replaceall( o, "\"", """ ); - Replaceall( o, "\\", "\\\\" ); - Printf(out,"\n", k, o, ++id, o ); - Delete(o); - } - else - { - o = Getattr(obj,k); - Replaceall( k, ":", "_" ); - Printf(out,"\n", k, o, ++id, o ); - } - } - k = Nextkey(obj); - } - indent_level -= 4; - print_indent(0); - Printf( out, "\n" ); - indent_level -= 4; - } - - void Xml_print_node(Node *obj) - { - Node *cobj; - - print_indent(0); - Printf(out,"<%s id=\"%ld\" addr=\"%x\" >\n", nodeType(obj), ++id, obj); - Xml_print_attributes( obj ); - cobj = firstChild(obj); - if (cobj) - { - indent_level += 4; - Printf(out,"\n"); - Xml_print_tree(cobj); - indent_level -= 4; - } - else - { - print_indent(1); - Printf(out,"\n"); - } - print_indent(0); - Printf(out,"\n", nodeType(obj)); - } - - - void Xml_print_parmlist(ParmList *p) - { - - print_indent(0); - Printf( out, "\n", ++id, p ); - indent_level += 4; - while(p) - { - print_indent(0); - Printf( out, "\n", ++id ); - Xml_print_attributes( p ); - print_indent(0); - Printf( out, "\n" ); - p = nextSibling(p); - } - indent_level -= 4; - print_indent(0); - Printf( out, "\n" ); - } - - void Xml_print_baselist(List *p) - { - - print_indent(0); - Printf( out, "\n", ++id, p ); - indent_level += 4; - String *s; - for (s = Firstitem(p); s; s = Nextitem(p)) - { - print_indent(0); - Printf( out, "\n", s, ++id, s ); - } - indent_level -= 4; - print_indent(0); - Printf( out, "\n" ); - } - - void Xml_print_module(Node *p) - { - - print_indent(0); - Printf( out, "\n", Getattr( p, "name"), ++id, p ); - } - - void Xml_print_kwargs(Hash *p) - { - Xml_print_hash( p, "kwargs" ); - } - - void Xml_print_typescope(Hash *p) - { - - Xml_print_hash( p, "typescope" ); - } - - void Xml_print_typetab(Hash *p) - { - - Xml_print_hash( p, "typetab" ); - } - - - void Xml_print_hash(Hash *p, const char * markup) - { - - print_indent(0); - Printf( out, "<%s id=\"%ld\" addr=\"%x\" >\n", markup, ++id, p ); - Xml_print_attributes( p ); - indent_level += 4; - Node * n = Firstitem( p ); - while(n) - { - print_indent(0); - Printf( out, "<%ssitem id=\"%ld\" addr=\"%x\" >\n", markup, ++id, n ); - Xml_print_attributes( n ); - Printf( out, "\n", markup ); - print_indent(0); - Printf( out, " />\n" ); - n = Nextkey(p); - } - indent_level -= 4; - print_indent(0); - Printf( out, "\n", markup ); - } - -}; - - -extern "C" -{ - Language * swig_xml( void ) - { - return new XML(); - } -}