diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index 81e4019..f332ee4 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -43,14 +43,14 @@
 #endif
 
 typedef struct {
-	PyObject_HEAD
-	int fd;
-	unsigned int readable : 1;
-	unsigned int writable : 1;
-	signed int seekable : 2; /* -1 means unknown */
-	unsigned int closefd : 1;
-	PyObject *weakreflist;
-	PyObject *dict;
+    PyObject_HEAD
+    int fd;
+    unsigned int readable : 1;
+    unsigned int writable : 1;
+    signed int seekable : 2; /* -1 means unknown */
+    unsigned int closefd : 1;
+    PyObject *weakreflist;
+    PyObject *dict;
 } fileio;
 
 PyTypeObject PyFileIO_Type;
@@ -60,7 +60,7 @@
 int
 _PyFileIO_closed(PyObject *self)
 {
-	return ((fileio *)self)->fd < 0;
+    return ((fileio *)self)->fd < 0;
 }
 
 static PyObject *
@@ -72,64 +72,64 @@
 static int
 internal_close(fileio *self)
 {
-	int err = 0;
-	int save_errno = 0;
-	if (self->fd >= 0) {
-		int fd = self->fd;
-		self->fd = -1;
-		/* fd is accessible and someone else may have closed it */
-		if (_PyVerify_fd(fd)) {
-			Py_BEGIN_ALLOW_THREADS
-			err = close(fd);
-			if (err < 0)
-				save_errno = errno;
-			Py_END_ALLOW_THREADS
-		} else {
-			save_errno = errno;
-			err = -1;
-		}
-	}
-	if (err < 0) {
-		errno = save_errno;
-		PyErr_SetFromErrno(PyExc_IOError);
-		return -1;
-	}
-	return 0;
+    int err = 0;
+    int save_errno = 0;
+    if (self->fd >= 0) {
+        int fd = self->fd;
+        self->fd = -1;
+        /* fd is accessible and someone else may have closed it */
+        if (_PyVerify_fd(fd)) {
+            Py_BEGIN_ALLOW_THREADS
+            err = close(fd);
+            if (err < 0)
+                save_errno = errno;
+            Py_END_ALLOW_THREADS
+        } else {
+            save_errno = errno;
+            err = -1;
+        }
+    }
+    if (err < 0) {
+        errno = save_errno;
+        PyErr_SetFromErrno(PyExc_IOError);
+        return -1;
+    }
+    return 0;
 }
 
 static PyObject *
 fileio_close(fileio *self)
 {
-	if (!self->closefd) {
-		self->fd = -1;
-		Py_RETURN_NONE;
-	}
-	errno = internal_close(self);
-	if (errno < 0)
-		return NULL;
+    if (!self->closefd) {
+        self->fd = -1;
+        Py_RETURN_NONE;
+    }
+    errno = internal_close(self);
+    if (errno < 0)
+        return NULL;
 
-	return PyObject_CallMethod((PyObject*)&PyRawIOBase_Type,
-				   "close", "O", self);
+    return PyObject_CallMethod((PyObject*)&PyRawIOBase_Type,
+                               "close", "O", self);
 }
 
 static PyObject *
 fileio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-	fileio *self;
+    fileio *self;
 
-	assert(type != NULL && type->tp_alloc != NULL);
+    assert(type != NULL && type->tp_alloc != NULL);
 
-	self = (fileio *) type->tp_alloc(type, 0);
-	if (self != NULL) {
-		self->fd = -1;
-		self->readable = 0;
-		self->writable = 0;
-		self->seekable = -1;
-		self->closefd = 1;
-		self->weakreflist = NULL;
-	}
+    self = (fileio *) type->tp_alloc(type, 0);
+    if (self != NULL) {
+        self->fd = -1;
+        self->readable = 0;
+        self->writable = 0;
+        self->seekable = -1;
+        self->closefd = 1;
+        self->weakreflist = NULL;
+    }
 
-	return (PyObject *) self;
+    return (PyObject *) self;
 }
 
 /* On Unix, open will succeed for directories.
@@ -140,538 +140,538 @@
 dircheck(fileio* self, const char *name)
 {
 #if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
-	struct stat buf;
-	if (self->fd < 0)
-		return 0;
-	if (fstat(self->fd, &buf) == 0 && S_ISDIR(buf.st_mode)) {
-		char *msg = strerror(EISDIR);
-		PyObject *exc;
-		if (internal_close(self))
-			return -1;
+    struct stat buf;
+    if (self->fd < 0)
+        return 0;
+    if (fstat(self->fd, &buf) == 0 && S_ISDIR(buf.st_mode)) {
+        char *msg = strerror(EISDIR);
+        PyObject *exc;
+        if (internal_close(self))
+            return -1;
 
-		exc = PyObject_CallFunction(PyExc_IOError, "(iss)",
-					    EISDIR, msg, name);
-		PyErr_SetObject(PyExc_IOError, exc);
-		Py_XDECREF(exc);
-		return -1;
-	}
+        exc = PyObject_CallFunction(PyExc_IOError, "(iss)",
+                                    EISDIR, msg, name);
+        PyErr_SetObject(PyExc_IOError, exc);
+        Py_XDECREF(exc);
+        return -1;
+    }
 #endif
-	return 0;
+    return 0;
 }
 
 static int
 check_fd(int fd)
 {
 #if defined(HAVE_FSTAT)
-	struct stat buf;
-	if (!_PyVerify_fd(fd) || (fstat(fd, &buf) < 0 && errno == EBADF)) {
-		PyObject *exc;
-		char *msg = strerror(EBADF);
-		exc = PyObject_CallFunction(PyExc_OSError, "(is)",
-					    EBADF, msg);
-		PyErr_SetObject(PyExc_OSError, exc);
-		Py_XDECREF(exc);
-		return -1;
-	}
+    struct stat buf;
+    if (!_PyVerify_fd(fd) || (fstat(fd, &buf) < 0 && errno == EBADF)) {
+        PyObject *exc;
+        char *msg = strerror(EBADF);
+        exc = PyObject_CallFunction(PyExc_OSError, "(is)",
+                                    EBADF, msg);
+        PyErr_SetObject(PyExc_OSError, exc);
+        Py_XDECREF(exc);
+        return -1;
+    }
 #endif
-	return 0;
+    return 0;
 }
 
 
 static int
 fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
 {
-	fileio *self = (fileio *) oself;
-	static char *kwlist[] = {"file", "mode", "closefd", NULL};
-	const char *name = NULL;
-	PyObject *nameobj, *stringobj = NULL;
-	char *mode = "r";
-	char *s;
+    fileio *self = (fileio *) oself;
+    static char *kwlist[] = {"file", "mode", "closefd", NULL};
+    const char *name = NULL;
+    PyObject *nameobj, *stringobj = NULL;
+    char *mode = "r";
+    char *s;
 #ifdef MS_WINDOWS
-	Py_UNICODE *widename = NULL;
+    Py_UNICODE *widename = NULL;
 #endif
-	int ret = 0;
-	int rwa = 0, plus = 0, append = 0;
-	int flags = 0;
-	int fd = -1;
-	int closefd = 1;
+    int ret = 0;
+    int rwa = 0, plus = 0, append = 0;
+    int flags = 0;
+    int fd = -1;
+    int closefd = 1;
 
-	assert(PyFileIO_Check(oself));
-	if (self->fd >= 0) {
-		/* Have to close the existing file first. */
-		if (internal_close(self) < 0)
-			return -1;
-	}
+    assert(PyFileIO_Check(oself));
+    if (self->fd >= 0) {
+        /* Have to close the existing file first. */
+        if (internal_close(self) < 0)
+            return -1;
+    }
 
