| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* Module support implementation */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-30 08:27:36 +00:00
										 |  |  | typedef double va_double; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-11-19 18:53:33 +00:00
										 |  |  | /* Package context -- the full module name for package imports */ | 
					
						
							|  |  |  | char *_Py_PackageContext = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-02 03:07:46 +00:00
										 |  |  | /* Py_InitModule4() parameters:
 | 
					
						
							| 
									
										
										
										
											1995-01-09 17:47:20 +00:00
										 |  |  |    - name is the module name | 
					
						
							|  |  |  |    - methods is the list of top-level functions | 
					
						
							|  |  |  |    - doc is the documentation string | 
					
						
							|  |  |  |    - passthrough is passed as self to functions defined in the module | 
					
						
							|  |  |  |    - api_version is the value of PYTHON_API_VERSION at the time the | 
					
						
							|  |  |  |      module was compiled | 
					
						
							| 
									
										
										
										
											1997-08-02 03:07:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Return value is a borrowed reference to the module object; or NULL | 
					
						
							|  |  |  |    if an error occurred (in Python 1.4 and before, errors were fatal). | 
					
						
							|  |  |  |    Errors may still leak memory. | 
					
						
							| 
									
										
										
										
											1995-01-07 12:43:18 +00:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											1994-08-30 08:27:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-09 17:47:20 +00:00
										 |  |  | static char api_version_warning[] = | 
					
						
							| 
									
										
										
										
											2001-07-31 13:24:44 +00:00
										 |  |  | "Python C API version mismatch for module %.100s:\
 | 
					
						
							|  |  |  |  This Python has API version %d, module %.100s has version %d."; | 
					
						
							| 
									
										
										
										
											1995-01-09 17:47:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | Py_InitModule4(const char *name, PyMethodDef *methods, const char *doc, | 
					
						
							| 
									
										
										
										
											2000-07-22 18:47:25 +00:00
										 |  |  | 	       PyObject *passthrough, int module_api_version) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2003-01-31 18:33:18 +00:00
										 |  |  | 	PyObject *m, *d, *v, *n; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyMethodDef *ml; | 
					
						
							| 
									
										
										
										
											2000-08-04 14:00:14 +00:00
										 |  |  | 	if (!Py_IsInitialized()) | 
					
						
							|  |  |  | 	    Py_FatalError("Interpreter not initialized (version mismatch?)"); | 
					
						
							| 
									
										
										
										
											2001-07-31 13:24:44 +00:00
										 |  |  | 	if (module_api_version != PYTHON_API_VERSION) { | 
					
						
							|  |  |  | 		char message[512]; | 
					
						
							|  |  |  | 		PyOS_snprintf(message, sizeof(message),  | 
					
						
							|  |  |  | 			      api_version_warning, name,  | 
					
						
							|  |  |  | 			      PYTHON_API_VERSION, name,  | 
					
						
							|  |  |  | 			      module_api_version); | 
					
						
							|  |  |  | 		if (PyErr_Warn(PyExc_RuntimeWarning, message))  | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2003-01-31 18:33:18 +00:00
										 |  |  | 	/* Make sure name is fully qualified.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	   This is a bit of a hack: when the shared library is loaded, | 
					
						
							|  |  |  | 	   the module name is "package.module", but the module calls | 
					
						
							|  |  |  | 	   Py_InitModule*() with just "module" for the name.  The shared | 
					
						
							|  |  |  | 	   library loader squirrels away the true name of the module in | 
					
						
							|  |  |  | 	   _Py_PackageContext, and Py_InitModule*() will substitute this | 
					
						
							|  |  |  | 	   (if the name actually matches). | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											1997-11-19 18:53:33 +00:00
										 |  |  | 	if (_Py_PackageContext != NULL) { | 
					
						
							|  |  |  | 		char *p = strrchr(_Py_PackageContext, '.'); | 
					
						
							|  |  |  | 		if (p != NULL && strcmp(name, p+1) == 0) { | 
					
						
							|  |  |  | 			name = _Py_PackageContext; | 
					
						
							|  |  |  | 			_Py_PackageContext = NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-08-02 03:07:46 +00:00
										 |  |  | 	if ((m = PyImport_AddModule(name)) == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	d = PyModule_GetDict(m); | 
					
						
							| 
									
										
										
										
											2002-08-14 20:57:56 +00:00
										 |  |  | 	if (methods != NULL) { | 
					
						
							| 
									
										
										
										
											2003-01-31 18:33:18 +00:00
										 |  |  | 		n = PyString_FromString(name); | 
					
						
							|  |  |  | 		if (n == NULL) | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							| 
									
										
										
										
											2002-08-14 20:57:56 +00:00
										 |  |  | 		for (ml = methods; ml->ml_name != NULL; ml++) { | 
					
						
							|  |  |  | 			if ((ml->ml_flags & METH_CLASS) || | 
					
						
							|  |  |  | 			    (ml->ml_flags & METH_STATIC)) { | 
					
						
							|  |  |  | 				PyErr_SetString(PyExc_ValueError, | 
					
						
							|  |  |  | 						"module functions cannot set" | 
					
						
							|  |  |  | 						" METH_CLASS or METH_STATIC"); | 
					
						
							| 
									
										
										
										
											2006-03-01 21:33:54 +00:00
										 |  |  | 				Py_DECREF(n); | 
					
						
							| 
									
										
										
										
											2002-08-14 20:57:56 +00:00
										 |  |  | 				return NULL; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2003-01-31 18:33:18 +00:00
										 |  |  | 			v = PyCFunction_NewEx(ml, passthrough, n); | 
					
						
							| 
									
										
										
										
											2006-03-01 21:33:54 +00:00
										 |  |  | 			if (v == NULL) { | 
					
						
							|  |  |  | 				Py_DECREF(n); | 
					
						
							| 
									
										
										
										
											2002-08-14 20:57:56 +00:00
										 |  |  | 				return NULL; | 
					
						
							| 
									
										
										
										
											2006-03-01 21:33:54 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2002-08-14 20:57:56 +00:00
										 |  |  | 			if (PyDict_SetItemString(d, ml->ml_name, v) != 0) { | 
					
						
							|  |  |  | 				Py_DECREF(v); | 
					
						
							| 
									
										
										
										
											2006-03-01 21:33:54 +00:00
										 |  |  | 				Py_DECREF(n); | 
					
						
							| 
									
										
										
										
											2002-08-14 20:57:56 +00:00
										 |  |  | 				return NULL; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2001-08-04 03:11:25 +00:00
										 |  |  | 			Py_DECREF(v); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2005-11-20 23:58:38 +00:00
										 |  |  | 		Py_DECREF(n); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-01-07 12:43:18 +00:00
										 |  |  | 	if (doc != NULL) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		v = PyString_FromString(doc); | 
					
						
							| 
									
										
										
										
											2001-08-04 03:11:25 +00:00
										 |  |  | 		if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) { | 
					
						
							| 
									
										
										
										
											2002-12-15 13:45:32 +00:00
										 |  |  | 			Py_XDECREF(v); | 
					
						
							| 
									
										
										
										
											1997-08-02 03:07:46 +00:00
										 |  |  | 			return NULL; | 
					
						
							| 
									
										
										
										
											2001-08-04 03:11:25 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		Py_DECREF(v); | 
					
						
							| 
									
										
										
										
											1995-01-07 12:43:18 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	return m; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-02-08 15:49:17 +00:00
										 |  |  | /* Helper for mkvalue() to scan the length of a format */ | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-30 15:08:25 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | countformat(const char *format, int endchar) | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int count = 0; | 
					
						
							|  |  |  | 	int level = 0; | 
					
						
							|  |  |  | 	while (level > 0 || *format != endchar) { | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		switch (*format) { | 
					
						
							|  |  |  | 		case '\0': | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 			/* Premature end */ | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  | 					"unmatched paren in format"); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 			return -1; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		case '(': | 
					
						
							|  |  |  | 		case '[': | 
					
						
							|  |  |  | 		case '{': | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 			if (level == 0) | 
					
						
							|  |  |  | 				count++; | 
					
						
							|  |  |  | 			level++; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		case ')': | 
					
						
							|  |  |  | 		case ']': | 
					
						
							|  |  |  | 		case '}': | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 			level--; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		case '#': | 
					
						
							| 
									
										
										
										
											1995-01-20 16:56:02 +00:00
										 |  |  | 		case '&': | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		case ',': | 
					
						
							|  |  |  | 		case ':': | 
					
						
							|  |  |  | 		case ' ': | 
					
						
							|  |  |  | 		case '\t': | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			if (level == 0) | 
					
						
							|  |  |  | 				count++; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 		format++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return count; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Generic function to create a value -- the inverse of getargs() */ | 
					
						
							|  |  |  | /* After an original idea and first implementation by Steven Miale */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | static PyObject *do_mktuple(const char**, va_list *, int, int); | 
					
						
							|  |  |  | static PyObject *do_mklist(const char**, va_list *, int, int); | 
					
						
							|  |  |  | static PyObject *do_mkdict(const char**, va_list *, int, int); | 
					
						
							|  |  |  | static PyObject *do_mkvalue(const char**, va_list *); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | do_mkdict(const char **p_format, va_list *p_va, int endchar, int n) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject *d; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	int itemfailed = 0; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	if (n < 0) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	if ((d = PyDict_New()) == NULL) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	/* Note that we can't bail immediately on error as this will leak
 | 
					
						
							|  |  |  | 	   refcounts on any 'N' arguments. */ | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	for (i = 0; i < n; i+= 2) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyObject *k, *v; | 
					
						
							| 
									
										
										
										
											1997-11-20 20:35:45 +00:00
										 |  |  | 		int err; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		k = do_mkvalue(p_format, p_va); | 
					
						
							|  |  |  | 		if (k == NULL) { | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 			itemfailed = 1; | 
					
						
							|  |  |  | 			Py_INCREF(Py_None); | 
					
						
							|  |  |  | 			k = Py_None; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		v = do_mkvalue(p_format, p_va); | 
					
						
							|  |  |  | 		if (v == NULL) { | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 			itemfailed = 1; | 
					
						
							|  |  |  | 			Py_INCREF(Py_None); | 
					
						
							|  |  |  | 			v = Py_None; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1997-11-20 20:35:45 +00:00
										 |  |  | 		err = PyDict_SetItem(d, k, v); | 
					
						
							|  |  |  | 		Py_DECREF(k); | 
					
						
							|  |  |  | 		Py_DECREF(v); | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 		if (err < 0 || itemfailed) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			Py_DECREF(d); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (d != NULL && **p_format != endchar) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		Py_DECREF(d); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		d = NULL; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  | 				"Unmatched paren in format"); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else if (endchar) | 
					
						
							|  |  |  | 		++*p_format; | 
					
						
							|  |  |  | 	return d; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | do_mklist(const char **p_format, va_list *p_va, int endchar, int n) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject *v; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	int itemfailed = 0; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	if (n < 0) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	if ((v = PyList_New(n)) == NULL) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	/* Note that we can't bail immediately on error as this will leak
 | 
					
						
							|  |  |  | 	   refcounts on any 'N' arguments. */ | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	for (i = 0; i < n; i++) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyObject *w = do_mkvalue(p_format, p_va); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		if (w == NULL) { | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 			itemfailed = 1; | 
					
						
							|  |  |  | 			Py_INCREF(Py_None); | 
					
						
							|  |  |  | 			w = Py_None; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyList_SetItem(v, i, w); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (v != NULL && **p_format != endchar) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		Py_DECREF(v); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		v = NULL; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  | 				"Unmatched paren in format"); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else if (endchar) | 
					
						
							|  |  |  | 		++*p_format; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	if (itemfailed) { | 
					
						
							|  |  |  | 		Py_DECREF(v); | 
					
						
							|  |  |  | 		v = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #ifdef Py_USING_UNICODE
 | 
					
						
							| 
									
										
										
										
											2000-04-28 14:42:37 +00:00
										 |  |  | static int | 
					
						
							|  |  |  | _ustrlen(Py_UNICODE *u) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i = 0; | 
					
						
							|  |  |  | 	Py_UNICODE *v = u; | 
					
						
							|  |  |  | 	while (*v != 0) { i++; v++; }  | 
					
						
							|  |  |  | 	return i; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-04-28 14:42:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | do_mktuple(const char **p_format, va_list *p_va, int endchar, int n) | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject *v; | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	int itemfailed = 0; | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	if (n < 0) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	if ((v = PyTuple_New(n)) == NULL) | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	/* Note that we can't bail immediately on error as this will leak
 | 
					
						
							|  |  |  | 	   refcounts on any 'N' arguments. */ | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	for (i = 0; i < n; i++) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyObject *w = do_mkvalue(p_format, p_va); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 		if (w == NULL) { | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 			itemfailed = 1; | 
					
						
							|  |  |  | 			Py_INCREF(Py_None); | 
					
						
							|  |  |  | 			w = Py_None; | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyTuple_SetItem(v, i, w); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (v != NULL && **p_format != endchar) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		Py_DECREF(v); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 		v = NULL; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  | 				"Unmatched paren in format"); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else if (endchar) | 
					
						
							|  |  |  | 		++*p_format; | 
					
						
							| 
									
										
										
										
											2004-07-14 11:28:06 +00:00
										 |  |  | 	if (itemfailed) { | 
					
						
							|  |  |  | 		Py_DECREF(v); | 
					
						
							|  |  |  | 		v = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | do_mkvalue(const char **p_format, va_list *p_va) | 
					
						
							| 
									
										
										
										
											1992-05-15 11:04:59 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	for (;;) { | 
					
						
							|  |  |  | 		switch (*(*p_format)++) { | 
					
						
							|  |  |  | 		case '(': | 
					
						
							|  |  |  | 			return do_mktuple(p_format, p_va, ')', | 
					
						
							|  |  |  | 					  countformat(*p_format, ')')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case '[': | 
					
						
							|  |  |  | 			return do_mklist(p_format, p_va, ']', | 
					
						
							|  |  |  | 					 countformat(*p_format, ']')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case '{': | 
					
						
							|  |  |  | 			return do_mkdict(p_format, p_va, '}', | 
					
						
							|  |  |  | 					 countformat(*p_format, '}')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case 'b': | 
					
						
							| 
									
										
										
										
											2000-09-15 12:51:01 +00:00
										 |  |  | 		case 'B': | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		case 'h': | 
					
						
							|  |  |  | 		case 'i': | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			return PyInt_FromLong((long)va_arg(*p_va, int)); | 
					
						
							| 
									
										
										
										
											2000-07-06 12:22:00 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 		case 'H': | 
					
						
							|  |  |  | 			return PyInt_FromLong((long)va_arg(*p_va, unsigned int)); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-24 15:37:42 +00:00
										 |  |  | 		case 'I': | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			unsigned int n; | 
					
						
							|  |  |  | 			n = va_arg(*p_va, unsigned int); | 
					
						
							| 
									
										
										
										
											2005-12-24 06:23:41 +00:00
										 |  |  | 			if (n > (unsigned long)PyInt_GetMax()) | 
					
						
							| 
									
										
										
										
											2005-11-24 15:37:42 +00:00
										 |  |  | 				return PyLong_FromUnsignedLong((unsigned long)n); | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				return PyInt_FromLong(n); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | 		case 'n': | 
					
						
							|  |  |  | #if SIZEOF_SIZE_T!=SIZEOF_LONG
 | 
					
						
							| 
									
										
										
										
											2006-02-16 14:37:16 +00:00
										 |  |  | 			return PyInt_FromSsize_t(va_arg(*p_va, Py_ssize_t)); | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 			/* Fall through from 'n' to 'l' if Py_ssize_t is long */ | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		case 'l': | 
					
						
							| 
									
										
										
										
											2005-11-24 15:37:42 +00:00
										 |  |  | 			return PyInt_FromLong(va_arg(*p_va, long)); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-17 22:01:10 +00:00
										 |  |  | 		case 'k': | 
					
						
							| 
									
										
										
										
											2005-11-24 15:37:42 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			unsigned long n; | 
					
						
							|  |  |  | 			n = va_arg(*p_va, unsigned long); | 
					
						
							| 
									
										
										
										
											2005-12-24 06:23:41 +00:00
										 |  |  | 			if (n > (unsigned long)PyInt_GetMax()) | 
					
						
							| 
									
										
										
										
											2005-11-24 15:37:42 +00:00
										 |  |  | 				return PyLong_FromUnsignedLong(n); | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				return PyInt_FromLong(n); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2003-04-17 22:01:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-25 21:48:56 +00:00
										 |  |  | #ifdef HAVE_LONG_LONG
 | 
					
						
							| 
									
										
										
										
											1998-08-04 22:46:29 +00:00
										 |  |  | 		case 'L': | 
					
						
							| 
									
										
										
										
											2003-03-29 10:06:18 +00:00
										 |  |  | 			return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG)); | 
					
						
							| 
									
										
										
										
											2003-04-17 22:01:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case 'K': | 
					
						
							| 
									
										
										
										
											2005-11-24 15:37:42 +00:00
										 |  |  | 			return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG)); | 
					
						
							| 
									
										
										
										
											1998-08-04 22:46:29 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #ifdef Py_USING_UNICODE
 | 
					
						
							| 
									
										
										
										
											2000-04-28 14:42:37 +00:00
										 |  |  | 		case 'u': | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			PyObject *v; | 
					
						
							|  |  |  | 			Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *); | 
					
						
							|  |  |  | 			int n; | 
					
						
							|  |  |  | 			if (**p_format == '#') { | 
					
						
							|  |  |  | 				++*p_format; | 
					
						
							|  |  |  | 				n = va_arg(*p_va, int); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				n = -1; | 
					
						
							|  |  |  | 			if (u == NULL) { | 
					
						
							|  |  |  | 				v = Py_None; | 
					
						
							|  |  |  | 				Py_INCREF(v); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							|  |  |  | 				if (n < 0) | 
					
						
							|  |  |  | 					n = _ustrlen(u); | 
					
						
							|  |  |  | 				v = PyUnicode_FromUnicode(u, n); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return v; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		case 'f': | 
					
						
							|  |  |  | 		case 'd': | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			return PyFloat_FromDouble( | 
					
						
							|  |  |  | 				(double)va_arg(*p_va, va_double)); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-12 21:03:26 +00:00
										 |  |  | #ifndef WITHOUT_COMPLEX
 | 
					
						
							|  |  |  | 		case 'D': | 
					
						
							|  |  |  | 			return PyComplex_FromCComplex( | 
					
						
							|  |  |  | 				*((Py_complex *)va_arg(*p_va, Py_complex *))); | 
					
						
							|  |  |  | #endif /* WITHOUT_COMPLEX */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		case 'c': | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			char p[1]; | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | 			p[0] = (char)va_arg(*p_va, int); | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			return PyString_FromStringAndSize(p, 1); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case 's': | 
					
						
							|  |  |  | 		case 'z': | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			PyObject *v; | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | 			char *str = va_arg(*p_va, char *); | 
					
						
							|  |  |  | 			int n; | 
					
						
							|  |  |  | 			if (**p_format == '#') { | 
					
						
							|  |  |  | 				++*p_format; | 
					
						
							|  |  |  | 				n = va_arg(*p_va, int); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				n = -1; | 
					
						
							|  |  |  | 			if (str == NULL) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = Py_None; | 
					
						
							|  |  |  | 				Py_INCREF(v); | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							| 
									
										
										
										
											2000-06-28 22:07:35 +00:00
										 |  |  | 				if (n < 0) { | 
					
						
							|  |  |  | 					size_t m = strlen(str); | 
					
						
							|  |  |  | 					if (m > INT_MAX) { | 
					
						
							|  |  |  | 						PyErr_SetString(PyExc_OverflowError, | 
					
						
							|  |  |  | 							"string too long for Python string"); | 
					
						
							|  |  |  | 						return NULL; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					n = (int)m; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyString_FromStringAndSize(str, n); | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 			return v; | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-23 05:01:38 +00:00
										 |  |  | 		case 'N': | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		case 'S': | 
					
						
							|  |  |  | 		case 'O': | 
					
						
							| 
									
										
										
										
											1995-01-20 16:56:02 +00:00
										 |  |  | 		if (**p_format == '&') { | 
					
						
							| 
									
										
										
										
											2000-07-09 03:09:57 +00:00
										 |  |  | 			typedef PyObject *(*converter)(void *); | 
					
						
							| 
									
										
										
										
											1995-01-20 16:56:02 +00:00
										 |  |  | 			converter func = va_arg(*p_va, converter); | 
					
						
							|  |  |  | 			void *arg = va_arg(*p_va, void *); | 
					
						
							|  |  |  | 			++*p_format; | 
					
						
							|  |  |  | 			return (*func)(arg); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			PyObject *v; | 
					
						
							|  |  |  | 			v = va_arg(*p_va, PyObject *); | 
					
						
							| 
									
										
										
										
											1998-12-23 19:53:45 +00:00
										 |  |  | 			if (v != NULL) { | 
					
						
							| 
									
										
										
										
											1998-12-23 05:01:38 +00:00
										 |  |  | 				if (*(*p_format - 1) != 'N') | 
					
						
							|  |  |  | 					Py_INCREF(v); | 
					
						
							| 
									
										
										
										
											1998-12-23 19:53:45 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			else if (!PyErr_Occurred()) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 				/* If a NULL was passed
 | 
					
						
							|  |  |  | 				 * because a call that should | 
					
						
							|  |  |  | 				 * have constructed a value | 
					
						
							|  |  |  | 				 * failed, that's OK, and we | 
					
						
							|  |  |  | 				 * pass the error on; but if | 
					
						
							|  |  |  | 				 * no error occurred it's not | 
					
						
							|  |  |  | 				 * clear that the caller knew | 
					
						
							|  |  |  | 				 * what she was doing. */ | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				PyErr_SetString(PyExc_SystemError, | 
					
						
							| 
									
										
										
										
											1998-07-07 22:32:19 +00:00
										 |  |  | 					"NULL object passed to Py_BuildValue"); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 			return v; | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case ':': | 
					
						
							|  |  |  | 		case ',': | 
					
						
							|  |  |  | 		case ' ': | 
					
						
							|  |  |  | 		case '\t': | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		default: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			PyErr_SetString(PyExc_SystemError, | 
					
						
							| 
									
										
										
										
											1998-07-07 22:32:19 +00:00
										 |  |  | 				"bad format char passed to Py_BuildValue"); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 			return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-30 15:08:25 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | Py_BuildValue(const char *format, ...) | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	va_list va; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject* retval; | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	va_start(va, format); | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	retval = Py_VaBuildValue(format, va); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 	va_end(va); | 
					
						
							|  |  |  | 	return retval; | 
					
						
							| 
									
										
										
										
											1992-04-13 10:48:55 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1993-03-16 12:15:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | Py_VaBuildValue(const char *format, va_list va) | 
					
						
							| 
									
										
										
										
											1993-03-16 12:15:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | 	const char *f = format; | 
					
						
							| 
									
										
										
										
											1993-03-16 12:15:04 +00:00
										 |  |  | 	int n = countformat(f, '\0'); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	va_list lva; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef VA_LIST_IS_ARRAY
 | 
					
						
							|  |  |  | 	memcpy(lva, va, sizeof(va_list)); | 
					
						
							| 
									
										
										
										
											2002-07-28 10:23:27 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #ifdef __va_copy
 | 
					
						
							|  |  |  | 	__va_copy(lva, va); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 	lva = va; | 
					
						
							| 
									
										
										
										
											2002-07-28 10:23:27 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-03-16 12:15:04 +00:00
										 |  |  | 	if (n < 0) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	if (n == 0) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		Py_INCREF(Py_None); | 
					
						
							|  |  |  | 		return Py_None; | 
					
						
							| 
									
										
										
										
											1993-03-16 12:15:04 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (n == 1) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		return do_mkvalue(&f, &lva); | 
					
						
							|  |  |  | 	return do_mktuple(&f, &lva, '\0', n); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | PyEval_CallFunction(PyObject *obj, const char *format, ...) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	va_list vargs; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject *args; | 
					
						
							|  |  |  | 	PyObject *res; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	va_start(vargs, format); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	args = Py_VaBuildValue(format, vargs); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	va_end(vargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (args == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	res = PyEval_CallObject(obj, args); | 
					
						
							|  |  |  | 	Py_DECREF(args); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | PyEval_CallMethod(PyObject *obj, const char *methodname, const char *format, ...) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	va_list vargs; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject *meth; | 
					
						
							|  |  |  | 	PyObject *args; | 
					
						
							|  |  |  | 	PyObject *res; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-08-08 20:51:26 +00:00
										 |  |  | 	meth = PyObject_GetAttrString(obj, methodname); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	if (meth == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	va_start(vargs, format); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	args = Py_VaBuildValue(format, vargs); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 	va_end(vargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (args == NULL) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 		Py_DECREF(meth); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	res = PyEval_CallObject(meth, args); | 
					
						
							|  |  |  | 	Py_DECREF(meth); | 
					
						
							|  |  |  | 	Py_DECREF(args); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return res; | 
					
						
							| 
									
										
										
										
											1993-03-16 12:15:04 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | PyModule_AddObject(PyObject *m, const char *name, PyObject *o) | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	PyObject *dict; | 
					
						
							| 
									
										
										
										
											2003-06-21 21:35:25 +00:00
										 |  |  | 	if (!PyModule_Check(m)) { | 
					
						
							| 
									
										
										
										
											2002-06-17 17:16:57 +00:00
										 |  |  | 		PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 			    "PyModule_AddObject() needs module as first arg"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2003-06-21 21:35:25 +00:00
										 |  |  | 	if (!o) { | 
					
						
							| 
									
										
										
										
											2003-10-24 20:05:32 +00:00
										 |  |  | 		if (!PyErr_Occurred()) | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 					"PyModule_AddObject() needs non-NULL value"); | 
					
						
							| 
									
										
										
										
											2003-06-21 21:35:25 +00:00
										 |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | 	dict = PyModule_GetDict(m); | 
					
						
							| 
									
										
										
										
											2002-06-17 17:16:57 +00:00
										 |  |  | 	if (dict == NULL) { | 
					
						
							|  |  |  | 		/* Internal error -- modules must have a dict! */ | 
					
						
							|  |  |  | 		PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", | 
					
						
							|  |  |  | 			     PyModule_GetName(m)); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (PyDict_SetItemString(dict, name, o)) | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | 		return -1; | 
					
						
							| 
									
										
										
										
											2002-06-17 17:16:57 +00:00
										 |  |  | 	Py_DECREF(o); | 
					
						
							|  |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int  | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | PyModule_AddIntConstant(PyObject *m, const char *name, long value) | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return PyModule_AddObject(m, name, PyInt_FromLong(value)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int  | 
					
						
							| 
									
										
										
										
											2005-12-10 18:50:16 +00:00
										 |  |  | PyModule_AddStringConstant(PyObject *m, const char *name, const char *value) | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return PyModule_AddObject(m, name, PyString_FromString(value)); | 
					
						
							|  |  |  | } |