diff --git a/Lib/StringIO.py b/Lib/StringIO.py
index 98f190f..5fac590 100644
--- a/Lib/StringIO.py
+++ b/Lib/StringIO.py
@@ -38,128 +38,128 @@
 
 class StringIO:
     def __init__(self, buf = ''):
-	self.buf = buf
-	self.len = len(buf)
-	self.buflist = []
-	self.pos = 0
-	self.closed = 0
-	self.softspace = 0
+        self.buf = buf
+        self.len = len(buf)
+        self.buflist = []
+        self.pos = 0
+        self.closed = 0
+        self.softspace = 0
 
     def close(self):
-	if not self.closed:
-	    self.closed = 1
-	    del self.buf, self.pos
+        if not self.closed:
+            self.closed = 1
+            del self.buf, self.pos
 
     def isatty(self):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
-	return 0
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
+        return 0
 
     def seek(self, pos, mode = 0):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
-	if self.buflist:
-	    self.buf += EMPTYSTRING.join(self.buflist)
-	    self.buflist = []
-	if mode == 1:
-	    pos += self.pos
-	elif mode == 2:
-	    pos += self.len
-	self.pos = max(0, pos)
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
+        if self.buflist:
+            self.buf += EMPTYSTRING.join(self.buflist)
+            self.buflist = []
+        if mode == 1:
+            pos += self.pos
+        elif mode == 2:
+            pos += self.len
+        self.pos = max(0, pos)
 
     def tell(self):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
-	return self.pos
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
+        return self.pos
 
     def read(self, n = -1):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
-	if self.buflist:
-	    self.buf += EMPTYSTRING.join(self.buflist)
-	    self.buflist = []
-	if n < 0:
-	    newpos = self.len
-	else:
-	    newpos = min(self.pos+n, self.len)
-	r = self.buf[self.pos:newpos]
-	self.pos = newpos
-	return r
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
+        if self.buflist:
+            self.buf += EMPTYSTRING.join(self.buflist)
+            self.buflist = []
+        if n < 0:
+            newpos = self.len
+        else:
+            newpos = min(self.pos+n, self.len)
+        r = self.buf[self.pos:newpos]
+        self.pos = newpos
+        return r
 
     def readline(self, length=None):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
-	if self.buflist:
-	    self.buf += EMPTYSTRING.join(self.buflist)
-	    self.buflist = []
-	i = self.buf.find('\n', self.pos)
-	if i < 0:
-	    newpos = self.len
-	else:
-	    newpos = i+1
-	if length is not None:
-	    if self.pos + length < newpos:
-		newpos = self.pos + length
-	r = self.buf[self.pos:newpos]
-	self.pos = newpos
-	return r
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
+        if self.buflist:
+            self.buf += EMPTYSTRING.join(self.buflist)
+            self.buflist = []
+        i = self.buf.find('\n', self.pos)
+        if i < 0:
+            newpos = self.len
+        else:
+            newpos = i+1
+        if length is not None:
+            if self.pos + length < newpos:
+                newpos = self.pos + length
+        r = self.buf[self.pos:newpos]
+        self.pos = newpos
+        return r
 
     def readlines(self, sizehint = 0):
-	total = 0
-	lines = []
-	line = self.readline()
-	while line:
-	    lines.append(line)
-	    total += len(line)
-	    if 0 < sizehint <= total:
-		break
-	    line = self.readline()
-	return lines
+        total = 0
+        lines = []
+        line = self.readline()
+        while line:
+            lines.append(line)
+            total += len(line)
+            if 0 < sizehint <= total:
+                break
+            line = self.readline()
+        return lines
 
     def truncate(self, size=None):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
-	if size is None:
-	    size = self.pos
-	elif size < 0:
-	    raise IOError(EINVAL, "Negative size not allowed")
-	elif size < self.pos:
-	    self.pos = size
-	self.buf = self.getvalue()[:size]
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
+        if size is None:
+            size = self.pos
+        elif size < 0:
+            raise IOError(EINVAL, "Negative size not allowed")
+        elif size < self.pos:
+            self.pos = size
+        self.buf = self.getvalue()[:size]
 
     def write(self, s):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
-	if not s: return
-	if self.pos > self.len:
-	    self.buflist.append('\0'*(self.pos - self.len))
-	    self.len = self.pos
-	newpos = self.pos + len(s)
-	if self.pos < self.len:
-	    if self.buflist:
-		self.buf += EMPTYSTRING.join(self.buflist)
-		self.buflist = []
-	    self.buflist = [self.buf[:self.pos], s, self.buf[newpos:]]
-	    self.buf = ''
-	    if newpos > self.len:
-		self.len = newpos
-	else:
-	    self.buflist.append(s)
-	    self.len = newpos
-	self.pos = newpos
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
+        if not s: return
+        if self.pos > self.len:
+            self.buflist.append('\0'*(self.pos - self.len))
+            self.len = self.pos
+        newpos = self.pos + len(s)
+        if self.pos < self.len:
+            if self.buflist:
+                self.buf += EMPTYSTRING.join(self.buflist)
+                self.buflist = []
+            self.buflist = [self.buf[:self.pos], s, self.buf[newpos:]]
+            self.buf = ''
+            if newpos > self.len:
+                self.len = newpos
+        else:
+            self.buflist.append(s)
+            self.len = newpos
+        self.pos = newpos
 
     def writelines(self, list):
-	self.write(EMPTYSTRING.join(list))
+        self.write(EMPTYSTRING.join(list))
 
     def flush(self):
-	if self.closed:
-	    raise ValueError, "I/O operation on closed file"
+        if self.closed:
+            raise ValueError, "I/O operation on closed file"
 
     def getvalue(self):
-	if self.buflist:
-	    self.buf += EMPTYSTRING.join(self.buflist)
-	    self.buflist = []
-	return self.buf
+        if self.buflist:
+            self.buf += EMPTYSTRING.join(self.buflist)
+            self.buflist = []
+        return self.buf
 
 
 # A little test suite
@@ -167,17 +167,17 @@
 def test():
     import sys
     if sys.argv[1:]:
-	file = sys.argv[1]
+        file = sys.argv[1]
     else:
-	file = '/etc/passwd'
+        file = '/etc/passwd'
     lines = open(file, 'r').readlines()
     text = open(file, 'r').read()
     f = StringIO()
     for line in lines[:-2]:
-	f.write(line)
+        f.write(line)
     f.writelines(lines[-2:])
     if f.getvalue() != text:
-	raise RuntimeError, 'write failed'
+        raise RuntimeError, 'write failed'
     length = f.tell()
     print 'File length =', length
     f.seek(len(lines[0]))
@@ -190,18 +190,18 @@
     f.seek(-len(line), 1)
     line2 = f.read(len(line))
     if line != line2:
-	raise RuntimeError, 'bad result after seek back'
+        raise RuntimeError, 'bad result after seek back'
     f.seek(len(line2), 1)
     list = f.readlines()
     line = list[-1]
     f.seek(f.tell() - len(line))
     line2 = f.read()
     if line != line2:
-	raise RuntimeError, 'bad result after seek back from EOF'
+        raise RuntimeError, 'bad result after seek back from EOF'
     print 'Read', len(list), 'more lines'
     print 'File length =', f.tell()
     if f.tell() != length:
-	raise RuntimeError, 'bad length'
+        raise RuntimeError, 'bad length'
     f.close()
 
 if __name__ == '__main__':