-	if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:fileio",
-					 kwlist, &nameobj, &mode, &closefd))
-		return -1;
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:fileio",
+                                     kwlist, &nameobj, &mode, &closefd))
+        return -1;
 
-	if (PyFloat_Check(nameobj)) {
-		PyErr_SetString(PyExc_TypeError,
-				"integer argument expected, got float");
-		return -1;
-	}
+    if (PyFloat_Check(nameobj)) {
+        PyErr_SetString(PyExc_TypeError,
+                        "integer argument expected, got float");
+        return -1;
+    }
 
-	fd = PyLong_AsLong(nameobj);
-	if (fd < 0) {
-		if (!PyErr_Occurred()) {
-			PyErr_SetString(PyExc_ValueError,
-					"Negative filedescriptor");
-			return -1;
-		}
-		PyErr_Clear();
-	}
+    fd = PyLong_AsLong(nameobj);
+    if (fd < 0) {
+        if (!PyErr_Occurred()) {
+            PyErr_SetString(PyExc_ValueError,
+                            "Negative filedescriptor");
+            return -1;
+        }
+        PyErr_Clear();
+    }
 
 #ifdef MS_WINDOWS
-	if (GetVersion() < 0x80000000) {
-		/* On NT, so wide API available */
-		if (PyUnicode_Check(nameobj))
-			widename = PyUnicode_AS_UNICODE(nameobj);
-	}
-	if (widename == NULL)
+    if (GetVersion() < 0x80000000) {
+        /* On NT, so wide API available */
+        if (PyUnicode_Check(nameobj))
+            widename = PyUnicode_AS_UNICODE(nameobj);
+    }
+    if (widename == NULL)
 #endif
-	if (fd < 0)
-	{
-		if (PyBytes_Check(nameobj) || PyByteArray_Check(nameobj)) {
-			Py_ssize_t namelen;
-			if (PyObject_AsCharBuffer(nameobj, &name, &namelen) < 0)
-				return -1;
-		}
-		else {
-			PyObject *u = PyUnicode_FromObject(nameobj);
+    if (fd < 0)
+    {
+        if (PyBytes_Check(nameobj) || PyByteArray_Check(nameobj)) {
+            Py_ssize_t namelen;
+            if (PyObject_AsCharBuffer(nameobj, &name, &namelen) < 0)
+                return -1;
+        }
+        else {
+            PyObject *u = PyUnicode_FromObject(nameobj);
 
-			if (u == NULL)
-				return -1;
+            if (u == NULL)
+                return -1;
 
-			stringobj = PyUnicode_AsEncodedString(
-				u, Py_FileSystemDefaultEncoding, "surrogateescape");
-			Py_DECREF(u);
-			if (stringobj == NULL)
-				return -1;
-			if (!PyBytes_Check(stringobj)) {
-				PyErr_SetString(PyExc_TypeError,
-						"encoder failed to return bytes");
-				goto error;
-			}
-			name = PyBytes_AS_STRING(stringobj);
-		}
-	}
+            stringobj = PyUnicode_AsEncodedString(
+                u, Py_FileSystemDefaultEncoding, "surrogateescape");
+            Py_DECREF(u);
+            if (stringobj == NULL)
+                return -1;
+            if (!PyBytes_Check(stringobj)) {
+                PyErr_SetString(PyExc_TypeError,
+                                "encoder failed to return bytes");
+                goto error;
+            }
+            name = PyBytes_AS_STRING(stringobj);
+        }
+    }
 
-	s = mode;
-	while (*s) {
-		switch (*s++) {
-		case 'r':
-			if (rwa) {
-			bad_mode:
-				PyErr_SetString(PyExc_ValueError,
-						"Must have exactly one of read/write/append mode");
-				goto error;
-			}
-			rwa = 1;
-			self->readable = 1;
-			break;
-		case 'w':
-			if (rwa)
-				goto bad_mode;
-			rwa = 1;
-			self->writable = 1;
-			flags |= O_CREAT | O_TRUNC;
-			break;
-		case 'a':
-			if (rwa)
-				goto bad_mode;
-			rwa = 1;
-			self->writable = 1;
-			flags |= O_CREAT;
-			append = 1;
-			break;
-		case 'b':
-			break;
-		case '+':
-			if (plus)
-				goto bad_mode;
-			self->readable = self->writable = 1;
-			plus = 1;
-			break;
-		default:
-			PyErr_Format(PyExc_ValueError,
-				     "invalid mode: %.200s", mode);
-			goto error;
-		}
-	}
+    s = mode;
+    while (*s) {
+        switch (*s++) {
+        case 'r':
+            if (rwa) {
+            bad_mode:
+                PyErr_SetString(PyExc_ValueError,
+                                "Must have exactly one of read/write/append mode");
+                goto error;
+            }
+            rwa = 1;
+            self->readable = 1;
+            break;
+        case 'w':
+            if (rwa)
+                goto bad_mode;
+            rwa = 1;
+            self->writable = 1;
+            flags |= O_CREAT | O_TRUNC;
+            break;
+        case 'a':
+            if (rwa)
+                goto bad_mode;
+            rwa = 1;
+            self->writable = 1;
+            flags |= O_CREAT;
+            append = 1;
+            break;
+        case 'b':
+            break;
+        case '+':
+            if (plus)
+                goto bad_mode;
+            self->readable = self->writable = 1;
+            plus = 1;
+            break;
+        default:
+            PyErr_Format(PyExc_ValueError,
+                         "invalid mode: %.200s", mode);
+            goto error;
+        }
+    }
 
-	if (!rwa)
-		goto bad_mode;
+    if (!rwa)
+        goto bad_mode;
 
