/******************************************************************************* * 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. *******************************************************************************/ /*********************************************************************** * $Header$ * * swig.h * * This is the header file containing the main class definitions and * declarations. Should be included in all extensions and code * modules. * ***********************************************************************/ #ifndef __swig_h_ #define __swig_h_ #include #include #include #include "swigver.h" /* Global variables. Needs to be cleaned up */ #ifdef MACSWIG #define Status Swig_Status #undef stderr #define stderr swig_log extern FILE *swig_log; #endif extern FILE *f_header; // Some commonly used extern FILE *f_wrappers; // FILE pointers extern FILE *f_init; extern FILE *f_input; extern char InitName[256]; extern char LibDir[512]; // Library directory extern char **InitNames; // List of other init functions extern int Status; // Variable creation status extern int TypeStrict; // Type checking strictness extern int Verbose; extern int yyparse(); extern int line_number; extern int start_line; extern char *input_file; // Current input file extern int CPlusPlus; // C++ mode extern int ObjC; // Objective-C mode extern int ObjCClass; // Objective-C style class extern int AddMethods; // AddMethods mode extern int NewObject; // NewObject mode extern int Inline; // Inline mode extern int NoInclude; // NoInclude flag extern char *typemap_lang; // Current language name extern int error_count; extern char *copy_string(char *); extern char output_dir[512]; // Output directory #define FatalError() if ((error_count++) > 20) { fprintf(stderr,"Confused by earlier errors. Bailing out\n"); SWIG_exit(1); } /* Miscellaneous stuff */ #define STAT_READONLY 1 #define MAXSCOPE 16 extern char* getSwigLib(); // ----------------------------------------------------------------------- // String class // ----------------------------------------------------------------------- class String { private: int maxsize; // Max size of current string void add(const char *newstr); // Function to add a new string void add(char c); // Add a character void insert(const char *newstr); int len; public: String(); String(const char *s); ~String(); char *get() const; char *str; // String data friend String& operator<<(String&,const char *s); friend String& operator<<(String&,const int); friend String& operator<<(String&,const char); friend String& operator<<(String&,String&); friend String& operator>>(const char *s, String&); friend String& operator>>(String&,String&); String& operator=(const char *); operator char*() const { return str; } void untabify(); void replace(const char *token, const char *rep); void replaceid(const char *id, const char *rep); void strip(); }; #define tab2 " " #define tab4 " " #define tab8 " " #define br "\n" #define endl "\n" #define quote "\"" // ------------------------------------------------------------------- // Hash table class // ------------------------------------------------------------------- class Hash { private: struct Node { Node(const char *k, void *obj, void (*d)(void *)) { key = new char[strlen(k)+1]; strcpy(key,k); object = obj; del_proc = d; next = 0; }; ~Node() { delete key; if (del_proc) (*del_proc)(object); }; char *key; void *object; struct Node *next; void (*del_proc)(void *); }; int h1(const char *key); // Hashing function int hashsize; // Size of hash table Node **hashtable; // Actual hash table int index; // Current index (used by iterators) Node *current; // Current item in hash table public: Hash(); ~Hash(); int add(const char *key, void *object); int add(const char *key, void *object, void (*del)(void *)); void *lookup(const char *key); void remove(const char *key); void *first(); void *next(); char *firstkey(); char *nextkey(); }; /************************************************************************ * class DataType * * Defines the basic datatypes supported by the translator. * ************************************************************************/ #define T_INT 1 #define T_SHORT 2 #define T_LONG 3 #define T_UINT 4 #define T_USHORT 5 #define T_ULONG 6 #define T_UCHAR 7 #define T_SCHAR 8 #define T_BOOL 9 #define T_DOUBLE 10 #define T_FLOAT 11 #define T_CHAR 12 #define T_USER 13 #define T_VOID 14 #define T_SYMBOL 98 #define T_ERROR 99 // These types are now obsolete, but defined for backwards compatibility #define T_SINT 90 #define T_SSHORT 91 #define T_SLONG 92 // Class for storing data types #define MAX_NAME 96 class DataType { private: static Hash *typedef_hash[MAXSCOPE]; static int scope; public: int type; // SWIG Type code char name[MAX_NAME]; // Name of type char is_pointer; // Is this a pointer? char implicit_ptr; // Implicit ptr char is_reference; // A C++ reference type char status; // Is this datatype read-only? char *qualifier; // A qualifier string (ie. const). char *arraystr; // String containing array part int id; // type identifier (unique for every type). DataType(); DataType(DataType *); DataType(int type); ~DataType(); void primitive(); // Turn a datatype into its primitive type char *print_type(); // Return string containing datatype char *print_full(); // Return string with full datatype char *print_cast(); // Return string for type casting char *print_mangle();// Return mangled version of type char *print_real(char *local=0); // Print the real datatype (as far as we can determine) char *print_arraycast(); // Prints an array cast char *print_mangle_default(); // Default mangling scheme // Array query functions int array_dimensions(); // Return number of array dimensions (if any) char *get_dimension(int); // Return string containing a particular dimension char *get_array(); // Returns the array string for a datatype // typedef support void typedef_add(char *name, int mode = 0); // Add this type to typedef list void typedef_resolve(int level = 0); // See if this type has been typedef'd void typedef_replace(); // Replace this type with it's original type static int is_typedef(char *name); // See if this is a typedef void typedef_updatestatus(int newstatus); // Change status of a typedef static void init_typedef(void); // Initialize typedef manager static void merge_scope(Hash *h); // Functions for managing scoping of datatypes static void new_scope(Hash *h = 0); static Hash *collapse_scope(char *); int check_defined(); // Check to see if type is defined by a typedef. }; #define STAT_REPLACETYPE 2 /************************************************************************ * class Parm * * Structure for holding information about function parameters * * CALL_VALUE --> Call by value even though function parameter * is a pointer. * ex : foo(&_arg0); * CALL_REF --> Call by reference even though function parameter * is by value * ex : foo(*_arg0); * ************************************************************************/ #define CALL_VALUE 0x01 #define CALL_REFERENCE 0x02 #define CALL_OUTPUT 0x04 struct Parm { DataType *t; // Datatype of this parameter int call_type; // Call type (value or reference or value) char *name; // Name of parameter (optional) char *defvalue; // Default value (as a string) int ignore; // Ignore flag char *objc_separator; // Parameter separator for Objective-C Parm(DataType *type, char *n); Parm(Parm *p); ~Parm(); }; // ------------------------------------------------------------- // class ParmList // // This class is used for manipulating parameter lists in // function and type declarations. // ------------------------------------------------------------- #define MAXPARMS 16 class ParmList { private: int maxparms; // Max parms possible in current list Parm **parms; // Pointer to parms array void moreparms(); // Increase number of stored parms int current_parm; // Internal state for get_first,get_next public: int nparms; // Number of parms in list void append(Parm *p); // Append a parameter to the end void insert(Parm *p, int pos); // Insert a parameter into the list void del(int pos); // Delete a parameter at position pos int numopt(); // Get number of optional arguments int numarg(); // Get number of active arguments Parm *get(int pos); // Get the parameter at position pos Parm &operator[](int); // An alias for get(). ParmList(); ParmList(ParmList *l); ~ParmList(); // Keep this for backwards compatibility Parm *get_first(); // Get first parameter from list Parm *get_next(); // Get next parameter from list void print_types(FILE *f); // Print list of datatypes void print_types(String &f); // Generate list of datatypes. void print_args(FILE *f); // Print argument list int check_defined(); // Checks to make sure the arguments are defined void sub_parmnames(String &s); // Remaps real parameter names in code fragment }; // Modes for different types of inheritance #define INHERIT_FUNC 0x1 #define INHERIT_VAR 0x2 #define INHERIT_CONST 0x4 #define INHERIT_ALL (INHERIT_FUNC | INHERIT_VAR | INHERIT_CONST) struct Pragma { Pragma() { next = 0; } String filename; int lineno; String lang; String name; String value; Pragma *next; }; /************************************************************************ * class language: * * This class defines the functions that need to be supported by the * scripting language being used. The translator calls these virtual * functions to output different types of code for different languages. * * By implementing this using virtual functions, hopefully it will be * easy to support different types of scripting languages. * * The following functions are used : * * parse_args(argc, argv) * Parse the arguments used by this language. * * parse() * Entry function that starts parsing of a particular language * * create_function(fname, iname, rtype, parmlist) * Creates a function wrappper. * * link_variable(vname, iname, type) * Creates a link to a variable. * * declare_const(cname, type, value) * Creates a constant (for #define). * * initialize(char *fn) * Produces initialization code. * * headers() * Produce code for headers * * close() * Close up files * * usage_var(iname,type,string) * Produces usage string for variable declaration. * * usage_func(iname,rttype, parmlist, string) * Produces usage string for function declaration. * * usage_const(iname, type, value, string) * Produces usage string for constants * * set_module(char *modname) * Sets the name of the module (%module directive) * * set_init(char *initname) * Sets name of initialization function (an alternative to set_module) * add_native(char *name, char *funcname); * Adds a native wrapper function to the initialize process * * type_mangle(DataType *t); * Mangles the name of a datatype. * --- C++ Functions --- * * These functions are optional additions to any of the target * languages. SWIG handles inheritance, symbol tables, and other * information. * * cpp_open_class(char *classname, char *rname) * Open a new C++ class definition. * cpp_close_class(char *) * Close current C++ class * cpp_member_func(char *name, char *rname, DataType *rt, ParmList *l) * Create a C++ member function * cpp_constructor(char *name, char *iname, ParmList *l) * Create a C++ constructor. * cpp_destructor(char *name, char *iname) * Create a C++ destructor * cpp_variable(char *name, char *iname, DataType *t) * Create a C++ member data item. * cpp_declare_const(char *name, char *iname, int type, char *value) * Create a C++ constant. * cpp_inherit(char *baseclass) * Inherit data from baseclass. * cpp_static_func(char *name, char *iname, DataType *t, ParmList *l) * A C++ static member function. * cpp_static_var(char *name, char *iname, DataType *t) * A C++ static member data variable. * *************************************************************************/ class Language { public: virtual void parse_args(int argc, char *argv[]) = 0; virtual void parse() = 0; virtual void create_function(char *, char *, DataType *, ParmList *) = 0; virtual void link_variable(char *, char *, DataType *) = 0; virtual void declare_const(char *, char *, DataType *, char *) = 0; virtual void initialize(void) = 0; virtual void headers(void) = 0; virtual void close(void) = 0; virtual void set_module(char *mod_name,char **mod_list) = 0; virtual void set_init(char *init_name); virtual void add_native(char *, char *); virtual char *type_mangle(DataType *t) { return t->print_mangle_default(); } virtual void add_typedef(DataType *t, char *name); virtual void create_command(char *cname, char *iname); // // C++ language extensions. // You can redefine these, or use the defaults below // virtual void cpp_member_func(char *name, char *iname, DataType *t, ParmList *l); virtual void cpp_constructor(char *name, char *iname, ParmList *l); virtual void cpp_destructor(char *name, char *newname); virtual void cpp_open_class(char *name, char *rename, char *ctype, int strip); virtual void cpp_close_class(); virtual void cpp_cleanup(); virtual void cpp_inherit(char **baseclass, int mode = INHERIT_ALL); virtual void cpp_variable(char *name, char *iname, DataType *t); virtual void cpp_static_func(char *name, char *iname, DataType *t, ParmList *l); virtual void cpp_declare_const(char *name, char *iname, DataType *type, char *value); virtual void cpp_static_var(char *name, char *iname, DataType *t); virtual void cpp_pragma(Pragma *plist); // Pragma directive virtual void pragma(char *, char *, char *); // Declaration of a class, but not a full definition virtual void cpp_class_decl(char *, char *, char *); // Import directive virtual void import(char *filename); }; class Documentation; // -------------------------------------------------------------------- // class DocEntry // // Base class for the documentation system. Basically everything is // a documentation entry of some sort. Specific derived classes // are created internally and shouldn't be accessed by third-party // modules. // -------------------------------------------------------------------- class DocEntry { public: char *name; // Name of the entry String usage; // Short description (optional) String cinfo; // Information about C interface (optional). String text; // Supporting text (optional) DocEntry *parent; // Parent of this entry (optional) DocEntry *child; // Children of this entry (optional) DocEntry *next; // Next entry (or sibling) DocEntry *previous; // Previous entry int counter; // Counter for section control int is_separator; // Is this a separator entry? int sorted; // Sorted? int line_number; // Line number int end_line; // Ending line number int format; // Format this documentation entry int print_info; // Print C information about this entry char *file; // File virtual ~DocEntry(); // Destructor (common to all subclasses) // Methods applicable to all documentation entries virtual void output(Documentation *d); void add(DocEntry *de); // Add documentation entry to the list void addchild(DocEntry *de); // Add documentation entry as a child void sort_children(); // Sort all of the children void remove(); // Remove this doc entry void parse_args(int argc, char **argv); // Parse command line options void style(char *name,char *value);// Change doc style. static DocEntry *dead_entries; // Dead documentation entries }; extern DocEntry *doc_entry; // Default DocEntry style parameters #define SWIGDEFAULT_SORT 0 #define SWIGDEFAULT_FORMAT 1 #define SWIGDEFAULT_INFO 1 // ---------------------------------------------------------------------- // Documentation module base class // // This class defines methods that need to be implemented for a // documentation module. // // title() - Print out a title entry // newsection() - Start a new section (may be nested to form subsections) // endsection() - End a section // print_decl() - Print a standard declaration // print_text() - Print standard text // init() - Initialize the documentation module // close() - Close documentation module // ---------------------------------------------------------------------- class Documentation { public: virtual void parse_args(int argc, char **argv) = 0; virtual void title(DocEntry *de) = 0; virtual void newsection(DocEntry *de, int sectnum) = 0; virtual void endsection() = 0; virtual void print_decl(DocEntry *de) = 0; virtual void print_text(DocEntry *de) = 0; virtual void separator() = 0; virtual void init(char *filename) = 0; virtual void close(void) = 0; virtual void style(char *name, char *value) = 0; }; /* Emit functions */ extern void emit_extern_var(char *, DataType *, int, FILE *); extern void emit_extern_func(char *, DataType *, ParmList *, int, FILE *); extern int emit_args(DataType *, ParmList *, FILE *); extern void emit_func_call(char *, DataType *, ParmList *, FILE *); extern void emit_hex(FILE *); extern void emit_set_get(char *, char *, DataType *); extern void emit_banner(FILE *); extern void emit_ptr_equivalence(FILE *); extern int SWIG_main(int, char **, Language *, Documentation *); extern void make_wrap_name(char *); // Some functions for emitting some C++ helper code extern void cplus_emit_member_func(char *classname, char *classtype, char *classrename, char *mname, char *mrename, DataType *type, ParmList *l, int mode); extern void cplus_emit_static_func(char *classname, char *classtype, char *classrename, char *mname, char *mrename, DataType *type, ParmList *l, int mode); extern void cplus_emit_destructor(char *classname, char *classtype, char *classrename, char *name, char *iname, int mode); extern void cplus_emit_constructor(char *classname, char *classtype, char *classrename, char *name, char *iname, ParmList *l, int mode); extern void cplus_emit_variable_get(char *classname, char *classtype, char *classrename, char *name, char *iname, DataType *type, int mode); extern void cplus_emit_variable_set(char *classname, char *classtype, char *classrename, char *name, char *iname, DataType *type, int mode); extern char *cplus_base_class(char *name); extern void cplus_support_doc(String &f); /* Function for building search directories */ extern void add_directory(char *dirname); extern int insert_file(char *, FILE *); extern int get_file(char *filename, String &str); extern int checkout_file(char *filename, char *dest); extern int checkin_file(char *dir, char *lang, char *source, char *dest); extern int include_file(char *filename); /* Miscellaneous */ extern void check_options(); extern void init_args(int argc, char **); extern void mark_arg(int n); extern void arg_error(); extern void library_add(char *name); extern void library_insert(); // ----------------------------------------------------------------------- // Class for Creating Wrapper Functions // ----------------------------------------------------------------------- class WrapperFunction { private: Hash h; public: String def; String locals; String code; String init; void print(FILE *f); void print(String &f); void add_local(char *type, char *name, char *defvalue = 0); char *new_local(char *type, char *name, char *defvalue = 0); static void del_type(void *obj); }; extern int emit_args(DataType *, ParmList *, WrapperFunction &f); extern void emit_func_call(char *, DataType *, ParmList *, WrapperFunction &f); extern void SWIG_exit(int); // Symbol table management extern int add_symbol(char *, DataType *, char *); extern void remove_symbol(char *); extern int update_symbol(char *, DataType *, char *); extern char *lookup_symvalue(char *); extern DataType *lookup_symtype(char *); extern int lookup_symbol(char *); // ----------------------------------------------------------------------- // Typemap support // ----------------------------------------------------------------------- extern void typemap_register(char *op, char *lang, DataType *type, char *pname, char *code, ParmList *l = 0); extern void typemap_register(char *op, char *lang, char *type, char *pname, char *code,ParmList *l = 0); extern void typemap_register_default(char *op, char *lang, int type, int ptr, char *arraystr, char *code, ParmList *l = 0); extern char *typemap_lookup(char *op, char *lang, DataType *type, char *pname, char *source, char *target, WrapperFunction *f = 0); extern void typemap_clear(char *op, char *lang, DataType *type, char *pname); extern void typemap_copy(char *op, char *lang, DataType *stype, char *sname, DataType *ttype, char *tname); extern char *typemap_check(char *op, char *lang, DataType *type, char *pname); extern void typemap_apply(DataType *tm_type, char *tmname, DataType *type, char *pname); extern void typemap_clear_apply(DataType *type, char *pname); // ----------------------------------------------------------------------- // Code fragment support // ----------------------------------------------------------------------- extern void fragment_register(char *op, char *lang, char *code); extern char *fragment_lookup(char *op, char *lang, int age); extern void fragment_clear(char *op, char *lang); extern void emit_ptr_equivalence(WrapperFunction &); // ----------------------------------------------------------------------- // Naming system // ----------------------------------------------------------------------- #define AS_IS 1 extern void name_register(char *method, char *format); extern int name_scope(int); extern char *name_wrapper(char *fname, char *prefix, int suppress=0); extern char *name_member(char *fname, char *classname, int suppress=0); extern char *name_get(char *vname, int suppress=0); extern char *name_set(char *vname, int suppress=0); extern char *name_construct(char *classname, int suppress=0); extern char *name_destroy(char *classname, int suppress=0); #endif