[Python-checkins] CVS: python/dist/src/Objects fileobject.c,2.80,2.81

A.M. Kuchling python-dev@python.org
Thu, 13 Jul 2000 16:56:56 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory slayer.i.sourceforge.net:/tmp/cvs-serv29070/Objects

Modified Files:
	fileobject.c 
Log Message:
Added PyObject_AsFileDescriptor, which checks for integer, long integer, 
or .fileno() method


Index: fileobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.80
retrieving revision 2.81
diff -C2 -r2.80 -r2.81
*** fileobject.c	2000/07/09 05:02:18	2.80
--- fileobject.c	2000/07/13 23:56:54	2.81
***************
*** 1099,1100 ****
--- 1099,1158 ----
  		return -1;
  }
+ 
+ /* Try to get a file-descriptor from a Python object.  If the object
+    is an integer or long integer, its value is returned.  If not, the
+    object's fileno() method is called if it exists; the method must return
+    an integer or long integer, which is returned as the file descriptor value.
+    -1 is returned on failure.
+ */
+ 
+ int PyObject_AsFileDescriptor(PyObject *o)
+ {
+ 	int fd;
+ 	PyObject *meth;
+ 
+ 	if (PyInt_Check(o)) {
+ 		fd = PyInt_AsLong(o);
+ 	}
+ 	else if (PyLong_Check(o)) {
+ 		fd = PyLong_AsLong(o);
+ 	}
+ 	else if ((meth = PyObject_GetAttrString(o, "fileno")) != NULL)
+ 	{
+ 		PyObject *fno = PyEval_CallObject(meth, NULL);
+ 		Py_DECREF(meth);
+ 		if (fno == NULL)
+ 			return -1;
+ 		
+ 		if (PyInt_Check(fno)) {
+ 			fd = PyInt_AsLong(fno);
+ 			Py_DECREF(fno);
+ 		}
+ 		else if (PyLong_Check(fno)) {
+ 			fd = PyLong_AsLong(fno);
+ 			Py_DECREF(fno);
+ 		}
+ 		else {
+ 			PyErr_SetString(PyExc_TypeError,
+ 					"fileno() returned a non-integer");
+ 			Py_DECREF(fno);
+ 			return -1;
+ 		}
+ 	}
+ 	else {
+ 		PyErr_SetString(PyExc_TypeError,
+ 				"argument must be an int, or have a fileno() method.");
+ 		return -1;
+ 	}
+ 
+ 	if (fd < 0) {
+ 		PyErr_Format(PyExc_ValueError,
+ 			     "file descriptor cannot be a negative integer (%i)",
+ 			     fd);
+ 		return -1;
+ 	}
+ 	return fd;
+ }
+ 
+ 
+