-	if (self->readable && self->writable)
-		flags |= O_RDWR;
-	else if (self->readable)
-		flags |= O_RDONLY;
-	else
-		flags |= O_WRONLY;
+    if (self->readable && self->writable)
+        flags |= O_RDWR;
+    else if (self->readable)
+        flags |= O_RDONLY;
+    else
+        flags |= O_WRONLY;
 
 #ifdef O_BINARY
-	flags |= O_BINARY;
+    flags |= O_BINARY;
 #endif
 
 #ifdef O_APPEND
-	if (append)
-		flags |= O_APPEND;
+    if (append)
+        flags |= O_APPEND;
 #endif
 
-	if (fd >= 0) {
-		if (check_fd(fd))
-			goto error;
-		self->fd = fd;
-		self->closefd = closefd;
-	}
-	else {
-		self->closefd = 1;
-		if (!closefd) {
-			PyErr_SetString(PyExc_ValueError,
-                            "Cannot use closefd=False with file name");
-			goto error;
-		}
+    if (fd >= 0) {
+        if (check_fd(fd))
+            goto error;
+        self->fd = fd;
+        self->closefd = closefd;
+    }
+    else {
+        self->closefd = 1;
+        if (!closefd) {
+            PyErr_SetString(PyExc_ValueError,
+                "Cannot use closefd=False with file name");
+            goto error;
+        }
 
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
+        Py_BEGIN_ALLOW_THREADS
+        errno = 0;
 #ifdef MS_WINDOWS
-		if (widename != NULL)
-			self->fd = _wopen(widename, flags, 0666);
-		else
+        if (widename != NULL)
+            self->fd = _wopen(widename, flags, 0666);
+        else
 #endif
-			self->fd = open(name, flags, 0666);
-		Py_END_ALLOW_THREADS
-		if (self->fd < 0) {
+            self->fd = open(name, flags, 0666);
+        Py_END_ALLOW_THREADS
+        if (self->fd < 0) {
 #ifdef MS_WINDOWS
-			if (widename != NULL)
-				PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);
-			else
+            if (widename != NULL)
+                PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);
+            else
 #endif
-				PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
-			goto error;
-		}
-		if(dircheck(self, name) < 0)
-			goto error;
-	}
+                PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
+            goto error;
+        }
+        if(dircheck(self, name) < 0)
+            goto error;
+    }
 
-	if (PyObject_SetAttrString((PyObject *)self, "name", nameobj) < 0)
-		goto error;
+    if (PyObject_SetAttrString((PyObject *)self, "name", nameobj) < 0)
+        goto error;
 
-	if (append) {
-		/* For consistent behaviour, we explicitly seek to the
-		   end of file (otherwise, it might be done only on the
-		   first write()). */
-		PyObject *pos = portable_lseek(self->fd, NULL, 2);
-		if (pos == NULL)
-			goto error;
-		Py_DECREF(pos);
-	}
+    if (append) {
+        /* For consistent behaviour, we explicitly seek to the
+           end of file (otherwise, it might be done only on the
+           first write()). */
+        PyObject *pos = portable_lseek(self->fd, NULL, 2);
+        if (pos == NULL)
+            goto error;
+        Py_DECREF(pos);
+    }
 
-	goto done;
+    goto done;
 
  error:
-	ret = -1;
+    ret = -1;
 
  done:
