Untabify! (Barry, this is gonna cost you a bottle of wine! ;)

This commit is contained in:
Fred Drake 2000-12-13 20:23:11 +00:00
parent f1c7c884b3
commit a63bd1c65b

View File

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