]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/wxSWIG/Modules/python.cxx
1 /*******************************************************************************
2 * Simplified Wrapper and Interface Generator (SWIG)
4 * Author : David Beazley
6 * Department of Computer Science
7 * University of Chicago
10 * beazley@cs.uchicago.edu
12 * Please read the file LICENSE for the copyright and terms by which SWIG
13 * can be used and distributed.
14 *******************************************************************************/
16 /**********************************************************************
22 **************************************************************************/
28 // Structures for managing doc strings
36 static int doc_index
= 0;
37 static DocString
*doc_strings
= 0;
39 static char *usage
= "\
40 Python Options (available with -python)\n\
41 -docstring - Produce docstrings (only applies to shadow classes)\n\
42 -globals name - Set name used to access C global variable ('cvar' by default).\n\
43 -module name - Set module name\n\
44 -keyword - Use keyword arguments\n\
45 -shadow - Generate shadow classes. \n\n";
47 static String pragma_include
;
49 // ---------------------------------------------------------------------
50 // PYTHON::parse_args(int argc, char *argv[])
52 // ---------------------------------------------------------------------
54 void PYTHON::parse_args(int argc
, char *argv
[]) {
58 sprintf(LibDir
,"%s",path
);
62 // Look for additional command line options.
63 for (i
= 1; i
< argc
; i
++) {
65 if(strcmp(argv
[i
],"-module") == 0) {
67 module = new char[strlen(argv
[i
+1])+2];
68 strcpy(module, argv
[i
+1]);
75 } else if (strcmp(argv
[i
],"-globals") == 0) {
77 global_name
= new char[strlen(argv
[i
+1])+1];
78 strcpy(global_name
, argv
[i
+1]);
85 } else if (strcmp(argv
[i
],"-shadow") == 0) {
88 } else if (strcmp(argv
[i
],"-docstring") == 0) {
91 } else if (strcmp(argv
[i
],"-keyword") == 0) {
94 } else if (strcmp(argv
[i
],"-help") == 0) {
99 // Create a symbol for this language
100 add_symbol("SWIGPYTHON",0,0);
102 // Set name of typemaps
104 typemap_lang
= "python";
108 // ---------------------------------------------------------------------
111 // Parse the interface file
112 // ---------------------------------------------------------------------
117 printf("Generating wrappers for Python\n");
120 // Run the SWIG parser
125 // ---------------------------------------------------------------------
126 // PYTHON::set_module(char *mod_name, char **mod_list)
128 // Sets the module name.
129 // Does nothing if it's already set (so it can be overridden as a command
132 //----------------------------------------------------------------------
134 void PYTHON::set_module(char *mod_name
, char **mod_list
) {
137 // If an "import" method has been set and we're in shadow class mode,
138 // output a python command to load the module
141 if (!(strcmp(import_file
,input_file
+strlen(input_file
)-strlen(import_file
)))) {
143 fprintf(f_shadow
,"\nfrom %s import *\n", mod_name
);
152 module = new char[strlen(mod_name
)+1];
153 strcpy(module,mod_name
);
155 // If there was a mod_list specified, make this incredible hack
157 modinit
<< "#define SWIGMODINIT ";
158 modextern
<< "#ifdef __cplusplus\n"
159 << "extern \"C\" {\n"
163 modinit
<< "swig_add_module(\"" << mod_list
[i
] << "\",init"
164 << mod_list
[i
] << "); \\\n";
166 modextern
<< "extern void init" << mod_list
[i
] << "();\n";
169 modextern
<< "#ifdef __cplusplus\n"
172 modinit
<< "/* End of extern module initialization */\n";
177 // ---------------------------------------------------------------------
178 // PYTHON::set_init(char *iname)
180 // Sets the initialization function name.
181 // Does nothing if it's already set
183 //----------------------------------------------------------------------
185 void PYTHON::set_init(char *iname
) {
190 // ---------------------------------------------------------------------
191 // PYTHON::import(char *filename)
193 // Imports a SWIG module as a separate file.
194 //----------------------------------------------------------------------
196 void PYTHON::import(char *filename
) {
197 if (import_file
) delete import_file
;
198 import_file
= copy_string(filename
);
201 // ----------------------------------------------------------------------
202 // PYTHON::add_method(char *name, char *function)
204 // Add some symbols to the methods table
205 // ----------------------------------------------------------------------
207 void PYTHON::add_method(char *name
, char *function
) {
212 n
->name
= new char[strlen(name
)+1];
213 strcpy(n
->name
,name
);
214 n
->function
= new char[strlen(function
)+1];
215 strcpy(n
->function
, function
);
221 // ---------------------------------------------------------------------
222 // PYTHON::print_methods()
224 // Prints out the method array.
225 // ---------------------------------------------------------------------
227 void PYTHON::print_methods() {
231 fprintf(f_wrappers
,"static PyMethodDef %sMethods[] = {\n", module);
235 fprintf(f_wrappers
,"\t { \"%s\", %s, METH_VARARGS },\n", n
->name
, n
->function
);
237 fprintf(f_wrappers
,"\t { \"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS },\n", n
->name
, n
->function
);
241 fprintf(f_wrappers
,"\t { NULL, NULL }\n");
242 fprintf(f_wrappers
,"};\n");
243 fprintf(f_wrappers
,"#ifdef __cplusplus\n");
244 fprintf(f_wrappers
,"}\n");
245 fprintf(f_wrappers
,"#endif\n");
248 // ---------------------------------------------------------------------
249 // char *PYTHON::add_docstring(DocEntry *de)
251 // Adds a documentation entry to the doc-string generator. Returns a
252 // unique character symbol that will be used to fill in the doc-string
254 // ---------------------------------------------------------------------
256 char *PYTHON::add_docstring(DocEntry
*de
) {
261 str
<< doc_index
<< "@";
265 s
->name
= copy_string(str
);
266 s
->next
= doc_strings
;
272 // ---------------------------------------------------------------------
273 // PYTHON::headers(void)
275 // ----------------------------------------------------------------------
277 void PYTHON::headers(void)
280 emit_banner(f_header
);
282 fprintf(f_header
,"/* Implementation : PYTHON */\n\n");
283 fprintf(f_header
,"#define SWIGPYTHON\n");
286 if (insert_file("python.swg", f_header
) == -1) {
287 fprintf(stderr
,"SWIG : Fatal error. Unable to locate python.swg. (Possible installation problem).\n");
291 if (insert_file("pyexp.swg", f_header
) == -1) {
292 fprintf(stderr
,"SWIG : Fatal error. Unable to locate pyexp.swg. (Possible installation problem).\n");
299 // --------------------------------------------------------------------
300 // PYTHON::initialize(void)
302 // This function outputs the starting code for a function to initialize
303 // your interface. It is only called once by the parser.
305 // ---------------------------------------------------------------------
307 void PYTHON::initialize(void)
316 fprintf(stderr
,"SWIG : *** Warning. No module name specified.\n");
319 // If shadow classing is enabled, we're going to change the module
323 temp
= new char[strlen(module)+2];
324 sprintf(temp
,"%sc",module);
328 /* Initialize the C code for the module */
329 initialize_cmodule();
330 /* Create a shadow file (if enabled).*/
332 sprintf(filen
,"%s%s.py", output_dir
, oldmodule
);
333 if ((f_shadow
= fopen(filen
,"w")) == 0) {
334 fprintf(stderr
,"Unable to open %s\n", filen
);
337 fprintf(f_shadow
,"# This file was created automatically by SWIG.\n");
338 fprintf(f_shadow
,"import %s\n", module);
341 // Dump out external module declarations
343 if (strlen(modinit
.get()) > 0) {
344 fprintf(f_header
,"%s\n",modinit
.get());
346 if (strlen(modextern
.get()) > 0) {
347 fprintf(f_header
,"%s\n",modextern
.get());
349 fprintf(f_wrappers
,"#ifdef __cplusplus\n");
350 fprintf(f_wrappers
,"extern \"C\" {\n");
351 fprintf(f_wrappers
,"#endif\n");
354 // ---------------------------------------------------------------------
355 // PYTHON::initialize_cmodule(void)
357 // Initializes the C module.
359 // ---------------------------------------------------------------------
360 void PYTHON::initialize_cmodule(void)
363 fprintf(f_header
,"#define SWIG_init init%s\n\n", module);
364 fprintf(f_header
,"#define SWIG_name \"%s\"\n", module);
366 // Output the start of the init function.
367 // Modify this to use the proper return type and arguments used
368 // by the target Language
370 fprintf(f_init
,"static PyObject *SWIG_globals;\n");
372 fprintf(f_init
,"#ifdef __cplusplus\n");
373 fprintf(f_init
,"extern \"C\" \n");
374 fprintf(f_init
,"#endif\n");
376 fprintf(f_init
,"SWIGEXPORT(void) init%s() {\n",module);
377 fprintf(f_init
,"\t PyObject *m, *d;\n");
381 while (InitNames
[i
]) {
382 fprintf(f_init
,"\t %s();\n", InitNames
[i
]);
386 fprintf(f_init
,"\t SWIG_globals = SWIG_newvarlink();\n");
387 fprintf(f_init
,"\t m = Py_InitModule(\"%s\", %sMethods);\n", module, module);
388 fprintf(f_init
,"\t d = PyModule_GetDict(m);\n");
392 // ---------------------------------------------------------------------
393 // PYTHON::close(void)
395 // Called when the end of the interface file is reached. Closes the
396 // initialization function and performs cleanup as necessary.
397 // ---------------------------------------------------------------------
399 void PYTHON::close(void)
404 if ((doc_entry
) && (module)){
406 temp
<< "Python Module : ";
408 module[strlen(module)-1] = 0;
411 doc_entry
->cinfo
<< temp
;
415 fullshadow
<< classes
416 << "\n\n#-------------- FUNCTION WRAPPERS ------------------\n\n"
418 << "\n\n#-------------- VARIABLE WRAPPERS ------------------\n\n"
421 if (strlen(pragma_include
) > 0) {
422 fullshadow
<< "\n\n#-------------- USER INCLUDE -----------------------\n\n"
426 // Go through all of the docstrings and replace the docstrings
431 fullshadow
.replace(s
->name
, s
->de
->text
);
435 fprintf(f_shadow,"\n\n#-------------- FUNCTION WRAPPERS ------------------\n\n");
436 fprintf(f_shadow,"%s",func.get());
437 fprintf(f_shadow,"\n\n#-------------- VARIABLE WRAPPERS ------------------\n\n");
438 fprintf(f_shadow,"%s",vars.get());
439 if (strlen(pragma_include) > 0) {
440 fprintf(f_shadow,"\n\n#-------------- USER INCLUDE -----------------------\n\n");
441 fprintf(f_shadow,"%s",pragma_include.get());
444 fprintf(f_shadow
, "%s", fullshadow
.get());
449 // --------------------------------------------------------------------
450 // PYTHON::close_cmodule(void)
452 // Called to cleanup the C module code
453 // --------------------------------------------------------------------
454 void PYTHON::close_cmodule(void)
456 emit_ptr_equivalence(f_init
);
457 fprintf(f_init
,"}\n");
460 // ----------------------------------------------------------------------
461 // PYTHON::get_pointer(char *iname, char *srcname, char *src, char *target,
462 // DataType *t, WrapperFunction &f, char *ret)
464 // Emits code to get a pointer and do type checking.
465 // iname = name of the function/method (used for error messages)
466 // srcname = Name of source (used for error message reporting).
467 // src = name of variable where source string is located.
468 // dest = name of variable where pointer value is stored.
469 // t = Expected datatype of the parameter
470 // f = Wrapper function object being used to generate code.
471 // ret = return code upon failure.
473 // Note : pointers are stored as strings so you first need to get
474 // a string and then call _swig_get_hex() to extract a point.
476 // This module is pretty ugly, but type checking is kind of nasty
478 // ----------------------------------------------------------------------
481 PYTHON::get_pointer(char *iname
, char *srcname
, char *src
, char *dest
,
482 DataType
*t
, String
&f
, char *ret
)
485 // Now get the pointer value from the string and save in dest
488 f
<< tab4
<< "if (" << src
<< ") {\n"
489 << tab8
<< "if (SWIG_GetPtrObj(" << src
<< ",(void **) &" << dest
<< ",";
491 f
<< tab4
<< "if (" << src
<< ") {\n"
492 << tab8
<< "if (" << src
<< " == Py_None) { " << dest
<< " = NULL; }\n"
493 << tab8
<< "else if (SWIG_GetPtrObj(" << src
<< ",(void **) &" << dest
<< ",";
495 // If we're passing a void pointer, we give the pointer conversion a NULL
496 // pointer, otherwise pass in the expected type.
498 if (t
->type
== T_VOID
) f
<< "(char *) 0 )) {\n";
500 f
<< "\"" << t
->print_mangle() << "\")) {\n";
502 // This part handles the type checking according to three different
503 // levels. 0 = no checking, 1 = warning message, 2 = strict.
506 case 0: // No type checking
510 case 1: // Warning message only
512 // Change this part to how you want to handle a type-mismatch warning.
513 // By default, it will just print to stderr.
515 f
<< tab8
<< tab4
<< "fprintf(stderr,\"Warning : type mismatch in " << srcname
516 << " of " << iname
<< ". Expected " << t
->print_mangle()
517 << ", received %s\\n\"," << src
<< ");\n"
521 case 2: // Super strict mode.
523 // Change this part to return an error.
525 f
<< tab8
<< tab4
<< "PyErr_SetString(PyExc_TypeError,\"Type error in " << srcname
526 << " of " << iname
<< ". Expected " << t
->print_mangle() << ".\");\n"
527 << tab8
<< "return " << ret
<< ";\n"
532 fprintf(stderr
,"SWIG Error. Unknown strictness level\n");
538 // ----------------------------------------------------------------------
539 // PYTHON::emit_function_header()
541 // Return the code to be used as a function header
542 // ----------------------------------------------------------------------
543 void PYTHON::emit_function_header(WrapperFunction
&emit_to
, char *wname
)
546 emit_to
.def
<< "static PyObject *" << wname
547 << "(PyObject *self, PyObject *args) {";
549 emit_to
.def
<< "static PyObject *" << wname
550 << "(PyObject *self, PyObject *args, PyObject *kwargs) {";
552 emit_to
.code
<< tab4
<< "self = self;\n";
555 // ----------------------------------------------------------------------
556 // PYTHON::convert_self()
558 // Called during the function generation process, to determine what to
559 // use as the "self" variable during the call. Derived classes may emit code
560 // to convert the real self pointer into a usable pointer.
562 // Returns the name of the variable to use as the self pointer
563 // ----------------------------------------------------------------------
564 char *PYTHON::convert_self(WrapperFunction
&)
566 // Default behaviour is no translation
570 // ----------------------------------------------------------------------
571 // PYTHON::make_funcname_wrapper()
573 // Called to create a name for a wrapper function
574 // ----------------------------------------------------------------------
575 char *PYTHON::make_funcname_wrapper(char *fnName
)
577 return name_wrapper(fnName
,"");
580 // ----------------------------------------------------------------------
581 // PYTHON::create_command(char *cname, char *iname)
583 // Create a new command in the interpreter. Used for C++ inheritance
585 // ----------------------------------------------------------------------
587 void PYTHON::create_command(char *cname
, char *iname
) {
589 // Create the name of the wrapper function
591 char *wname
= name_wrapper(cname
,"");
593 // Now register the function with the interpreter.
595 add_method(iname
, wname
);
599 // ----------------------------------------------------------------------
600 // PYTHON::create_function(char *name, char *iname, DataType *d,
603 // This function creates a wrapper function and registers it with the
607 // name = actual name of the function that's being wrapped
608 // iname = name of the function in the interpreter (may be different)
609 // d = Return datatype of the functions.
610 // l = A linked list containing function parameter information.
612 // ----------------------------------------------------------------------
614 void PYTHON::create_function(char *name
, char *iname
, DataType
*d
, ParmList
*l
)
618 String wname
, self_name
, call_name
;
619 char source
[64], target
[64], temp
[256], argnum
[20];
625 String cleanup
, outarg
;
636 // Make a valid name for this function. This removes special symbols
637 // that would cause problems in the C compiler.
639 wname
= make_funcname_wrapper(iname
);
641 // Now emit the function declaration for the wrapper function. You
642 // should modify this to return the appropriate types and use the
643 // appropriate parameters.
645 emit_function_header(f
, wname
);
647 f
.add_local("PyObject *","_resultobj");
649 // Get the function usage string for later use
651 usage
= usage_func(iname
,d
,l
);
653 // Write code to extract function parameters.
654 // This is done in one pass, but we need to construct three independent
656 // 1. Python format string such as "iis"
657 // 2. The actual arguments to put values into
658 // 3. Pointer conversion code.
660 // If there is a type mapping, we will extract the Python argument
661 // as a raw PyObject and let the user deal with it.
664 pcount
= emit_args(d
, l
, f
);
666 parse_args
<< tab4
<< "if(!PyArg_ParseTuple(args,\"";
668 parse_args
<< tab4
<< "if(!PyArg_ParseTupleAndKeywords(args,kwargs,\"";
669 arglist
<< ",_kwnames";
674 numopt
= l
->numopt(); // Get number of optional arguments
675 if (numopt
) have_defarg
= 1;
681 // Generate source and target strings
682 sprintf(source
,"_obj%d",i
);
683 sprintf(target
,"_arg%d",i
);
684 sprintf(argnum
,"%d",j
+1);
686 // Only consider this argument if it's not ignored
690 // Add an optional argument separator if needed
692 if (j
== pcount
-numopt
) {
696 if (strlen(p
->name
)) {
697 kwargs
<< "\"" << p
->name
<< "\",";
699 kwargs
<< "\"arg" << j
+1 << "\",";
700 // kwargs << "\"\",";
703 // Look for input typemap
705 if ((tm
= typemap_lookup("in","python",p
->t
,p
->name
,source
,target
,&f
))) {
706 parse_args
<< "O"; // Grab the argument as a raw PyObject
707 f
.add_local("PyObject *",source
,"0");
708 arglist
<< "&" << source
;
709 if (i
>= (pcount
-numopt
))
710 get_pointers
<< tab4
<< "if (" << source
<< ")\n";
711 get_pointers
<< tm
<< "\n";
712 get_pointers
.replace("$argnum", argnum
);
713 get_pointers
.replace("$arg",source
);
716 // Check if this parameter is a pointer. If not, we'll get values
718 if (!p
->t
->is_pointer
) {
719 // Extract a parameter by "value"
723 // Handle integers here. Usually this can be done as a single
724 // case if you appropriate cast things. However, if you have
725 // special cases, you'll need to add more code.
727 case T_INT
: case T_UINT
: case T_SINT
:
730 case T_SHORT
: case T_USHORT
: case T_SSHORT
:
733 case T_LONG
: case T_ULONG
: case T_SLONG
:
736 case T_SCHAR
: case T_UCHAR
:
754 tempval
<< "(int) " << p
->defvalue
;
756 tempb
<< "tempbool" << i
;
759 f
.add_local("int",tempb
.get());
761 f
.add_local("int",tempb
.get(),tempval
.get());
762 get_pointers
<< tab4
<< target
<< " = " << p
->t
->print_cast() << " " << tempb
<< ";\n";
763 arglist
<< "&" << tempb
;
767 // Void.. Do nothing.
772 // User defined. This is usually invalid. No way to pass a
773 // complex type by "value". We'll just pass into the unsupported
778 // Unsupported data type
781 fprintf(stderr
,"%s : Line %d. Unable to use type %s as a function argument.\n",input_file
, line_number
, p
->t
->print_type());
785 // Emit code for parameter list
787 if ((p
->t
->type
!= T_VOID
) && (p
->t
->type
!= T_BOOL
))
788 arglist
<< "&_arg" << i
;
792 // Is some other kind of variable.
794 if ((p
->t
->type
== T_CHAR
) && (p
->t
->is_pointer
== 1)) {
796 arglist
<< "&_arg" << i
;
799 // Have some sort of pointer variable. Create a temporary local
800 // variable for the string and read the pointer value into it.
803 sprintf(source
,"_argo%d", i
);
804 sprintf(target
,"_arg%d", i
);
805 sprintf(temp
,"argument %d",i
+1);
807 f
.add_local("PyObject *", source
,"0");
808 arglist
<< "&" << source
;
809 get_pointer(iname
, temp
, source
, target
, p
->t
, get_pointers
, "NULL");
815 // Check if there was any constraint code
816 if ((tm
= typemap_lookup("check","python",p
->t
,p
->name
,source
,target
))) {
818 check
.replace("$argnum", argnum
);
820 // Check if there was any cleanup code
821 if ((tm
= typemap_lookup("freearg","python",p
->t
,p
->name
,target
,source
))) {
822 cleanup
<< tm
<< "\n";
823 cleanup
.replace("$argnum", argnum
);
824 cleanup
.replace("$arg",source
);
826 if ((tm
= typemap_lookup("argout","python",p
->t
,p
->name
,target
,"_resultobj"))) {
827 outarg
<< tm
<< "\n";
828 outarg
.replace("$argnum", argnum
);
829 outarg
.replace("$arg",source
);
832 if ((tm
= typemap_lookup("build","python",p
->t
,p
->name
,source
,target
))) {
842 f
.locals
<< tab4
<< "char *_kwnames[] = " << kwargs
<< ";\n";
845 parse_args
<< ":" << iname
<< "\""; // No additional arguments
846 parse_args
<< arglist
<< ")) \n"
847 << tab8
<< "return NULL;\n";
849 self_name
= convert_self(f
);
851 /* Now slap the whole first part of the wrapper function together */
853 f
.code
<< parse_args
<< get_pointers
<< check
;
856 // Special handling for build values
861 l
->sub_parmnames(build
); // Replace all parameter names
862 for (i
= 0; i
< l
->nparms
; i
++) {
864 if (strlen(p
->name
) > 0) {
865 sprintf(temp1
,"_in_%s", p
->name
);
867 sprintf(temp1
,"_in_arg%d", i
);
869 sprintf(temp2
,"_obj%d",i
);
870 build
.replaceid(temp1
,temp2
);
875 // This function emits code to call the real function. Assuming you read
876 // the parameters in correctly, this will work.
879 call_name
<< self_name
<< name
;
880 emit_func_call(call_name
,d
,l
,f
);
882 // Now emit code to return the functions return value (if any).
883 // If there was a result, it was saved in _result.
884 // If the function is a void type, don't do anything.
886 if ((strncmp(name
, "new_", 4) != 0) && // don't use the out typemap for constructors
887 (tm
= typemap_lookup("out","python",d
,iname
,"_result","_resultobj"))) {
888 // Yep. Use it instead of the default
889 f
.code
<< tm
<< "\n";
892 if ((d
->type
!= T_VOID
) || (d
->is_pointer
)) {
893 // Now have return value, figure out what to do with it.
895 if (!d
->is_pointer
) {
897 // Function returns a "value"
901 // Return an integer type
903 case T_INT
: case T_SINT
: case T_UINT
: case T_BOOL
:
904 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"i\",_result);\n";
906 case T_SHORT
: case T_SSHORT
: case T_USHORT
:
907 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"h\",_result);\n";
909 case T_LONG
: case T_SLONG
: case T_ULONG
:
910 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"l\",_result);\n";
912 case T_SCHAR
: case T_UCHAR
:
913 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"b\",_result);\n";
916 // Return a floating point value
919 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"d\",_result);\n";
922 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"f\",_result);\n";
925 // Return a single ASCII value. Usually we need to convert
926 // it to a NULL-terminate string and return that instead.
929 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"c\",_result);\n";
934 // Return something by value
935 // We're living dangerously here, but life is short...play hard
937 // Oops. Need another local variable
938 f
.add_local("char","_ptemp[128]");
941 f
.code
<< tab4
<< "SWIG_MakePtr(_ptemp, (void *) _result,\""
942 << d
->print_mangle() << "\");\n";
944 // Return a character string containing our pointer.
946 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"s\",_ptemp);\n";
949 fprintf(stderr
,"%s: Line %d. Unable to use return type %s in function %s.\n", input_file
, line_number
, d
->print_type(), name
);
954 // Return type is a pointer. We'll see if it's a char * and return
955 // a string. Otherwise, we'll convert it into a SWIG pointer and return
958 if ((d
->type
== T_CHAR
) && (d
->is_pointer
== 1)) {
960 // Return a character string
961 f
.code
<< tab4
<< "_resultobj = Py_BuildValue(\"s\", _result);\n";
963 // If declared as a new object, free the result
967 // Build a SWIG pointer.
968 f
.add_local("char","_ptemp[128]");
969 f
.code
<< tab4
<< "if (_result) {\n"
970 << tab8
<< "SWIG_MakePtr(_ptemp, (char *) _result,\""
971 << d
->print_mangle() << "\");\n";
973 // Return a character string containing our pointer.
974 f
.code
<< tab8
<< "_resultobj = Py_BuildValue(\"s\",_ptemp);\n";
975 f
.code
<< tab4
<< "} else {\n"
976 << tab8
<< "Py_INCREF(Py_None);\n"
977 << tab8
<< "_resultobj = Py_None;\n"
982 // no return value and no output args
983 //if (!have_output) {
984 f
.code
<< tab4
<< "Py_INCREF(Py_None);\n";
985 f
.code
<< tab4
<< "_resultobj = Py_None;\n";
990 // Check to see if there were any output arguments, if so we're going to
991 // create a Python list object out of the current result
995 // If there was any other cleanup needed, do that
999 // Look to see if there is any newfree cleanup code
1002 if ((tm
= typemap_lookup("newfree","python",d
,iname
,"_result",""))) {
1003 f
.code
<< tm
<< "\n";
1007 // See if there is any argument cleanup code
1009 if ((tm
= typemap_lookup("ret","python",d
,iname
,"_result",""))) {
1010 // Yep. Use it instead of the default
1011 f
.code
<< tm
<< "\n";
1014 f
.code
<< tab4
<< "return _resultobj;\n";
1017 // Substitute the cleanup code
1018 f
.code
.replace("$cleanup",cleanup
);
1020 // Substitute the function name
1021 f
.code
.replace("$name",iname
);
1023 // Dump the function out
1024 f
.print(f_wrappers
);
1026 // Now register the function with the interpreter.
1028 add_method(iname
, wname
);
1030 // Create a documentation entry for this
1033 static DocEntry
*last_doc_entry
= 0;
1034 doc_entry
->usage
<< usage
;
1035 if (last_doc_entry
!= doc_entry
) {
1036 doc_entry
->cinfo
<< "returns " << d
->print_type();
1037 last_doc_entry
= doc_entry
;
1041 // ---------------------------------------------------------------------------
1042 // Create a shadow for this function (if enabled and not in a member function)
1043 // ---------------------------------------------------------------------------
1045 if ((shadow
) && (!(shadow
& PYSHADOW_MEMBER
))) {
1048 int need_wrapper
= 0;
1049 int munge_return
= 0;
1050 int have_optional
= 0;
1052 // Check return code for modification
1053 if ((hash
.lookup(d
->name
)) && (d
->is_pointer
<=1)) {
1058 if (docstring
&& doc_entry
)
1061 // If no modification is needed. We're just going to play some
1062 // symbol table games instead
1064 if (!need_wrapper
) {
1065 func
<< iname
<< " = " << module << "." << iname
<< "\n\n";
1067 func
<< "def " << iname
<< "(*_args, **_kwargs):\n";
1069 // Create a docstring for this
1070 if (docstring
&& doc_entry
) {
1071 func
<< tab4
<< "\"\"\"" << add_docstring(doc_entry
) << "\"\"\"\n";
1074 func
<< tab4
<< "val = apply(" << module << "." << iname
<< ",_args,_kwargs)\n";
1077 // If the output of this object has been remapped in any way, we're
1078 // going to return it as a bare object.
1080 if (!typemap_check("out",typemap_lang
,d
,iname
)) {
1082 // If there are output arguments, we are going to return the value
1083 // unchanged. Otherwise, emit some shadow class conversion code.
1086 func
<< tab4
<< "if val: val = " << (char *) hash
.lookup(d
->name
) << "Ptr(val)";
1087 if (((hash
.lookup(d
->name
)) && (d
->is_pointer
< 1)) ||
1088 ((hash
.lookup(d
->name
)) && (d
->is_pointer
== 1) && NewObject
))
1089 func
<< "; val.thisown = 1\n";
1093 // Does nothing--returns the value unmolested
1097 func
<< tab4
<< "return val\n\n";
1102 // -----------------------------------------------------------------------
1103 // PYTHON::link_variable(char *name, char *iname, DataType *d)
1106 // name = the real name of the variable being linked
1107 // iname = Name of the variable in the interpreter (may be different)
1108 // d = Datatype of the variable.
1110 // This creates a pair of functions for evaluating/setting the value
1111 // of a variable. These are then added to the special SWIG global
1113 // -----------------------------------------------------------------------
1115 void PYTHON::link_variable(char *name
, char *iname
, DataType
*t
) {
1118 static int have_globals
= 0;
1121 WrapperFunction getf
, setf
;
1123 // If this is our first call, add the globals variable to the
1124 // Python dictionary.
1126 if (!have_globals
) {
1127 fprintf(f_init
,"\t PyDict_SetItemString(d,\"%s\", SWIG_globals);\n",global_name
);
1129 if ((shadow
) && (!(shadow
& PYSHADOW_MEMBER
))) {
1130 vars
<< global_name
<< " = " << module << "." << global_name
<< "\n";
1133 // First make a sanitized version of the function name (in case it's some
1134 // funky C++ thing).
1136 wname
= name_wrapper(name
,"");
1138 // ---------------------------------------------------------------------
1139 // Create a function for setting the value of the variable
1140 // ---------------------------------------------------------------------
1142 setf
.def
<< "static int " << wname
<< "_set(PyObject *val) {";
1143 if (!(Status
& STAT_READONLY
)) {
1144 if ((tm
= typemap_lookup("varin","python",t
,name
,"val",name
))) {
1145 setf
.code
<< tm
<< "\n";
1146 setf
.code
.replace("$name",iname
);
1148 if ((t
->type
!= T_VOID
) || (t
->is_pointer
)) {
1149 if (!t
->is_pointer
) {
1151 // Have a real value here
1154 case T_INT
: case T_SHORT
: case T_LONG
:
1155 case T_UINT
: case T_USHORT
: case T_ULONG
:
1156 case T_SINT
: case T_SSHORT
: case T_SLONG
:
1157 case T_SCHAR
: case T_UCHAR
: case T_BOOL
:
1158 // Get an integer value
1159 setf
.add_local(t
->print_type(), "tval");
1160 setf
.code
<< tab4
<< "tval = " << t
->print_cast() << "PyInt_AsLong(val);\n"
1161 << tab4
<< "if (PyErr_Occurred()) {\n"
1162 << tab8
<< "PyErr_SetString(PyExc_TypeError,\"C variable '"
1163 << iname
<< "'(" << t
->print_type() << ")\");\n"
1164 << tab8
<< "return 1; \n"
1166 << tab4
<< name
<< " = tval;\n";
1169 case T_FLOAT
: case T_DOUBLE
:
1170 // Get a floating point value
1171 setf
.add_local(t
->print_type(), "tval");
1172 setf
.code
<< tab4
<< "tval = " << t
->print_cast() << "PyFloat_AsDouble(val);\n"
1173 << tab4
<< "if (PyErr_Occurred()) {\n"
1174 << tab8
<< "PyErr_SetString(PyExc_TypeError,\"C variable '"
1175 << iname
<< "'(" << t
->print_type() << ")\");\n"
1176 << tab8
<< "return 1; \n"
1178 << tab4
<< name
<< " = tval;\n";
1181 // A single ascii character
1184 setf
.add_local("char *", "tval");
1185 setf
.code
<< tab4
<< "tval = (char *) PyString_AsString(val);\n"
1186 << tab4
<< "if (PyErr_Occurred()) {\n"
1187 << tab8
<< "PyErr_SetString(PyExc_TypeError,\"C variable '"
1188 << iname
<< "'(" << t
->print_type() << ")\");\n"
1189 << tab8
<< "return 1; \n"
1191 << tab4
<< name
<< " = *tval;\n";
1195 setf
.add_local(t
->print_type(),"temp");
1196 get_pointer(iname
,"value","val","temp",t
,setf
.code
,"1");
1197 setf
.code
<< tab4
<< name
<< " = *temp;\n";
1201 fprintf(stderr
,"%s : Line %d. Unable to link with type %s.\n", input_file
, line_number
, t
->print_type());
1205 // Parse a pointer value
1207 if ((t
->type
== T_CHAR
) && (t
->is_pointer
== 1)) {
1208 setf
.add_local("char *", "tval");
1209 setf
.code
<< tab4
<< "tval = (char *) PyString_AsString(val);\n"
1210 << tab4
<< "if (PyErr_Occurred()) {\n"
1211 << tab8
<< "PyErr_SetString(PyExc_TypeError,\"C variable '"
1212 << iname
<< "'(" << t
->print_type() << ")\");\n"
1213 << tab8
<< "return 1; \n"
1217 setf
.code
<< tab4
<< "if (" << name
<< ") delete [] " << name
<< ";\n"
1218 << tab4
<< name
<< " = new char[strlen(tval)+1];\n"
1219 << tab4
<< "strcpy((char *)" << name
<< ",tval);\n";
1221 setf
.code
<< tab4
<< "if (" << name
<< ") free(" << name
<< ");\n"
1222 << tab4
<< name
<< " = (char *) malloc(strlen(tval)+1);\n"
1223 << tab4
<< "strcpy((char *)" << name
<< ",tval);\n";
1227 // Is a generic pointer value.
1229 setf
.add_local(t
->print_type(),"temp");
1230 get_pointer(iname
,"value","val","temp",t
,setf
.code
,"1");
1231 setf
.code
<< tab4
<< name
<< " = temp;\n";
1236 setf
.code
<< tab4
<< "return 0;\n";
1238 // Is a readonly variable. Issue an error
1239 setf
.code
<< tab4
<< "PyErr_SetString(PyExc_TypeError,\"Variable " << iname
1240 << " is read-only.\");\n"
1241 << tab4
<< "return 1;\n";
1246 // Dump out function for setting value
1248 setf
.print(f_wrappers
);
1250 // ----------------------------------------------------------------
1251 // Create a function for getting the value of a variable
1252 // ----------------------------------------------------------------
1254 getf
.def
<< "static PyObject *" << wname
<< "_get() {";
1255 getf
.add_local("PyObject *","pyobj");
1256 if ((tm
= typemap_lookup("varout","python",t
,name
,name
,"pyobj"))) {
1257 getf
.code
<< tm
<< "\n";
1258 getf
.code
.replace("$name",iname
);
1259 } else if ((tm
= typemap_lookup("out","python",t
,name
,name
,"pyobj"))) {
1260 getf
.code
<< tm
<< "\n";
1261 getf
.code
.replace("$name",iname
);
1263 if ((t
->type
!= T_VOID
) || (t
->is_pointer
)) {
1264 if (!t
->is_pointer
) {
1266 /* Is a normal datatype */
1268 case T_INT
: case T_SINT
: case T_UINT
:
1269 case T_SHORT
: case T_SSHORT
: case T_USHORT
:
1270 case T_LONG
: case T_SLONG
: case T_ULONG
:
1271 case T_SCHAR
: case T_UCHAR
: case T_BOOL
:
1272 getf
.code
<< tab4
<< "pyobj = PyInt_FromLong((long) " << name
<< ");\n";
1274 case T_FLOAT
: case T_DOUBLE
:
1275 getf
.code
<< tab4
<< "pyobj = PyFloat_FromDouble((double) " << name
<< ");\n";
1278 getf
.add_local("char","ptemp[2]");
1279 getf
.code
<< tab4
<< "ptemp[0] = " << name
<< ";\n"
1280 << tab4
<< "ptemp[1] = 0;\n"
1281 << tab4
<< "pyobj = PyString_FromString(ptemp);\n";
1284 // Hack this into a pointer
1285 getf
.add_local("char", "ptemp[128]");
1287 getf
.code
<< tab4
<< "SWIG_MakePtr(ptemp,(char *) &" << name
1288 << "," << quote
<< t
->print_mangle() << quote
<< ");\n"
1289 << tab4
<< "pyobj = PyString_FromString(ptemp);\n";
1293 fprintf(stderr
,"Unable to link with type %s\n", t
->print_type());
1298 // Is some sort of pointer value
1299 if ((t
->type
== T_CHAR
) && (t
->is_pointer
== 1)) {
1300 getf
.code
<< tab4
<< "if (" << name
<< ")\n"
1301 << tab8
<< "pyobj = PyString_FromString(" << name
<< ");\n"
1302 << tab4
<< "else pyobj = PyString_FromString(\"(NULL)\");\n";
1304 getf
.add_local("char","ptemp[128]");
1305 getf
.code
<< tab4
<< "SWIG_MakePtr(ptemp, (char *) " << name
<< ",\""
1306 << t
->print_mangle() << "\");\n"
1307 << tab4
<< "pyobj = PyString_FromString(ptemp);\n";
1313 getf
.code
<< tab4
<< "return pyobj;\n"
1316 getf
.print(f_wrappers
);
1318 // Now add this to the variable linking mechanism
1320 fprintf(f_init
,"\t SWIG_addvarlink(SWIG_globals,\"%s\",%s_get, %s_set);\n", iname
, wname
, wname
);
1323 // Fill in the documentation entry
1326 doc_entry
->usage
<< usage_var(iname
, t
);
1327 doc_entry
->cinfo
<< "Global : " << t
->print_type() << " " << name
;
1330 // ----------------------------------------------------------
1331 // Output a shadow variable. (If applicable and possible)
1332 // ----------------------------------------------------------
1333 if ((shadow
) && (!(shadow
& PYSHADOW_MEMBER
))) {
1334 if ((hash
.lookup(t
->name
)) && (t
->is_pointer
<= 1)) {
1335 vars
<< iname
<< " = " << (char *) hash
.lookup(t
->name
) << "Ptr(" << module << "." << global_name
1336 << "." << iname
<< ")\n";
1341 // -----------------------------------------------------------------------
1342 // PYTHON::declare_const(char *name, char *iname, DataType *type, char *value)
1344 // Makes a constant as defined with #define. Constants are added to the
1345 // module's dictionary and are **NOT** guaranteed to be read-only,
1348 // ------------------------------------------------------------------------
1350 void PYTHON::declare_const(char *name
, char *, DataType
*type
, char *value
) {
1354 // Make a static python object
1356 if ((tm
= typemap_lookup("const","python",type
,name
,value
,name
))) {
1357 fprintf(f_init
,"%s\n",tm
);
1360 if ((type
->type
== T_USER
) && (!type
->is_pointer
)) {
1361 fprintf(stderr
,"%s : Line %d. Unsupported constant value.\n", input_file
, line_number
);
1365 if (type
->is_pointer
== 0) {
1366 switch(type
->type
) {
1367 case T_INT
:case T_SINT
: case T_UINT
: case T_BOOL
:
1368 case T_SHORT
: case T_SSHORT
: case T_USHORT
:
1369 case T_LONG
: case T_SLONG
: case T_ULONG
:
1370 case T_SCHAR
: case T_UCHAR
:
1371 fprintf(f_init
,"\t PyDict_SetItemString(d,\"%s\", PyInt_FromLong((long) %s));\n",name
,value
);
1375 fprintf(f_init
,"\t PyDict_SetItemString(d,\"%s\", PyFloat_FromDouble((double) %s));\n",name
,value
);
1378 fprintf(f_init
,"\t PyDict_SetItemString(d,\"%s\", PyString_FromString(\"%s\"));\n",name
,value
);
1381 fprintf(stderr
,"%s : Line %d. Unsupported constant value.\n", input_file
, line_number
);
1385 if ((type
->type
== T_CHAR
) && (type
->is_pointer
== 1)) {
1386 fprintf(f_init
,"\t PyDict_SetItemString(d,\"%s\", PyString_FromString(\"%s\"));\n",name
,value
);
1388 // A funky user-defined type. We're going to munge it into a string pointer value
1389 fprintf(f_init
,"\t {\n");
1390 fprintf(f_init
,"\t\t char %s_char[%d];\n", name
, (int) strlen(type
->print_mangle()) + 20);
1391 fprintf(f_init
,"\t\t SWIG_MakePtr(%s_char, (void *) (%s),\"%s\");\n",
1392 name
, value
, type
->print_mangle());
1393 fprintf(f_init
,"\t\t PyDict_SetItemString(d,\"%s\", PyString_FromString(%s_char));\n",name
,name
);
1394 fprintf(f_init
,"\t }\n");
1398 if ((shadow
) && (!(shadow
& PYSHADOW_MEMBER
))) {
1399 vars
<< name
<< " = " << module << "." << name
<< "\n";
1402 doc_entry
->usage
= "";
1403 doc_entry
->usage
<< usage_const(name
,type
,value
);
1404 doc_entry
->cinfo
= "";
1405 doc_entry
->cinfo
<< "Constant: " << type
->print_type();
1409 // ----------------------------------------------------------------------
1410 // PYTHON::usage_var(char *iname, DataType *t)
1412 // This function produces a string indicating how to use a variable.
1413 // It is called by the documentation system to produce syntactically
1414 // correct documentation entires.
1416 // s is a pointer to a character pointer. You should create
1417 // a string and set this pointer to point to it.
1418 // ----------------------------------------------------------------------
1420 char *PYTHON::usage_var(char *iname
, DataType
*) {
1425 temp
<< global_name
<< "." << iname
;
1427 // Create result. Don't modify this
1432 // ---------------------------------------------------------------------------
1433 // PYTHON::usage_func(char *iname, DataType *t, ParmList *l)
1435 // Produces a string indicating how to call a function in the target
1438 // ---------------------------------------------------------------------------
1440 char *PYTHON::usage_func(char *iname
, DataType
*, ParmList
*l
) {
1447 temp
<< iname
<< "(";
1449 // Now go through and print parameters
1450 // You probably don't need to change this
1457 /* If parameter has been named, use that. Otherwise, just print a type */
1459 if ((p
->t
->type
!= T_VOID
) || (p
->t
->is_pointer
)) {
1460 if (strlen(p
->name
) > 0) {
1463 temp
<< p
->t
->print_type();
1474 if ((!p
->ignore
) && (i
> 0))
1482 // Create result. Don't change this
1489 // ----------------------------------------------------------------------
1490 // PYTHON::usage_const(char *iname, DataType *type, char *value)
1492 // Produces a string for a constant. Really about the same as
1493 // usage_var() except we'll indicate the value of the constant.
1494 // ----------------------------------------------------------------------
1496 char *PYTHON::usage_const(char *iname
, DataType
*, char *value
) {
1500 temp
<< iname
<< " = " << value
;
1505 // -----------------------------------------------------------------------
1506 // PYTHON::add_native(char *name, char *funcname)
1508 // Add a native module name to the methods list.
1509 // -----------------------------------------------------------------------
1511 void PYTHON::add_native(char *name
, char *funcname
) {
1512 add_method(name
, funcname
);
1514 func
<< name
<< " = " << module << "." << name
<< "\n\n";
1518 // -----------------------------------------------------------------------
1519 // PYTHON::cpp_class_decl(char *name, char *rename, char *type)
1521 // Treatment of an empty class definition. Used to handle
1522 // shadow classes across modules.
1523 // -----------------------------------------------------------------------
1525 void PYTHON::cpp_class_decl(char *name
, char *rename
, char *type
) {
1528 hash
.add(name
,copy_string(rename
));
1529 // Add full name of datatype to the hash table
1530 if (strlen(type
) > 0) {
1531 sprintf(temp
,"%s %s", type
, name
);
1532 hash
.add(temp
,copy_string(rename
));
1537 // -----------------------------------------------------------------------
1538 // PYTHON::pragma(char *name, char *type)
1540 // Pragma directive. Used to do various python specific things
1541 // -----------------------------------------------------------------------
1543 void PYTHON::pragma(char *lang
, char *cmd
, char *value
) {
1545 if (strcmp(lang
,"python") == 0) {
1546 if (strcmp(cmd
,"CODE") == 0) {
1548 fprintf(f_shadow
,"%s\n",value
);
1550 } else if (strcmp(cmd
,"code") == 0) {
1552 fprintf(f_shadow
,"%s\n",value
);
1554 } else if (strcmp(cmd
,"include") == 0) {
1557 if (get_file(value
,pragma_include
) == -1) {
1558 fprintf(stderr
,"%s : Line %d. Unable to locate file %s\n", input_file
, line_number
, value
);
1563 fprintf(stderr
,"%s : Line %d. Unrecognized pragma.\n", input_file
, line_number
);
1570 PyPragma(char *method
, char *text
) : m_method(method
), m_text(text
), next(0) { }
1571 ~PyPragma() { if (next
) delete next
; }
1577 static PyPragma
*pragmas
= 0;
1579 // -----------------------------------------------------------------------------
1580 // PYTHON::cpp_pragma(Pragma *plist)
1582 // Handle C++ pragmas
1583 // -----------------------------------------------------------------------------
1585 void PYTHON::cpp_pragma(Pragma
*plist
) {
1586 PyPragma
*pyp1
= 0, *pyp2
= 0;
1592 if (strcmp(plist
->lang
,"python") == 0) {
1593 if (strcmp(plist
->name
,"addtomethod") == 0) {
1594 // parse value, expected to be in the form "methodName:line"
1595 String temp
= plist
->value
;
1596 char* txtptr
= strchr(temp
.get(), ':');
1598 // add name and line to a list in current_class
1601 pyp1
= new PyPragma(temp
,txtptr
);
1610 fprintf(stderr
,"%s : Line %d. Malformed addtomethod pragma. Should be \"methodName:text\"\n",
1611 plist
->filename
.get(),plist
->lineno
);
1613 } else if (strcmp(plist
->name
, "addtoclass") == 0) {
1614 pyp1
= new PyPragma("__class__",plist
->value
);
1624 plist
= plist
->next
;
1628 // --------------------------------------------------------------------------------
1629 // PYTHON::emitAddPragmas(String& output, char* name, char* spacing);
1631 // Search the current class pragma for any text belonging to name.
1632 // Append the text properly spaced to the output string.
1633 // --------------------------------------------------------------------------------
1635 void PYTHON::emitAddPragmas(String
& output
, char* name
, char* spacing
)
1637 PyPragma
*p
= pragmas
;
1639 if (strcmp(p
->m_method
,name
) == 0) {
1640 output
<< spacing
<< p
->m_text
<< "\n";