-	Py_CLEAR(stringobj);
-	return ret;
+    Py_CLEAR(stringobj);
+    return ret;
 }
 
 static int
 fileio_traverse(fileio *self, visitproc visit, void *arg)
 {
-	Py_VISIT(self->dict);
-	return 0;
+    Py_VISIT(self->dict);
+    return 0;
 }
 
 static int
 fileio_clear(fileio *self)
 {
-	Py_CLEAR(self->dict);
-	return 0;
+    Py_CLEAR(self->dict);
+    return 0;
 }
 
 static void
 fileio_dealloc(fileio *self)
 {
-	if (_PyIOBase_finalize((PyObject *) self) < 0)
-		return;
-	_PyObject_GC_UNTRACK(self);
-	if (self->weakreflist != NULL)
-		PyObject_ClearWeakRefs((PyObject *) self);
-	Py_CLEAR(self->dict);
-	Py_TYPE(self)->tp_free((PyObject *)self);
+    if (_PyIOBase_finalize((PyObject *) self) < 0)
+        return;
+    _PyObject_GC_UNTRACK(self);
+    if (self->weakreflist != NULL)
+        PyObject_ClearWeakRefs((PyObject *) self);
+    Py_CLEAR(self->dict);
+    Py_TYPE(self)->tp_free((PyObject *)self);
 }
 
 static PyObject *
 err_closed(void)
 {
-	PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
-	return NULL;
+    PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
+    return NULL;
 }
 
 static PyObject *
 err_mode(char *action)
 {
-	PyErr_Format(PyExc_ValueError, "File not open for %s", action);
-	return NULL;
+    PyErr_Format(PyExc_ValueError, "File not open for %s", action);
+    return NULL;
 }
 
 static PyObject *
 fileio_fileno(fileio *self)
 {
-	if (self->fd < 0)
-		return err_closed();
-	return PyLong_FromLong((long) self->fd);
+    if (self->fd < 0)
+        return err_closed();
+    return PyLong_FromLong((long) self->fd);
 }
 
 static PyObject *
 fileio_readable(fileio *self)
 {
-	if (self->fd < 0)
-		return err_closed();
-	return PyBool_FromLong((long) self->readable);
+    if (self->fd < 0)
+        return err_closed();
+    return PyBool_FromLong((long) self->readable);
 }
 
 static PyObject *
 fileio_writable(fileio *self)
 {
-	if (self->fd < 0)
-		return err_closed();
-	return PyBool_FromLong((long) self->writable);
+    if (self->fd < 0)
+        return err_closed();
+    return PyBool_FromLong((long) self->writable);
 }
 
 static PyObject *
 fileio_seekable(fileio *self)
 {
-	if (self->fd < 0)
-		return err_closed();
-	if (self->seekable < 0) {
-		PyObject *pos = portable_lseek(self->fd, NULL, SEEK_CUR);
-		if (pos == NULL) {
-			PyErr_Clear();
-			self->seekable = 0;
-		} else {
-			Py_DECREF(pos);
-			self->seekable = 1;
-		}
-	}
-	return PyBool_FromLong((long) self->seekable);
+    if (self->fd < 0)
+        return err_closed();
+    if (self->seekable < 0) {
+        PyObject *pos = portable_lseek(self->fd, NULL, SEEK_CUR);
+        if (pos == NULL) {
+            PyErr_Clear();
+            self->seekable = 0;
+        } else {
+            Py_DECREF(pos);
+            self->seekable = 1;
+        }
+    }
+    return PyBool_FromLong((long) self->seekable);
 }
 
 static PyObject *
 fileio_readinto(fileio *self, PyObject *args)
 {
-	Py_buffer pbuf;
-	Py_ssize_t n;
+    Py_buffer pbuf;
+    Py_ssize_t n;
 
-	if (self->fd < 0)
-		return err_closed();
-	if (!self->readable)
-		return err_mode("reading");
+    if (self->fd < 0)
+        return err_closed();
+    if (!self->readable)
+        return err_mode("reading");
 
-	if (!PyArg_ParseTuple(args, "w*", &pbuf))
-		return NULL;
+    if (!PyArg_ParseTuple(args, "w*", &pbuf))
+        return NULL;
 
-	if (_PyVerify_fd(self->fd)) {
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		n = read(self->fd, pbuf.buf, pbuf.len);
-		Py_END_ALLOW_THREADS
-	} else
-		n = -1;
-	PyBuffer_Release(&pbuf);
-	if (n < 0) {
-		if (errno == EAGAIN)
-			Py_RETURN_NONE;
-		PyErr_SetFromErrno(PyExc_IOError);
-		return NULL;
-	}
+    if (_PyVerify_fd(self->fd)) {
+        Py_BEGIN_ALLOW_THREADS
+        errno = 0;
+        n = read(self->fd, pbuf.buf, pbuf.len);
+        Py_END_ALLOW_THREADS
+    } else
+        n = -1;
+    PyBuffer_Release(&pbuf);
+    if (n < 0) {
+        if (errno == EAGAIN)
+            Py_RETURN_NONE;
+        PyErr_SetFromErrno(PyExc_IOError);
+        return NULL;
+    }
 
-	return PyLong_FromSsize_t(n);
+    return PyLong_FromSsize_t(n);
 }
 
 static size_t
 new_buffersize(fileio *self, size_t currentsize)
 {
 #ifdef HAVE_FSTAT
-	off_t pos, end;
-	struct stat st;
-	if (fstat(self->fd, &st) == 0) {
-		end = st.st_size;
-		pos = lseek(self->fd, 0L, SEEK_CUR);
-		/* Files claiming a size smaller than SMALLCHUNK may
-		   actually be streaming pseudo-files. In this case, we
-		   apply the more aggressive algorithm below.
-		*/
-		if (end >= SMALLCHUNK && end >= pos && pos >= 0) {
-			/* Add 1 so if the file were to grow we'd notice. */
-			return currentsize + end - pos + 1;
-		}
-	}
+    off_t pos, end;
+    struct stat st;
+    if (fstat(self->fd, &st) == 0) {
+        end = st.st_size;
+        pos = lseek(self->fd, 0L, SEEK_CUR);
+        /* Files claiming a size smaller than SMALLCHUNK may
+           actually be streaming pseudo-files. In this case, we
+           apply the more aggressive algorithm below.
+        */
+        if (end >= SMALLCHUNK && end >= pos && pos >= 0) {
+            /* Add 1 so if the file were to grow we'd notice. */
+            return currentsize + end - pos + 1;
+        }
+    }
 #endif
-	if (currentsize > SMALLCHUNK) {
-		/* Keep doubling until we reach BIGCHUNK;
-		   then keep adding BIGCHUNK. */
-		if (currentsize <= BIGCHUNK)
-			return currentsize + currentsize;
-		else
-			return currentsize + BIGCHUNK;
-	}
-	return currentsize + SMALLCHUNK;
+    if (currentsize > SMALLCHUNK) {
+        /* Keep doubling until we reach BIGCHUNK;
+           then keep adding BIGCHUNK. */
+        if (currentsize <= BIGCHUNK)
+            return currentsize + currentsize;
+        else
+            return currentsize + BIGCHUNK;
+    }
+    return currentsize + SMALLCHUNK;
 }
 
 static PyObject *
 fileio_readall(fileio *self)
 {
-	PyObject *result;
-	Py_ssize_t total = 0;
-	int n;
+    PyObject *result;
+    Py_ssize_t total = 0;
+    int n;
 
-	if (!_PyVerify_fd(self->fd))
-		return PyErr_SetFromErrno(PyExc_IOError);
+    if (!_PyVerify_fd(self->fd))
+        return PyErr_SetFromErrno(PyExc_IOError);
 
-	result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
-	if (result == NULL)
-		return NULL;
+    result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
+    if (result == NULL)
+        return NULL;
 
-	while (1) {
-		size_t newsize = new_buffersize(self, total);
-		if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {
-			PyErr_SetString(PyExc_OverflowError,
-				"unbounded read returned more bytes "
-				"than a Python string can hold ");
-			Py_DECREF(result);
-			return NULL;
-		}
+    while (1) {
+        size_t newsize = new_buffersize(self, total);
+        if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {
+            PyErr_SetString(PyExc_OverflowError,
+                "unbounded read returned more bytes "
+                "than a Python string can hold ");
+            Py_DECREF(result);
+            return NULL;
+        }
 
-		if (PyBytes_GET_SIZE(result) < (Py_ssize_t)newsize) {
-			if (_PyBytes_Resize(&result, newsize) < 0) {
-				if (total == 0) {
-					Py_DECREF(result);
-					return NULL;
-				}
-				PyErr_Clear();
-				break;
-			}
-		}
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		n = read(self->fd,
-			 PyBytes_AS_STRING(result) + total,
-			 newsize - total);
-		Py_END_ALLOW_THREADS
-		if (n == 0)
-			break;
-		if (n < 0) {
-			if (total > 0)
-				break;
-			if (errno == EAGAIN) {
-				Py_DECREF(result);
-				Py_RETURN_NONE;
-			}
-			Py_DECREF(result);
-			PyErr_SetFromErrno(PyExc_IOError);
-			return NULL;
-		}
-		total += n;
-	}
+        if (PyBytes_GET_SIZE(result) < (Py_ssize_t)newsize) {
+            if (_PyBytes_Resize(&result, newsize) < 0) {
+                if (total == 0) {
+                    Py_DECREF(result);
+                    return NULL;
+                }
+                PyErr_Clear();
+                break;
+            }
+        }
+        Py_BEGIN_ALLOW_THREADS
+        errno = 0;
+        n = read(self->fd,
+                 PyBytes_AS_STRING(result) + total,
+                 newsize - total);
+        Py_END_ALLOW_THREADS
+        if (n == 0)
+            break;
+        if (n < 0) {
+            if (total > 0)
+                break;
+            if (errno == EAGAIN) {
+                Py_DECREF(result);
+                Py_RETURN_NONE;
+            }
+            Py_DECREF(result);
+            PyErr_SetFromErrno(PyExc_IOError);
+            return NULL;
+        }
+        total += n;
+    }
 
-	if (PyBytes_GET_SIZE(result) > total) {
-		if (_PyBytes_Resize(&result, total) < 0) {
-			/* This should never happen, but just in case */
-			Py_DECREF(result);
-			return NULL;
-		}
-	}
-	return result;
+    if (PyBytes_GET_SIZE(result) > total) {
+        if (_PyBytes_Resize(&result, total) < 0) {
+            /* This should never happen, but just in case */
+            Py_DECREF(result);
+            return NULL;
+        }
+    }
+    return result;
 }
 
 static PyObject *
 fileio_read(fileio *self, PyObject *args)
 {
-	char *ptr;
-	Py_ssize_t n;
-	Py_ssize_t size = -1;
-	PyObject *bytes;
+    char *ptr;
+    Py_ssize_t n;
+    Py_ssize_t size = -1;
+    PyObject *bytes;
 
-	if (self->fd < 0)
-		return err_closed();
-	if (!self->readable)
-		return err_mode("reading");
+    if (self->fd < 0)
+        return err_closed();
+    if (!self->readable)
+        return err_mode("reading");
 
-	if (!PyArg_ParseTuple(args, "|O&", &_PyIO_ConvertSsize_t, &size))
-		return NULL;
+    if (!PyArg_ParseTuple(args, "|O&", &_PyIO_ConvertSsize_t, &size))
+        return NULL;
 
-        if (size < 0) {
-		return fileio_readall(self);
-	}
+    if (size < 0) {
+        return fileio_readall(self);
+    }
 
-	bytes = PyBytes_FromStringAndSize(NULL, size);
-	if (bytes == NULL)
-		return NULL;
-	ptr = PyBytes_AS_STRING(bytes);
+    bytes = PyBytes_FromStringAndSize(NULL, size);
+    if (bytes == NULL)
+        return NULL;
+    ptr = PyBytes_AS_STRING(bytes);
 
-	if (_PyVerify_fd(self->fd)) {
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		n = read(self->fd, ptr, size);
-		Py_END_ALLOW_THREADS
-	} else
-		n = -1;
+    if (_PyVerify_fd(self->fd)) {
+        Py_BEGIN_ALLOW_THREADS
+        errno = 0;
+        n = read(self->fd, ptr, size);
+        Py_END_ALLOW_THREADS
+    } else
+        n = -1;
 
-	if (n < 0) {
-		Py_DECREF(bytes);
-		if (errno == EAGAIN)
-			Py_RETURN_NONE;
-		PyErr_SetFromErrno(PyExc_IOError);
-		return NULL;
-	}
+    if (n < 0) {
+        Py_DECREF(bytes);
+        if (errno == EAGAIN)
+            Py_RETURN_NONE;
+        PyErr_SetFromErrno(PyExc_IOError);
+        return NULL;
+    }
 
-	if (n != size) {
-		if (_PyBytes_Resize(&bytes, n) < 0) {
-			Py_DECREF(bytes);
-			return NULL;
-		}
-	}
+    if (n != size) {
+        if (_PyBytes_Resize(&bytes, n) < 0) {
+            Py_DECREF(bytes);
+            return NULL;
+        }
+    }
 
-	return (PyObject *) bytes;
+    return (PyObject *) bytes;
 }
 
 static PyObject *
 fileio_write(fileio *self, PyObject *args)
 {
-	Py_buffer pbuf;
-	Py_ssize_t n;
+    Py_buffer pbuf;
+    Py_ssize_t n;
 
-	if (self->fd < 0)
-		return err_closed();
-	if (!self->writable)
-		return err_mode("writing");
+    if (self->fd < 0)
+        return err_closed();
+    if (!self->writable)
+        return err_mode("writing");
 
-	if (!PyArg_ParseTuple(args, "y*", &pbuf))
-		return NULL;
+    if (!PyArg_ParseTuple(args, "y*", &pbuf))
+        return NULL;
 
-	if (_PyVerify_fd(self->fd)) {
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		n = write(self->fd, pbuf.buf, pbuf.len);
-		Py_END_ALLOW_THREADS
-	} else
-		n = -1;
+    if (_PyVerify_fd(self->fd)) {
+        Py_BEGIN_ALLOW_THREADS
+        errno = 0;
+        n = write(self->fd, pbuf.buf, pbuf.len);
+        Py_END_ALLOW_THREADS
+    } else
+        n = -1;
 
-	PyBuffer_Release(&pbuf);
+    PyBuffer_Release(&pbuf);
 
-	if (n < 0) {
-		if (errno == EAGAIN)
-			Py_RETURN_NONE;
-		PyErr_SetFromErrno(PyExc_IOError);
-		return NULL;
-	}
+    if (n < 0) {
+        if (errno == EAGAIN)
+            Py_RETURN_NONE;
+        PyErr_SetFromErrno(PyExc_IOError);
+        return NULL;
+    }
 
-	return PyLong_FromSsize_t(n);
+    return PyLong_FromSsize_t(n);
 }
 
 /* XXX Windows support below is likely incomplete */
