Change the file's indentation from tabs to 4 spaces per level.

This commit is contained in:
Barry Warsaw 2000-12-12 23:16:51 +00:00
parent c7ed0e3c13
commit c140131995

View file

@ -30,167 +30,179 @@ Notes:
""" """
try: try:
from errno import EINVAL from errno import EINVAL
except ImportError: except ImportError:
EINVAL = 22 EINVAL = 22
EMPTYSTRING = '' 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.pos = 0
self.closed = 0
self.softspace = 0
def close(self):
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
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)
def tell(self):
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
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
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
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]
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.pos = 0 self.buflist = [self.buf[:self.pos], s, self.buf[newpos:]]
self.closed = 0 self.buf = ''
self.softspace = 0 if newpos > self.len:
def close(self): self.len = newpos
if not self.closed: else:
self.closed = 1 self.buflist.append(s)
del self.buf, self.pos self.len = newpos
def isatty(self): self.pos = newpos
if self.closed:
raise ValueError, "I/O operation on closed file" def writelines(self, list):
return 0 self.write(EMPTYSTRING.join(list))
def seek(self, pos, mode = 0):
if self.closed: def flush(self):
raise ValueError, "I/O operation on closed file" if self.closed:
if self.buflist: raise ValueError, "I/O operation on closed file"
self.buf += EMPTYSTRING.join(self.buflist)
self.buflist = [] def getvalue(self):
if mode == 1: if self.buflist:
pos += self.pos self.buf += EMPTYSTRING.join(self.buflist)
elif mode == 2: self.buflist = []
pos += self.len return self.buf
self.pos = max(0, pos)
def tell(self):
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
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
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
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]
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
def writelines(self, list):
self.write(EMPTYSTRING.join(list))
def flush(self):
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
# A little test suite # A little test suite
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]))
f.write(lines[1]) f.write(lines[1])
f.seek(0) f.seek(0)
print 'First line =', `f.readline()` print 'First line =', `f.readline()`
here = f.tell() here = f.tell()
line = f.readline() line = f.readline()
print 'Second line =', `line` print 'Second line =', `line`
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__':
test() test()