| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | /* Boolean type, a subtype of int */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Python.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* We need to define bool_print to override int_print */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | bool_print(PyBoolObject *self, FILE *fp, int flags) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-04-04 01:00:42 +00:00
										 |  |  | 	fputs(self->ob_ival == 0 ? "False" : "True", fp); | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* We define bool_repr to return "False" or "True" */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject *false_str = NULL; | 
					
						
							|  |  |  | static PyObject *true_str = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-06 22:12:52 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | bool_repr(PyBoolObject *self) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (self->ob_ival) | 
					
						
							|  |  |  | 		s = true_str ? true_str : | 
					
						
							|  |  |  | 			(true_str = PyString_InternFromString("True")); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		s = false_str ? false_str : | 
					
						
							|  |  |  | 			(false_str = PyString_InternFromString("False")); | 
					
						
							|  |  |  | 	Py_XINCREF(s); | 
					
						
							|  |  |  | 	return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Function to return a bool from a C long */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject *PyBool_FromLong(long ok) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ok) | 
					
						
							|  |  |  | 		result = Py_True; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		result = Py_False; | 
					
						
							|  |  |  | 	Py_INCREF(result); | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* We define bool_new to always return either Py_True or Py_False */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-06 22:12:52 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | bool_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	static char *kwlist[] = {"x", 0}; | 
					
						
							| 
									
										
										
										
											2003-04-19 18:15:10 +00:00
										 |  |  | 	PyObject *x = Py_False; | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | 	long ok; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-19 18:15:10 +00:00
										 |  |  | 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:bool", kwlist, &x)) | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	ok = PyObject_IsTrue(x); | 
					
						
							|  |  |  | 	if (ok < 0) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	return PyBool_FromLong(ok); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Arithmetic operations redefined to return bool if both args are bool. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | bool_and(PyObject *a, PyObject *b) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!PyBool_Check(a) || !PyBool_Check(b)) | 
					
						
							|  |  |  | 		return PyInt_Type.tp_as_number->nb_and(a, b); | 
					
						
							|  |  |  | 	return PyBool_FromLong( | 
					
						
							|  |  |  | 		((PyBoolObject *)a)->ob_ival & ((PyBoolObject *)b)->ob_ival); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | bool_or(PyObject *a, PyObject *b) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!PyBool_Check(a) || !PyBool_Check(b)) | 
					
						
							|  |  |  | 		return PyInt_Type.tp_as_number->nb_or(a, b); | 
					
						
							|  |  |  | 	return PyBool_FromLong( | 
					
						
							|  |  |  | 		((PyBoolObject *)a)->ob_ival | ((PyBoolObject *)b)->ob_ival); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | bool_xor(PyObject *a, PyObject *b) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!PyBool_Check(a) || !PyBool_Check(b)) | 
					
						
							|  |  |  | 		return PyInt_Type.tp_as_number->nb_xor(a, b); | 
					
						
							|  |  |  | 	return PyBool_FromLong( | 
					
						
							|  |  |  | 		((PyBoolObject *)a)->ob_ival ^ ((PyBoolObject *)b)->ob_ival); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Doc string */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-13 20:33:02 +00:00
										 |  |  | PyDoc_STRVAR(bool_doc, | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | "bool(x) -> bool\n\
 | 
					
						
							|  |  |  | \n\ | 
					
						
							|  |  |  | Returns True when the argument x is true, False otherwise.\n\ | 
					
						
							|  |  |  | The builtins True and False are the only two instances of the class bool.\n\ | 
					
						
							| 
									
										
										
										
											2002-06-13 20:33:02 +00:00
										 |  |  | The class bool is a subclass of the class int, and cannot be subclassed."); | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Arithmetic methods -- only so we can override &, |, ^. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyNumberMethods bool_as_number = { | 
					
						
							| 
									
										
										
										
											2002-04-25 20:01:10 +00:00
										 |  |  | 	0,					/* nb_add */ | 
					
						
							|  |  |  | 	0,					/* nb_subtract */ | 
					
						
							|  |  |  | 	0,					/* nb_multiply */ | 
					
						
							|  |  |  | 	0,					/* nb_divide */ | 
					
						
							|  |  |  | 	0,					/* nb_remainder */ | 
					
						
							|  |  |  | 	0,					/* nb_divmod */ | 
					
						
							|  |  |  | 	0,					/* nb_power */ | 
					
						
							|  |  |  | 	0,					/* nb_negative */ | 
					
						
							|  |  |  | 	0,					/* nb_positive */ | 
					
						
							|  |  |  | 	0,					/* nb_absolute */ | 
					
						
							|  |  |  | 	0,					/* nb_nonzero */ | 
					
						
							|  |  |  | 	0,					/* nb_invert */ | 
					
						
							|  |  |  | 	0,					/* nb_lshift */ | 
					
						
							|  |  |  | 	0,					/* nb_rshift */ | 
					
						
							|  |  |  | 	(binaryfunc)bool_and,			/* nb_and */ | 
					
						
							|  |  |  | 	(binaryfunc)bool_xor,			/* nb_xor */ | 
					
						
							|  |  |  | 	(binaryfunc)bool_or,			/* nb_or */ | 
					
						
							|  |  |  | 	0,					/* nb_coerce */ | 
					
						
							|  |  |  | 	0,					/* nb_int */ | 
					
						
							|  |  |  | 	0,					/* nb_long */ | 
					
						
							|  |  |  | 	0,					/* nb_float */ | 
					
						
							|  |  |  | 	0,					/* nb_oct */ | 
					
						
							|  |  |  | 	0,		 			/* nb_hex */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_add */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_subtract */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_multiply */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_divide */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_remainder */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_power */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_lshift */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_rshift */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_and */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_xor */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_or */ | 
					
						
							|  |  |  | 	0,					/* nb_floor_divide */ | 
					
						
							|  |  |  | 	0,					/* nb_true_divide */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_floor_divide */ | 
					
						
							|  |  |  | 	0,					/* nb_inplace_true_divide */ | 
					
						
							| 
									
										
										
										
											2002-04-03 23:01:45 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The type object for bool.  Note that this cannot be subclassed! */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyTypeObject PyBool_Type = { | 
					
						
							|  |  |  | 	PyObject_HEAD_INIT(&PyType_Type) | 
					
						
							|  |  |  | 	0, | 
					
						
							|  |  |  | 	"bool", | 
					
						
							|  |  |  | 	sizeof(PyIntObject), | 
					
						
							|  |  |  | 	0, | 
					
						
							|  |  |  | 	0,					/* tp_dealloc */ | 
					
						
							|  |  |  | 	(printfunc)bool_print,			/* tp_print */ | 
					
						
							|  |  |  | 	0,					/* tp_getattr */ | 
					
						
							|  |  |  | 	0,					/* tp_setattr */ | 
					
						
							|  |  |  | 	0,					/* tp_compare */ | 
					
						
							|  |  |  | 	(reprfunc)bool_repr,			/* tp_repr */ | 
					
						
							|  |  |  | 	&bool_as_number,			/* tp_as_number */ | 
					
						
							|  |  |  | 	0,					/* tp_as_sequence */ | 
					
						
							|  |  |  | 	0,					/* tp_as_mapping */ | 
					
						
							|  |  |  | 	0,					/* tp_hash */ | 
					
						
							|  |  |  |         0,					/* tp_call */ | 
					
						
							|  |  |  |         (reprfunc)bool_repr,			/* tp_str */ | 
					
						
							|  |  |  | 	0,					/* tp_getattro */ | 
					
						
							|  |  |  | 	0,					/* tp_setattro */ | 
					
						
							|  |  |  | 	0,					/* tp_as_buffer */ | 
					
						
							|  |  |  | 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */ | 
					
						
							|  |  |  | 	bool_doc,				/* tp_doc */ | 
					
						
							|  |  |  | 	0,					/* tp_traverse */ | 
					
						
							|  |  |  | 	0,					/* tp_clear */ | 
					
						
							|  |  |  | 	0,					/* tp_richcompare */ | 
					
						
							|  |  |  | 	0,					/* tp_weaklistoffset */ | 
					
						
							|  |  |  | 	0,					/* tp_iter */ | 
					
						
							|  |  |  | 	0,					/* tp_iternext */ | 
					
						
							|  |  |  | 	0,					/* tp_methods */ | 
					
						
							|  |  |  | 	0,					/* tp_members */ | 
					
						
							|  |  |  | 	0,					/* tp_getset */ | 
					
						
							|  |  |  | 	&PyInt_Type,				/* tp_base */ | 
					
						
							|  |  |  | 	0,					/* tp_dict */ | 
					
						
							|  |  |  | 	0,					/* tp_descr_get */ | 
					
						
							|  |  |  | 	0,					/* tp_descr_set */ | 
					
						
							|  |  |  | 	0,					/* tp_dictoffset */ | 
					
						
							|  |  |  | 	0,					/* tp_init */ | 
					
						
							|  |  |  | 	0,					/* tp_alloc */ | 
					
						
							|  |  |  | 	bool_new,				/* tp_new */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The objects representing bool values False and True */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Named Zero for link-level compatibility */ | 
					
						
							|  |  |  | PyIntObject _Py_ZeroStruct = { | 
					
						
							|  |  |  | 	PyObject_HEAD_INIT(&PyBool_Type) | 
					
						
							|  |  |  | 	0 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyIntObject _Py_TrueStruct = { | 
					
						
							|  |  |  | 	PyObject_HEAD_INIT(&PyBool_Type) | 
					
						
							|  |  |  | 	1 | 
					
						
							|  |  |  | }; |