@@ -680,235 +680,235 @@
 static PyObject *
 portable_lseek(int fd, PyObject *posobj, int whence)
 {
-	Py_off_t pos, res;
+    Py_off_t pos, res;
 
 #ifdef SEEK_SET
-	/* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
-	switch (whence) {
+    /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
+    switch (whence) {
 #if SEEK_SET != 0
-	case 0: whence = SEEK_SET; break;
+    case 0: whence = SEEK_SET; break;
 #endif
 #if SEEK_CUR != 1
-	case 1: whence = SEEK_CUR; break;
+    case 1: whence = SEEK_CUR; break;
 #endif
 #if SEEK_END != 2
-	case 2: whence = SEEK_END; break;
+    case 2: whence = SEEK_END; break;
 #endif
-	}
+    }
 #endif /* SEEK_SET */
 
-	if (posobj == NULL)
-		pos = 0;
-	else {
-		if(PyFloat_Check(posobj)) {
-			PyErr_SetString(PyExc_TypeError, "an integer is required");
-			return NULL;
-		}
+    if (posobj == NULL)
+        pos = 0;
+    else {
+        if(PyFloat_Check(posobj)) {
+            PyErr_SetString(PyExc_TypeError, "an integer is required");
+            return NULL;
+        }
 #if defined(HAVE_LARGEFILE_SUPPORT)
-		pos = PyLong_AsLongLong(posobj);
+        pos = PyLong_AsLongLong(posobj);
 #else
-		pos = PyLong_AsLong(posobj);
+        pos = PyLong_AsLong(posobj);
 #endif
-		if (PyErr_Occurred())
-			return NULL;
-	}
+        if (PyErr_Occurred())
+            return NULL;
+    }
 
-	if (_PyVerify_fd(fd)) {
-		Py_BEGIN_ALLOW_THREADS
+    if (_PyVerify_fd(fd)) {
+        Py_BEGIN_ALLOW_THREADS
 #if defined(MS_WIN64) || defined(MS_WINDOWS)
-		res = _lseeki64(fd, pos, whence);
+        res = _lseeki64(fd, pos, whence);
 #else
-		res = lseek(fd, pos, whence);
+        res = lseek(fd, pos, whence);
 #endif
-		Py_END_ALLOW_THREADS
-	} else
-		res = -1;
-	if (res < 0)
-		return PyErr_SetFromErrno(PyExc_IOError);
+        Py_END_ALLOW_THREADS
+    } else
+        res = -1;
+    if (res < 0)
+        return PyErr_SetFromErrno(PyExc_IOError);
 
 #if defined(HAVE_LARGEFILE_SUPPORT)
-	return PyLong_FromLongLong(res);
+    return PyLong_FromLongLong(res);
 #else
-	return PyLong_FromLong(res);
+    return PyLong_FromLong(res);
 #endif
 }
 
 static PyObject *
 fileio_seek(fileio *self, PyObject *args)
 {
-	PyObject *posobj;
-	int whence = 0;
+    PyObject *posobj;
+    int whence = 0;
 
-	if (self->fd < 0)
-		return err_closed();
+    if (self->fd < 0)
+        return err_closed();
 
-	if (!PyArg_ParseTuple(args, "O|i", &posobj, &whence))
-		return NULL;
+    if (!PyArg_ParseTuple(args, "O|i", &posobj, &whence))
+        return NULL;
 
-	return portable_lseek(self->fd, posobj, whence);
+    return portable_lseek(self->fd, posobj, whence);
 }
 
 static PyObject *
 fileio_tell(fileio *self, PyObject *args)
 {
-	if (self->fd < 0)
-		return err_closed();
+    if (self->fd < 0)
+        return err_closed();
 
-	return portable_lseek(self->fd, NULL, 1);
+    return portable_lseek(self->fd, NULL, 1);
 }
 
 #ifdef HAVE_FTRUNCATE
 static PyObject *
 fileio_truncate(fileio *self, PyObject *args)
 {
-	PyObject *posobj = NULL; /* the new size wanted by the user */
+    PyObject *posobj = NULL; /* the new size wanted by the user */
 #ifndef MS_WINDOWS
-	Py_off_t pos;
+    Py_off_t pos;
 #endif
-	int ret;
-	int fd;
+    int ret;
+    int fd;
 
-	fd = self->fd;
-	if (fd < 0)
-		return err_closed();
-	if (!self->writable)
-		return err_mode("writing");
+    fd = self->fd;
+    if (fd < 0)
+        return err_closed();
+    if (!self->writable)
+        return err_mode("writing");
 
-	if (!PyArg_ParseTuple(args, "|O", &posobj))
-		return NULL;
+    if (!PyArg_ParseTuple(args, "|O", &posobj))
+        return NULL;
 
-	if (posobj == Py_None || posobj == NULL) {
-		/* Get the current position. */
-		posobj = portable_lseek(fd, NULL, 1);
-		if (posobj == NULL)
-			return NULL;
-	}
-	else {
-		Py_INCREF(posobj);
-	}
+    if (posobj == Py_None || posobj == NULL) {
+        /* Get the current position. */
+        posobj = portable_lseek(fd, NULL, 1);
+        if (posobj == NULL)
+            return NULL;
+    }
+    else {
+        Py_INCREF(posobj);
+    }
 
 #ifdef MS_WINDOWS
-	/* MS _chsize doesn't work if newsize doesn't fit in 32 bits,
-	   so don't even try using it. */
-	{
-		PyObject *oldposobj, *tempposobj;
-		HANDLE hFile;
-	
-		/* we save the file pointer position */
-		oldposobj = portable_lseek(fd, NULL, 1); 
-		if (oldposobj == NULL) {
-			Py_DECREF(posobj);
-			return NULL;
-		}
+    /* MS _chsize doesn't work if newsize doesn't fit in 32 bits,
+       so don't even try using it. */
+    {
+        PyObject *oldposobj, *tempposobj;
+        HANDLE hFile;
 
-		/* we then move to the truncation position */
-		tempposobj = portable_lseek(fd, posobj, 0);
-		if (tempposobj == NULL) {
-			Py_DECREF(oldposobj);
-			Py_DECREF(posobj);
-			return NULL;
-		}
-		Py_DECREF(tempposobj);
+        /* we save the file pointer position */
+        oldposobj = portable_lseek(fd, NULL, 1);
+        if (oldposobj == NULL) {
+            Py_DECREF(posobj);
+            return NULL;
+        }
 
-		/* Truncate.  Note that this may grow the file! */
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		hFile = (HANDLE)_get_osfhandle(fd);
-		ret = hFile == (HANDLE)-1; /* testing for INVALID_HANDLE value */
-		if (ret == 0) {
-			ret = SetEndOfFile(hFile) == 0;
-			if (ret)
-				errno = EACCES;
-		}
-		Py_END_ALLOW_THREADS
+        /* we then move to the truncation position */
+        tempposobj = portable_lseek(fd, posobj, 0);
+        if (tempposobj == NULL) {
+            Py_DECREF(oldposobj);
+            Py_DECREF(posobj);
+            return NULL;
+        }
+        Py_DECREF(tempposobj);
 
-		/* we restore the file pointer position in any case */
-		tempposobj = portable_lseek(fd, oldposobj, 0);
-		Py_DECREF(oldposobj);
-		if (tempposobj == NULL) {
-			Py_DECREF(posobj);
-			return NULL;
-		}
-		Py_DECREF(tempposobj);
-	}
+        /* Truncate.  Note that this may grow the file! */
+        Py_BEGIN_ALLOW_THREADS
+        errno = 0;
+        hFile = (HANDLE)_get_osfhandle(fd);
+        ret = hFile == (HANDLE)-1; /* testing for INVALID_HANDLE value */
+        if (ret == 0) {
+            ret = SetEndOfFile(hFile) == 0;
+            if (ret)
+                errno = EACCES;
+        }
+        Py_END_ALLOW_THREADS
+
+        /* we restore the file pointer position in any case */
+        tempposobj = portable_lseek(fd, oldposobj, 0);
+        Py_DECREF(oldposobj);
+        if (tempposobj == NULL) {
+            Py_DECREF(posobj);
+            return NULL;
+        }
+        Py_DECREF(tempposobj);
+    }
 #else
 
 #if defined(HAVE_LARGEFILE_SUPPORT)
-	pos = PyLong_AsLongLong(posobj);
+    pos = PyLong_AsLongLong(posobj);
 #else
-	pos = PyLong_AsLong(posobj);
+    pos = PyLong_AsLong(posobj);
 #endif
-	if (PyErr_Occurred()){
-		Py_DECREF(posobj);
-		return NULL;
-	}
+    if (PyErr_Occurred()){
+        Py_DECREF(posobj);
+        return NULL;
+    }
 
-	Py_BEGIN_ALLOW_THREADS
-	errno = 0;
-	ret = ftruncate(fd, pos);
-	Py_END_ALLOW_THREADS
+    Py_BEGIN_ALLOW_THREADS
+    errno = 0;
+    ret = ftruncate(fd, pos);
+    Py_END_ALLOW_THREADS
 
 #endif /* !MS_WINDOWS */
 
-	if (ret != 0) {
-		Py_DECREF(posobj);
-		PyErr_SetFromErrno(PyExc_IOError);
-		return NULL;
-	}
+    if (ret != 0) {
+        Py_DECREF(posobj);
+        PyErr_SetFromErrno(PyExc_IOError);
+        return NULL;
+    }
 
-	return posobj;
+    return posobj;
 }
 #endif /* HAVE_FTRUNCATE */
 
 static char *
 mode_string(fileio *self)
 {
-	if (self->readable) {
-		if (self->writable)
-			return "rb+";
-		else
-			return "rb";
-	}
-	else
-		return "wb";
+    if (self->readable) {
+        if (self->writable)
+            return "rb+";
+        else
+            return "rb";
+    }
+    else
+        return "wb";
 }
 
 static PyObject *
 fileio_repr(fileio *self)
 {
-	PyObject *nameobj, *res;
+    PyObject *nameobj, *res;
 
-        if (self->fd < 0)
-		return PyUnicode_FromFormat("<_io.FileIO [closed]>");
+    if (self->fd < 0)
+        return PyUnicode_FromFormat("<_io.FileIO [closed]>");
 
-	nameobj = PyObject_GetAttrString((PyObject *) self, "name");
-	if (nameobj == NULL) {
-		if (PyErr_ExceptionMatches(PyExc_AttributeError))
-			PyErr_Clear();
-		else
-			return NULL;
-		res = PyUnicode_FromFormat("<_io.FileIO fd=%d mode='%s'>",
-					   self->fd, mode_string(self));
-	}
-	else {
-		res = PyUnicode_FromFormat("<_io.FileIO name=%R mode='%s'>",
-					   nameobj, mode_string(self));
-		Py_DECREF(nameobj);
-	}
-	return res;
+    nameobj = PyObject_GetAttrString((PyObject *) self, "name");
+    if (nameobj == NULL) {
+        if (PyErr_ExceptionMatches(PyExc_AttributeError))
+            PyErr_Clear();
+        else
+            return NULL;
+        res = PyUnicode_FromFormat("<_io.FileIO fd=%d mode='%s'>",
+                                   self->fd, mode_string(self));
+    }
+    else {
+        res = PyUnicode_FromFormat("<_io.FileIO name=%R mode='%s'>",
+                                   nameobj, mode_string(self));
+        Py_DECREF(nameobj);
+    }
+    return res;
 }
 
 static PyObject *
 fileio_isatty(fileio *self)
 {
-	long res;
+    long res;
 
-	if (self->fd < 0)
-		return err_closed();
-	Py_BEGIN_ALLOW_THREADS
-	res = isatty(self->fd);
-	Py_END_ALLOW_THREADS
-	return PyBool_FromLong(res);
+    if (self->fd < 0)
+        return err_closed();
+    Py_BEGIN_ALLOW_THREADS
+    res = isatty(self->fd);
+    Py_END_ALLOW_THREADS
+    return PyBool_FromLong(res);
 }
 
 
