| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							| 
									
										
										
										
											1995-01-04 19:12:13 +00:00
										 |  |  | Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, | 
					
						
							|  |  |  | The Netherlands. | 
					
						
							| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         All Rights Reserved | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | Permission to use, copy, modify, and distribute this software and its | 
					
						
							|  |  |  | documentation for any purpose and without fee is hereby granted, | 
					
						
							| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | provided that the above copyright notice appear in all copies and that | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | both that copyright notice and this permission notice appear in | 
					
						
							| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | supporting documentation, and that the names of Stichting Mathematisch | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | Centrum or CWI or Corporation for National Research Initiatives or | 
					
						
							|  |  |  | CNRI not be used in advertising or publicity pertaining to | 
					
						
							|  |  |  | distribution of the software without specific, written prior | 
					
						
							|  |  |  | permission. | 
					
						
							| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | While CWI is the initial source for this software, a modified version | 
					
						
							|  |  |  | is made available by the Corporation for National Research Initiatives | 
					
						
							|  |  |  | (CNRI) at the Internet address ftp://ftp.python.org.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH | 
					
						
							|  |  |  | REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF | 
					
						
							|  |  |  | MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH | 
					
						
							|  |  |  | CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL | 
					
						
							|  |  |  | DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | 
					
						
							|  |  |  | PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | 
					
						
							|  |  |  | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | 
					
						
							|  |  |  | PERFORMANCE OF THIS SOFTWARE. | 
					
						
							| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | /* Map C struct members to Python object attributes */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "structmember.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1991-10-20 20:24:14 +00:00
										 |  |  | listmembers(mlist) | 
					
						
							|  |  |  | 	struct memberlist *mlist; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i, n; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject *v; | 
					
						
							| 
									
										
										
										
											1991-10-20 20:24:14 +00:00
										 |  |  | 	for (n = 0; mlist[n].name != NULL; n++) | 
					
						
							|  |  |  | 		; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	v = PyList_New(n); | 
					
						
							| 
									
										
										
										
											1991-10-20 20:24:14 +00:00
										 |  |  | 	if (v != NULL) { | 
					
						
							|  |  |  | 		for (i = 0; i < n; i++) | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			PyList_SetItem(v, i, | 
					
						
							|  |  |  | 				       PyString_FromString(mlist[i].name)); | 
					
						
							|  |  |  | 		if (PyErr_Occurred()) { | 
					
						
							|  |  |  | 			Py_DECREF(v); | 
					
						
							| 
									
										
										
										
											1991-10-20 20:24:14 +00:00
										 |  |  | 			v = NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			PyList_Sort(v); | 
					
						
							| 
									
										
										
										
											1991-10-20 20:24:14 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | PyObject * | 
					
						
							|  |  |  | PyMember_Get(addr, mlist, name) | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	char *addr; | 
					
						
							|  |  |  | 	struct memberlist *mlist; | 
					
						
							|  |  |  | 	char *name; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct memberlist *l; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1991-10-20 20:24:14 +00:00
										 |  |  | 	if (strcmp(name, "__members__") == 0) | 
					
						
							|  |  |  | 		return listmembers(mlist); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	for (l = mlist; l->name != NULL; l++) { | 
					
						
							|  |  |  | 		if (strcmp(l->name, name) == 0) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			PyObject *v; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			addr += l->offset; | 
					
						
							|  |  |  | 			switch (l->type) { | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_BYTE: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyInt_FromLong((long) | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 						 (((*(char*)addr & 0xff) | 
					
						
							|  |  |  | 						   ^ 0x80) - 0x80)); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case T_UBYTE: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyInt_FromLong((long) *(char*)addr & 0xff); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_SHORT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyInt_FromLong((long) *(short*)addr); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_USHORT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyInt_FromLong((long) | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 						 *(unsigned short*)addr); | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_INT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyInt_FromLong((long) *(int*)addr); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_UINT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyInt_FromLong((long) | 
					
						
							|  |  |  | 						   *(unsigned int*)addr); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_LONG: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyInt_FromLong(*(long*)addr); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_ULONG: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyLong_FromDouble((double) | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 						   *(unsigned long*)addr); | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_FLOAT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyFloat_FromDouble((double)*(float*)addr); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			case T_DOUBLE: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyFloat_FromDouble(*(double*)addr); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			case T_STRING: | 
					
						
							|  |  |  | 				if (*(char**)addr == NULL) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					Py_INCREF(Py_None); | 
					
						
							|  |  |  | 					v = Py_None; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				else | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					v = PyString_FromString(*(char**)addr); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1994-12-14 13:04:05 +00:00
										 |  |  | 			case T_STRING_INPLACE: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyString_FromString((char*)addr); | 
					
						
							| 
									
										
										
										
											1994-12-14 13:04:05 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | #ifdef macintosh
 | 
					
						
							|  |  |  | 			case T_PSTRING: | 
					
						
							|  |  |  | 				if (*(char**)addr == NULL) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					Py_INCREF(Py_None); | 
					
						
							|  |  |  | 					v = Py_None; | 
					
						
							| 
									
										
										
										
											1994-12-14 13:04:05 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				else | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					v = PyString_FromStringAndSize( | 
					
						
							|  |  |  | 						(*(char**)addr)+1, | 
					
						
							|  |  |  | 						**(unsigned char**)addr); | 
					
						
							| 
									
										
										
										
											1994-12-14 13:04:05 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			case T_PSTRING_INPLACE: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyString_FromStringAndSize( | 
					
						
							|  |  |  | 					((char*)addr)+1, | 
					
						
							|  |  |  | 					*(unsigned char*)addr); | 
					
						
							| 
									
										
										
										
											1994-12-14 13:04:05 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | #endif /* macintosh */
 | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_CHAR: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = PyString_FromStringAndSize((char*)addr, 1); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_OBJECT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				v = *(PyObject **)addr; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				if (v == NULL) | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					v = Py_None; | 
					
						
							|  |  |  | 				Py_INCREF(v); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			default: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  | 						"bad memberlist type"); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				v = NULL; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return v; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyErr_SetString(PyExc_AttributeError, name); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | PyMember_Set(addr, mlist, name, v) | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	char *addr; | 
					
						
							|  |  |  | 	struct memberlist *mlist; | 
					
						
							|  |  |  | 	char *name; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyObject *v; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	struct memberlist *l; | 
					
						
							| 
									
										
										
										
											1998-05-20 22:25:32 +00:00
										 |  |  | 	PyObject *oldv; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	for (l = mlist; l->name != NULL; l++) { | 
					
						
							|  |  |  | 		if (strcmp(l->name, name) == 0) { | 
					
						
							| 
									
										
										
										
											1994-12-14 13:04:05 +00:00
										 |  |  | #ifdef macintosh
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 			if (l->readonly || l->type == T_STRING || | 
					
						
							|  |  |  | 			    l->type == T_PSTRING) | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											1994-12-14 13:04:05 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 			if (l->readonly || l->type == T_STRING ) { | 
					
						
							|  |  |  | #endif /* macintosh */
 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 						"readonly attribute"); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				return -1; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											1994-08-30 08:27:36 +00:00
										 |  |  | 			if (v == NULL && l->type != T_OBJECT) { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				PyErr_SetString(PyExc_TypeError, | 
					
						
							| 
									
										
										
										
											1994-08-30 08:27:36 +00:00
										 |  |  | 				  "can't delete numeric/char attribute"); | 
					
						
							|  |  |  | 				return -1; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			addr += l->offset; | 
					
						
							|  |  |  | 			switch (l->type) { | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_BYTE: | 
					
						
							|  |  |  | 			case T_UBYTE: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (!PyInt_Check(v)) { | 
					
						
							|  |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				*(char*)addr = (char) PyInt_AsLong(v); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_SHORT: | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_USHORT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (!PyInt_Check(v)) { | 
					
						
							|  |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				*(short*)addr = (short) PyInt_AsLong(v); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_UINT: | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_INT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (!PyInt_Check(v)) { | 
					
						
							|  |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				*(int*)addr = (int) PyInt_AsLong(v); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			case T_LONG: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (!PyInt_Check(v)) { | 
					
						
							|  |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				*(long*)addr = PyInt_AsLong(v); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_ULONG: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (PyInt_Check(v)) | 
					
						
							|  |  |  | 					*(long*)addr = PyInt_AsLong(v); | 
					
						
							|  |  |  | 				else if (PyLong_Check(v)) | 
					
						
							|  |  |  | 					*(long*)addr = PyLong_AsLong(v); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 				else { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			case T_FLOAT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (PyInt_Check(v)) | 
					
						
							| 
									
										
										
										
											1997-04-09 19:24:53 +00:00
										 |  |  | 					*(float*)addr = | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 						(float) PyInt_AsLong(v); | 
					
						
							|  |  |  | 				else if (PyFloat_Check(v)) | 
					
						
							|  |  |  | 					*(float*)addr = | 
					
						
							|  |  |  | 						(float) PyFloat_AsDouble(v); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				else { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case T_DOUBLE: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (PyInt_Check(v)) | 
					
						
							| 
									
										
										
										
											1997-04-09 19:24:53 +00:00
										 |  |  | 					*(double*)addr = | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 						(double) PyInt_AsLong(v); | 
					
						
							|  |  |  | 				else if (PyFloat_Check(v)) | 
					
						
							|  |  |  | 					*(double*)addr = PyFloat_AsDouble(v); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				else { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case T_OBJECT: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				Py_XINCREF(v); | 
					
						
							| 
									
										
										
										
											1998-05-20 22:25:32 +00:00
										 |  |  | 				oldv = *(PyObject **)addr; | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				*(PyObject **)addr = v; | 
					
						
							| 
									
										
										
										
											1998-05-20 22:25:32 +00:00
										 |  |  | 				Py_XDECREF(oldv); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 			case T_CHAR: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				if (PyString_Check(v) && | 
					
						
							|  |  |  | 				    PyString_Size(v) == 1) { | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 					*(char*)addr = | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 						PyString_AsString(v)[0]; | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				else { | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 					PyErr_BadArgument(); | 
					
						
							| 
									
										
										
										
											1992-06-03 17:07:23 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 			default: | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 				PyErr_SetString(PyExc_SystemError, | 
					
						
							|  |  |  | 						"bad memberlist type"); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 				return -1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-04-29 20:08:16 +00:00
										 |  |  | 	PyErr_SetString(PyExc_AttributeError, name); | 
					
						
							| 
									
										
										
										
											1990-12-20 23:12:40 +00:00
										 |  |  | 	return -1; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | } |