| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | #define FLAG_SIZE_T 1
 | 
					
						
							| 
									
										
										
										
											1994-08-30 08:27:36 +00:00
										 |  |  | typedef double va_double; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | static PyObject *va_build_value(const char *, va_list, int); | 
					
						
							| 
									
										
										
										
											2016-12-09 00:29:49 +01:00
										 |  |  | static PyObject **va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, const char *, va_list, int, Py_ssize_t*); | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-11-19 18:53:33 +00:00
										 |  |  | /* Package context -- the full module name for package imports */ | 
					
						
							| 
									
										
										
										
											2016-11-21 10:25:54 +02:00
										 |  |  | const char *_Py_PackageContext = NULL; | 
					
						
							| 
									
										
										
										
											1997-11-19 18:53:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-30 09:15:31 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | _Py_convert_optional_to_ssize_t(PyObject *obj, void *result) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Py_ssize_t limit; | 
					
						
							|  |  |  |     if (obj == Py_None) { | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (PyIndex_Check(obj)) { | 
					
						
							|  |  |  |         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError); | 
					
						
							|  |  |  |         if (limit == -1 && PyErr_Occurred()) { | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         PyErr_Format(PyExc_TypeError, | 
					
						
							|  |  |  |                      "argument should be integer or None, not '%.200s'", | 
					
						
							|  |  |  |                      Py_TYPE(obj)->tp_name); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     *((Py_ssize_t *)result) = limit; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  | static Py_ssize_t | 
					
						
							| 
									
										
										
										
											2016-12-09 00:27:22 +01:00
										 |  |  | countformat(const char *format, char endchar) | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     Py_ssize_t count = 0; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     int level = 0; | 
					
						
							|  |  |  |     while (level > 0 || *format != endchar) { | 
					
						
							|  |  |  |         switch (*format) { | 
					
						
							|  |  |  |         case '\0': | 
					
						
							|  |  |  |             /* Premature end */ | 
					
						
							|  |  |  |             PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                             "unmatched paren in format"); | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         case '(': | 
					
						
							|  |  |  |         case '[': | 
					
						
							|  |  |  |         case '{': | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |             if (level == 0) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                 count++; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             level++; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case ')': | 
					
						
							|  |  |  |         case ']': | 
					
						
							|  |  |  |         case '}': | 
					
						
							|  |  |  |             level--; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case '#': | 
					
						
							|  |  |  |         case '&': | 
					
						
							|  |  |  |         case ',': | 
					
						
							|  |  |  |         case ':': | 
					
						
							|  |  |  |         case ' ': | 
					
						
							|  |  |  |         case '\t': | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |             if (level == 0) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                 count++; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         format++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return count; | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Generic function to create a value -- the inverse of getargs() */ | 
					
						
							|  |  |  | /* After an original idea and first implementation by Steven Miale */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-09 00:27:22 +01:00
										 |  |  | static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t, int); | 
					
						
							| 
									
										
										
										
											2016-12-09 00:29:49 +01:00
										 |  |  | static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t, int); | 
					
						
							| 
									
										
										
										
											2016-12-09 00:27:22 +01:00
										 |  |  | static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t, int); | 
					
						
							|  |  |  | static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t, int); | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | static PyObject *do_mkvalue(const char**, va_list *, int); | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2016-12-09 00:27:22 +01:00
										 |  |  | do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags) | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  | { | 
					
						
							|  |  |  |     PyObject *v; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     Py_ssize_t i; | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     assert(PyErr_Occurred()); | 
					
						
							|  |  |  |     v = PyTuple_New(n); | 
					
						
							|  |  |  |     for (i = 0; i < n; i++) { | 
					
						
							|  |  |  |         PyObject *exception, *value, *tb, *w; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         PyErr_Fetch(&exception, &value, &tb); | 
					
						
							|  |  |  |         w = do_mkvalue(p_format, p_va, flags); | 
					
						
							|  |  |  |         PyErr_Restore(exception, value, tb); | 
					
						
							|  |  |  |         if (w != NULL) { | 
					
						
							|  |  |  |             if (v != NULL) { | 
					
						
							|  |  |  |                 PyTuple_SET_ITEM(v, i, w); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 Py_DECREF(w); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     Py_XDECREF(v); | 
					
						
							|  |  |  |     if (**p_format != endchar) { | 
					
						
							|  |  |  |         PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                         "Unmatched paren in format"); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     if (endchar) { | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |         ++*p_format; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2016-12-09 00:27:22 +01:00
										 |  |  | do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *d; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     Py_ssize_t i; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (n < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     if (n % 2) { | 
					
						
							|  |  |  |         PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                         "Bad dict format"); | 
					
						
							|  |  |  |         do_ignore(p_format, p_va, endchar, n, flags); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* Note that we can't bail immediately on error as this will leak
 | 
					
						
							|  |  |  |        refcounts on any 'N' arguments. */ | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     if ((d = PyDict_New()) == NULL) { | 
					
						
							|  |  |  |         do_ignore(p_format, p_va, endchar, n, flags); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     for (i = 0; i < n; i+= 2) { | 
					
						
							|  |  |  |         PyObject *k, *v; | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         k = do_mkvalue(p_format, p_va, flags); | 
					
						
							|  |  |  |         if (k == NULL) { | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |             do_ignore(p_format, p_va, endchar, n - i - 1, flags); | 
					
						
							|  |  |  |             Py_DECREF(d); | 
					
						
							|  |  |  |             return NULL; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         v = do_mkvalue(p_format, p_va, flags); | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |         if (v == NULL || PyDict_SetItem(d, k, v) < 0) { | 
					
						
							|  |  |  |             do_ignore(p_format, p_va, endchar, n - i - 2, flags); | 
					
						
							|  |  |  |             Py_DECREF(k); | 
					
						
							|  |  |  |             Py_XDECREF(v); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             Py_DECREF(d); | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |         Py_DECREF(k); | 
					
						
							|  |  |  |         Py_DECREF(v); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     if (**p_format != endchar) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         Py_DECREF(d); | 
					
						
							|  |  |  |         PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                         "Unmatched paren in format"); | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     if (endchar) | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         ++*p_format; | 
					
						
							|  |  |  |     return d; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2016-12-09 00:27:22 +01:00
										 |  |  | do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags) | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *v; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     Py_ssize_t i; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (n < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     /* Note that we can't bail immediately on error as this will leak
 | 
					
						
							|  |  |  |        refcounts on any 'N' arguments. */ | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     v = PyList_New(n); | 
					
						
							|  |  |  |     if (v == NULL) { | 
					
						
							|  |  |  |         do_ignore(p_format, p_va, endchar, n, flags); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     for (i = 0; i < n; i++) { | 
					
						
							|  |  |  |         PyObject *w = do_mkvalue(p_format, p_va, flags); | 
					
						
							|  |  |  |         if (w == NULL) { | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |             do_ignore(p_format, p_va, endchar, n - i - 1, flags); | 
					
						
							|  |  |  |             Py_DECREF(v); | 
					
						
							|  |  |  |             return NULL; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         PyList_SET_ITEM(v, i, w); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (**p_format != endchar) { | 
					
						
							|  |  |  |         Py_DECREF(v); | 
					
						
							|  |  |  |         PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                         "Unmatched paren in format"); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (endchar) | 
					
						
							|  |  |  |         ++*p_format; | 
					
						
							|  |  |  |     return v; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-09 00:29:49 +01:00
										 |  |  | static int | 
					
						
							|  |  |  | do_mkstack(PyObject **stack, const char **p_format, va_list *p_va, | 
					
						
							|  |  |  |            char endchar, Py_ssize_t n, int flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Py_ssize_t i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (n < 0) { | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* Note that we can't bail immediately on error as this will leak
 | 
					
						
							|  |  |  |        refcounts on any 'N' arguments. */ | 
					
						
							|  |  |  |     for (i = 0; i < n; i++) { | 
					
						
							|  |  |  |         PyObject *w = do_mkvalue(p_format, p_va, flags); | 
					
						
							|  |  |  |         if (w == NULL) { | 
					
						
							|  |  |  |             do_ignore(p_format, p_va, endchar, n - i - 1, flags); | 
					
						
							|  |  |  |             goto error; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         stack[i] = w; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (**p_format != endchar) { | 
					
						
							|  |  |  |         PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                         "Unmatched paren in format"); | 
					
						
							|  |  |  |         goto error; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (endchar) { | 
					
						
							|  |  |  |         ++*p_format; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | error: | 
					
						
							|  |  |  |     n = i; | 
					
						
							|  |  |  |     for (i=0; i < n; i++) { | 
					
						
							|  |  |  |         Py_DECREF(stack[i]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2016-12-09 00:27:22 +01:00
										 |  |  | do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags) | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *v; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     Py_ssize_t i; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (n < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     /* Note that we can't bail immediately on error as this will leak
 | 
					
						
							|  |  |  |        refcounts on any 'N' arguments. */ | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |     if ((v = PyTuple_New(n)) == NULL) { | 
					
						
							|  |  |  |         do_ignore(p_format, p_va, endchar, n, flags); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     for (i = 0; i < n; i++) { | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |         PyObject *w = do_mkvalue(p_format, p_va, flags); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         if (w == NULL) { | 
					
						
							| 
									
										
										
										
											2016-05-20 22:31:14 +03:00
										 |  |  |             do_ignore(p_format, p_va, endchar, n - i - 1, flags); | 
					
						
							|  |  |  |             Py_DECREF(v); | 
					
						
							|  |  |  |             return NULL; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         PyTuple_SET_ITEM(v, i, w); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (**p_format != endchar) { | 
					
						
							|  |  |  |         Py_DECREF(v); | 
					
						
							|  |  |  |         PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                         "Unmatched paren in format"); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (endchar) | 
					
						
							|  |  |  |         ++*p_format; | 
					
						
							|  |  |  |     return v; | 
					
						
							| 
									
										
										
										
											1992-04-13 15:53:41 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | do_mkvalue(const char **p_format, va_list *p_va, int flags) | 
					
						
							| 
									
										
										
										
											1992-05-15 11:04:59 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     for (;;) { | 
					
						
							|  |  |  |         switch (*(*p_format)++) { | 
					
						
							|  |  |  |         case '(': | 
					
						
							|  |  |  |             return do_mktuple(p_format, p_va, ')', | 
					
						
							|  |  |  |                               countformat(*p_format, ')'), flags); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case '[': | 
					
						
							|  |  |  |             return do_mklist(p_format, p_va, ']', | 
					
						
							|  |  |  |                              countformat(*p_format, ']'), flags); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case '{': | 
					
						
							|  |  |  |             return do_mkdict(p_format, p_va, '}', | 
					
						
							|  |  |  |                              countformat(*p_format, '}'), flags); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'b': | 
					
						
							|  |  |  |         case 'B': | 
					
						
							|  |  |  |         case 'h': | 
					
						
							|  |  |  |         case 'i': | 
					
						
							|  |  |  |             return PyLong_FromLong((long)va_arg(*p_va, int)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'H': | 
					
						
							|  |  |  |             return PyLong_FromLong((long)va_arg(*p_va, unsigned int)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'I': | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             unsigned int n; | 
					
						
							|  |  |  |             n = va_arg(*p_va, unsigned int); | 
					
						
							|  |  |  |             return PyLong_FromUnsignedLong(n); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'n': | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | #if SIZEOF_SIZE_T!=SIZEOF_LONG
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t)); | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             /* Fall through from 'n' to 'l' if Py_ssize_t is long */ | 
					
						
							|  |  |  |         case 'l': | 
					
						
							|  |  |  |             return PyLong_FromLong(va_arg(*p_va, long)); | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         case 'k': | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             unsigned long n; | 
					
						
							|  |  |  |             n = va_arg(*p_va, unsigned long); | 
					
						
							|  |  |  |             return PyLong_FromUnsignedLong(n); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-04-17 22:01:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         case 'L': | 
					
						
							| 
									
										
										
										
											2016-09-06 10:46:49 -07:00
										 |  |  |             return PyLong_FromLongLong((long long)va_arg(*p_va, long long)); | 
					
						
							| 
									
										
										
										
											2003-04-17 22:01:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         case 'K': | 
					
						
							| 
									
										
										
										
											2016-09-06 10:46:49 -07:00
										 |  |  |             return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long)); | 
					
						
							| 
									
										
										
										
											2016-09-05 17:44:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         case 'u': | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             PyObject *v; | 
					
						
							|  |  |  |             Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *); | 
					
						
							|  |  |  |             Py_ssize_t n; | 
					
						
							|  |  |  |             if (**p_format == '#') { | 
					
						
							|  |  |  |                 ++*p_format; | 
					
						
							|  |  |  |                 if (flags & FLAG_SIZE_T) | 
					
						
							|  |  |  |                     n = va_arg(*p_va, Py_ssize_t); | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     n = va_arg(*p_va, int); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 n = -1; | 
					
						
							|  |  |  |             if (u == NULL) { | 
					
						
							|  |  |  |                 v = Py_None; | 
					
						
							|  |  |  |                 Py_INCREF(v); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 if (n < 0) | 
					
						
							| 
									
										
										
										
											2016-11-20 12:16:46 +02:00
										 |  |  |                     n = wcslen(u); | 
					
						
							|  |  |  |                 v = PyUnicode_FromWideChar(u, n); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             return v; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         case 'f': | 
					
						
							|  |  |  |         case 'd': | 
					
						
							|  |  |  |             return PyFloat_FromDouble( | 
					
						
							|  |  |  |                 (double)va_arg(*p_va, va_double)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'D': | 
					
						
							|  |  |  |             return PyComplex_FromCComplex( | 
					
						
							|  |  |  |                 *((Py_complex *)va_arg(*p_va, Py_complex *))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'c': | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             char p[1]; | 
					
						
							|  |  |  |             p[0] = (char)va_arg(*p_va, int); | 
					
						
							|  |  |  |             return PyBytes_FromStringAndSize(p, 1); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         case 'C': | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             int i = va_arg(*p_va, int); | 
					
						
							|  |  |  |             return PyUnicode_FromOrdinal(i); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 's': | 
					
						
							|  |  |  |         case 'z': | 
					
						
							| 
									
										
										
										
											2010-06-07 19:57:46 +00:00
										 |  |  |         case 'U':   /* XXX deprecated alias */ | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             PyObject *v; | 
					
						
							| 
									
										
										
										
											2015-12-25 20:01:53 +02:00
										 |  |  |             const char *str = va_arg(*p_va, const char *); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             Py_ssize_t n; | 
					
						
							|  |  |  |             if (**p_format == '#') { | 
					
						
							|  |  |  |                 ++*p_format; | 
					
						
							|  |  |  |                 if (flags & FLAG_SIZE_T) | 
					
						
							|  |  |  |                     n = va_arg(*p_va, Py_ssize_t); | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     n = va_arg(*p_va, int); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 n = -1; | 
					
						
							|  |  |  |             if (str == NULL) { | 
					
						
							|  |  |  |                 v = Py_None; | 
					
						
							|  |  |  |                 Py_INCREF(v); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 if (n < 0) { | 
					
						
							|  |  |  |                     size_t m = strlen(str); | 
					
						
							|  |  |  |                     if (m > PY_SSIZE_T_MAX) { | 
					
						
							|  |  |  |                         PyErr_SetString(PyExc_OverflowError, | 
					
						
							|  |  |  |                             "string too long for Python string"); | 
					
						
							|  |  |  |                         return NULL; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     n = (Py_ssize_t)m; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 v = PyUnicode_FromStringAndSize(str, n); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return v; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'y': | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             PyObject *v; | 
					
						
							| 
									
										
										
										
											2015-12-25 20:01:53 +02:00
										 |  |  |             const char *str = va_arg(*p_va, const char *); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             Py_ssize_t n; | 
					
						
							|  |  |  |             if (**p_format == '#') { | 
					
						
							|  |  |  |                 ++*p_format; | 
					
						
							|  |  |  |                 if (flags & FLAG_SIZE_T) | 
					
						
							|  |  |  |                     n = va_arg(*p_va, Py_ssize_t); | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     n = va_arg(*p_va, int); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 n = -1; | 
					
						
							|  |  |  |             if (str == NULL) { | 
					
						
							|  |  |  |                 v = Py_None; | 
					
						
							|  |  |  |                 Py_INCREF(v); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 if (n < 0) { | 
					
						
							|  |  |  |                     size_t m = strlen(str); | 
					
						
							|  |  |  |                     if (m > PY_SSIZE_T_MAX) { | 
					
						
							|  |  |  |                         PyErr_SetString(PyExc_OverflowError, | 
					
						
							|  |  |  |                             "string too long for Python bytes"); | 
					
						
							|  |  |  |                         return NULL; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     n = (Py_ssize_t)m; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 v = PyBytes_FromStringAndSize(str, n); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return v; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 'N': | 
					
						
							|  |  |  |         case 'S': | 
					
						
							|  |  |  |         case 'O': | 
					
						
							|  |  |  |         if (**p_format == '&') { | 
					
						
							|  |  |  |             typedef PyObject *(*converter)(void *); | 
					
						
							|  |  |  |             converter func = va_arg(*p_va, converter); | 
					
						
							|  |  |  |             void *arg = va_arg(*p_va, void *); | 
					
						
							|  |  |  |             ++*p_format; | 
					
						
							|  |  |  |             return (*func)(arg); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             PyObject *v; | 
					
						
							|  |  |  |             v = va_arg(*p_va, PyObject *); | 
					
						
							|  |  |  |             if (v != NULL) { | 
					
						
							|  |  |  |                 if (*(*p_format - 1) != 'N') | 
					
						
							|  |  |  |                     Py_INCREF(v); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else if (!PyErr_Occurred()) | 
					
						
							|  |  |  |                 /* 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. */ | 
					
						
							|  |  |  |                 PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                     "NULL object passed to Py_BuildValue"); | 
					
						
							|  |  |  |             return v; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case ':': | 
					
						
							|  |  |  |         case ',': | 
					
						
							|  |  |  |         case ' ': | 
					
						
							|  |  |  |         case '\t': | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  |                 "bad format char passed to Py_BuildValue"); | 
					
						
							|  |  |  |             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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     va_list va; | 
					
						
							|  |  |  |     PyObject* retval; | 
					
						
							|  |  |  |     va_start(va, format); | 
					
						
							|  |  |  |     retval = va_build_value(format, va, 0); | 
					
						
							|  |  |  |     va_end(va); | 
					
						
							|  |  |  |     return retval; | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | _Py_BuildValue_SizeT(const char *format, ...) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     va_list va; | 
					
						
							|  |  |  |     PyObject* retval; | 
					
						
							|  |  |  |     va_start(va, format); | 
					
						
							|  |  |  |     retval = va_build_value(format, va, FLAG_SIZE_T); | 
					
						
							|  |  |  |     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) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return va_build_value(format, va, 0); | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | _Py_VaBuildValue_SizeT(const char *format, va_list va) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return va_build_value(format, va, FLAG_SIZE_T); | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | va_build_value(const char *format, va_list va, int flags) | 
					
						
							| 
									
										
										
										
											1993-03-16 12:15:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     const char *f = format; | 
					
						
							| 
									
										
										
										
											2016-12-09 00:24:47 +01:00
										 |  |  |     Py_ssize_t n = countformat(f, '\0'); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     va_list lva; | 
					
						
							| 
									
										
										
										
											2016-09-21 11:37:27 +02:00
										 |  |  |     PyObject *retval; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (n < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     if (n == 0) { | 
					
						
							| 
									
										
										
										
											2017-01-23 09:47:21 +02:00
										 |  |  |         Py_RETURN_NONE; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-21 11:37:27 +02:00
										 |  |  |     va_copy(lva, va); | 
					
						
							|  |  |  |     if (n == 1) { | 
					
						
							|  |  |  |         retval = do_mkvalue(&f, &lva, flags); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         retval = do_mktuple(&f, &lva, '\0', n, flags); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     va_end(lva); | 
					
						
							|  |  |  |     return retval; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-09 00:29:49 +01:00
										 |  |  | PyObject ** | 
					
						
							|  |  |  | _Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len, | 
					
						
							|  |  |  |                 const char *format, va_list va, Py_ssize_t *p_nargs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject ** | 
					
						
							|  |  |  | _Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len, | 
					
						
							|  |  |  |                        const char *format, va_list va, Py_ssize_t *p_nargs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject ** | 
					
						
							|  |  |  | va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, | 
					
						
							|  |  |  |                const char *format, va_list va, int flags, Py_ssize_t *p_nargs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *f; | 
					
						
							|  |  |  |     Py_ssize_t n; | 
					
						
							|  |  |  |     va_list lva; | 
					
						
							|  |  |  |     PyObject **stack; | 
					
						
							|  |  |  |     int res; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     n = countformat(format, '\0'); | 
					
						
							|  |  |  |     if (n < 0) { | 
					
						
							|  |  |  |         *p_nargs = 0; | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (n == 0) { | 
					
						
							|  |  |  |         *p_nargs = 0; | 
					
						
							|  |  |  |         return small_stack; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (n <= small_stack_len) { | 
					
						
							|  |  |  |         stack = small_stack; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         stack = PyMem_Malloc(n * sizeof(stack[0])); | 
					
						
							|  |  |  |         if (stack == NULL) { | 
					
						
							|  |  |  |             PyErr_NoMemory(); | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     va_copy(lva, va); | 
					
						
							|  |  |  |     f = format; | 
					
						
							|  |  |  |     res = do_mkstack(stack, &f, &lva, '\0', n, flags); | 
					
						
							|  |  |  |     va_end(lva); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (res < 0) { | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *p_nargs = n; | 
					
						
							|  |  |  |     return stack; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-02 19:04:15 +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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *dict; | 
					
						
							|  |  |  |     if (!PyModule_Check(m)) { | 
					
						
							|  |  |  |         PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  |                     "PyModule_AddObject() needs module as first arg"); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (!o) { | 
					
						
							|  |  |  |         if (!PyErr_Occurred()) | 
					
						
							|  |  |  |             PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  |                             "PyModule_AddObject() needs non-NULL value"); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dict = PyModule_GetDict(m); | 
					
						
							|  |  |  |     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)) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     Py_DECREF(o); | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52: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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *o = PyLong_FromLong(value); | 
					
						
							|  |  |  |     if (!o) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     if (PyModule_AddObject(m, name, o) == 0) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     Py_DECREF(o); | 
					
						
							|  |  |  |     return -1; | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | 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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *o = PyUnicode_FromString(value); | 
					
						
							|  |  |  |     if (!o) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     if (PyModule_AddObject(m, name, o) == 0) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     Py_DECREF(o); | 
					
						
							|  |  |  |     return -1; | 
					
						
							| 
									
										
										
										
											2000-09-23 03:24:27 +00:00
										 |  |  | } |