@@ -916,7 +916,7 @@
 "file(name: str[, mode: str]) -> file IO object\n"
 "\n"
 "Open a file.  The mode can be 'r', 'w' or 'a' for reading (default),\n"
-"writing or appending.	The file will be created if it doesn't exist\n"
+"writing or appending.  The file will be created if it doesn't exist\n"
 "when opened for writing or appending; it will be truncated when\n"
 "opened for writing.  Add a '+' to the mode to allow simultaneous\n"
 "reading and writing.");
@@ -958,14 +958,14 @@
 
 #ifdef HAVE_FTRUNCATE
 PyDoc_STRVAR(truncate_doc,
-"truncate([size: int]) -> None.	 Truncate the file to at most size bytes.\n"
+"truncate([size: int]) -> None.  Truncate the file to at most size bytes.\n"
 "\n"
 "Size defaults to the current file position, as returned by tell()."
 "The current file position is changed to the value of size.");
 #endif
 
 PyDoc_STRVAR(tell_doc,
-"tell() -> int.	 Current file position");
+"tell() -> int.  Current file position");
 
 PyDoc_STRVAR(readinto_doc,
 "readinto() -> Same as RawIOBase.readinto().");
@@ -989,22 +989,22 @@
 "writable() -> bool.  True if file was opened in a write mode.");
 
 static PyMethodDef fileio_methods[] = {
-	{"read",     (PyCFunction)fileio_read,	   METH_VARARGS, read_doc},
-	{"readall",  (PyCFunction)fileio_readall,  METH_NOARGS,  readall_doc},
-	{"readinto", (PyCFunction)fileio_readinto, METH_VARARGS, readinto_doc},
-	{"write",    (PyCFunction)fileio_write,	   METH_VARARGS, write_doc},
-	{"seek",     (PyCFunction)fileio_seek,	   METH_VARARGS, seek_doc},
-	{"tell",     (PyCFunction)fileio_tell,	   METH_VARARGS, tell_doc},
+    {"read",     (PyCFunction)fileio_read,         METH_VARARGS, read_doc},
+    {"readall",  (PyCFunction)fileio_readall,  METH_NOARGS,  readall_doc},
+    {"readinto", (PyCFunction)fileio_readinto, METH_VARARGS, readinto_doc},
+    {"write",    (PyCFunction)fileio_write,        METH_VARARGS, write_doc},
+    {"seek",     (PyCFunction)fileio_seek,         METH_VARARGS, seek_doc},
+    {"tell",     (PyCFunction)fileio_tell,         METH_VARARGS, tell_doc},
 #ifdef HAVE_FTRUNCATE
-	{"truncate", (PyCFunction)fileio_truncate, METH_VARARGS, truncate_doc},
+    {"truncate", (PyCFunction)fileio_truncate, METH_VARARGS, truncate_doc},
 #endif
-	{"close",    (PyCFunction)fileio_close,	   METH_NOARGS,	 close_doc},
-	{"seekable", (PyCFunction)fileio_seekable, METH_NOARGS,	 seekable_doc},
-	{"readable", (PyCFunction)fileio_readable, METH_NOARGS,	 readable_doc},
-	{"writable", (PyCFunction)fileio_writable, METH_NOARGS,	 writable_doc},
-	{"fileno",   (PyCFunction)fileio_fileno,   METH_NOARGS,	 fileno_doc},
-	{"isatty",   (PyCFunction)fileio_isatty,   METH_NOARGS,	 isatty_doc},
-	{NULL,	     NULL}	       /* sentinel */
+    {"close",    (PyCFunction)fileio_close,        METH_NOARGS,  close_doc},
+    {"seekable", (PyCFunction)fileio_seekable, METH_NOARGS,      seekable_doc},
+    {"readable", (PyCFunction)fileio_readable, METH_NOARGS,      readable_doc},
+    {"writable", (PyCFunction)fileio_writable, METH_NOARGS,      writable_doc},
+    {"fileno",   (PyCFunction)fileio_fileno,   METH_NOARGS,      fileno_doc},
+    {"isatty",   (PyCFunction)fileio_isatty,   METH_NOARGS,      isatty_doc},
+    {NULL,           NULL}             /* sentinel */
 };
 
 /* 'closed' and 'mode' are attributes for backwards compatibility reasons. */
