]> granicus.if.org Git - python/commitdiff
Added PyObject_AsFileDescriptor, which checks for integer, long integer,
authorAndrew M. Kuchling <amk@amk.ca>
Thu, 13 Jul 2000 23:56:54 +0000 (23:56 +0000)
committerAndrew M. Kuchling <amk@amk.ca>
Thu, 13 Jul 2000 23:56:54 +0000 (23:56 +0000)
or .fileno() method

Include/fileobject.h
Objects/fileobject.c

index 7c6bfac1857d31ae68159bb5f9ca8f769a38a2ff..15d1d5c7a8ceffb9e93cba8dc6dcc6895d2233b4 100644 (file)
@@ -30,6 +30,7 @@ extern DL_IMPORT(PyObject *) PyFile_GetLine(PyObject *, int);
 extern DL_IMPORT(int) PyFile_WriteObject(PyObject *, PyObject *, int);
 extern DL_IMPORT(int) PyFile_SoftSpace(PyObject *, int);
 extern DL_IMPORT(int) PyFile_WriteString(char *, PyObject *);
+extern DL_IMPORT(int) PyObject_AsFileDescriptor(PyObject *);
 
 #ifdef __cplusplus
 }
index b02a56e652ef2430cb234f6e40895a747183f4e8..3458f8ebb473bc347128cf0b2dbf087191011305 100644 (file)
@@ -1098,3 +1098,61 @@ PyFile_WriteString(char *s, PyObject *f)
        else
                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;
+}
+
+
+