@@ -1012,68 +1012,68 @@
 static PyObject *
 get_closed(fileio *self, void *closure)
 {
-	return PyBool_FromLong((long)(self->fd < 0));
+    return PyBool_FromLong((long)(self->fd < 0));
 }
 
 static PyObject *
 get_closefd(fileio *self, void *closure)
 {
-	return PyBool_FromLong((long)(self->closefd));
+    return PyBool_FromLong((long)(self->closefd));
 }
 
 static PyObject *
 get_mode(fileio *self, void *closure)
 {
-	return PyUnicode_FromString(mode_string(self));
+    return PyUnicode_FromString(mode_string(self));
 }
 
 static PyGetSetDef fileio_getsetlist[] = {
-	{"closed", (getter)get_closed, NULL, "True if the file is closed"},
-	{"closefd", (getter)get_closefd, NULL, 
-		"True if the file descriptor will be closed"},
-	{"mode", (getter)get_mode, NULL, "String giving the file mode"},
-	{NULL},
+    {"closed", (getter)get_closed, NULL, "True if the file is closed"},
+    {"closefd", (getter)get_closefd, NULL,
+        "True if the file descriptor will be closed"},
+    {"mode", (getter)get_mode, NULL, "String giving the file mode"},
+    {NULL},
 };
 
 PyTypeObject PyFileIO_Type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	"_io.FileIO",
-	sizeof(fileio),
-	0,
-	(destructor)fileio_dealloc,		/* tp_dealloc */
-	0,					/* tp_print */
-	0,					/* tp_getattr */
-	0,					/* tp_setattr */
-	0,					/* tp_reserved */
-	(reprfunc)fileio_repr,			/* tp_repr */
-	0,					/* tp_as_number */
-	0,					/* tp_as_sequence */
-	0,					/* tp_as_mapping */
-	0,					/* tp_hash */
-	0,					/* tp_call */
-	0,					/* tp_str */
-	PyObject_GenericGetAttr,		/* tp_getattro */
-	0,					/* tp_setattro */
-	0,					/* tp_as_buffer */
-	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
-			| Py_TPFLAGS_HAVE_GC,	/* tp_flags */
-	fileio_doc,				/* tp_doc */
-	(traverseproc)fileio_traverse,		/* tp_traverse */
-	(inquiry)fileio_clear,			/* tp_clear */
-	0,					/* tp_richcompare */
-	offsetof(fileio, weakreflist),	/* tp_weaklistoffset */
-	0,					/* tp_iter */
-	0,					/* tp_iternext */
-	fileio_methods,				/* tp_methods */
-	0,					/* tp_members */
-	fileio_getsetlist,			/* tp_getset */
-	0,					/* tp_base */
-	0,					/* tp_dict */
-	0,					/* tp_descr_get */
-	0,					/* tp_descr_set */
-	offsetof(fileio, dict),         /* tp_dictoffset */
-	fileio_init,				/* tp_init */
-	PyType_GenericAlloc,			/* tp_alloc */
-	fileio_new,				/* tp_new */
-	PyObject_GC_Del,			/* tp_free */
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "_io.FileIO",
+    sizeof(fileio),
+    0,
+    (destructor)fileio_dealloc,                 /* tp_dealloc */
+    0,                                          /* tp_print */
+    0,                                          /* tp_getattr */
+    0,                                          /* tp_setattr */
+    0,                                          /* tp_reserved */
+    (reprfunc)fileio_repr,                      /* tp_repr */
+    0,                                          /* tp_as_number */
+    0,                                          /* tp_as_sequence */
+    0,                                          /* tp_as_mapping */
+    0,                                          /* tp_hash */
+    0,                                          /* tp_call */
+    0,                                          /* tp_str */
+    PyObject_GenericGetAttr,                    /* tp_getattro */
+    0,                                          /* tp_setattro */
+    0,                                          /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
+                    | Py_TPFLAGS_HAVE_GC,       /* tp_flags */
+    fileio_doc,                                 /* tp_doc */
+    (traverseproc)fileio_traverse,              /* tp_traverse */
+    (inquiry)fileio_clear,                      /* tp_clear */
+    0,                                          /* tp_richcompare */
+    offsetof(fileio, weakreflist),      /* tp_weaklistoffset */
+    0,                                          /* tp_iter */
+    0,                                          /* tp_iternext */
+    fileio_methods,                             /* tp_methods */
+    0,                                          /* tp_members */
+    fileio_getsetlist,                          /* tp_getset */
+    0,                                          /* tp_base */
+    0,                                          /* tp_dict */
+    0,                                          /* tp_descr_get */
+    0,                                          /* tp_descr_set */
+    offsetof(fileio, dict),         /* tp_dictoffset */
+    fileio_init,                                /* tp_init */
+    PyType_GenericAlloc,                        /* tp_alloc */
+    fileio_new,                                 /* tp_new */
+    PyObject_GC_Del,                            /* tp_free */
 };
