From 405ab2378e89b6eb5148c096de113558cb52dad4 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 28 Feb 1996 23:58:09 +0000 Subject: *** empty log message *** --- Lib/ArrayIO.py | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100755 Lib/ArrayIO.py diff --git a/Lib/ArrayIO.py b/Lib/ArrayIO.py new file mode 100755 index 0000000..4a163ac --- /dev/null +++ b/Lib/ArrayIO.py @@ -0,0 +1,122 @@ +# port of StringIO.py using arrays +# ArrayIO.py +# jjk 02/28/96 001 direct mod of StringIO, test suite checks out +# jjk 02/28/96 002 inherit from StringIO, test suite checks out +# jjk 02/28/96 003 add __xx__() functions +# +# class ArrayIO implements file-like objects that read/write a +# string buffer (a.k.a. "memory files"). +# +# all methods that interface with ArrayIO pass strings. Internally, however, +# ArrayIO uses an array object. +# +# the interface is the same as StringIO.py +# also handles len(a), a[i], a[i]='x', a[i:j], a[i:j] = aString +# + +import string +import array +import StringIO + +class ArrayIO(StringIO.StringIO): +# jjk 02/28/96 + def __init__(self, buf = ''): + #jjk 02/28/96 + self.buf = array.array('c', buf) + self.pos = 0 + self.closed = 0 + def __len__(self): + #jjk 02/28/96 + return len(self.buf) + def __getitem__(self, key): + #jjk 02/28/96 + return self.buf[key] + def __setitem__(self, key, item): + #jjk 02/28/96 + self.buf[key] = item + def __getslice__(self, i, j): + #jjk 02/28/96 + return self.buf[i:j].tostring() + def __setslice__(self, i, j, aString): + #jjk 02/28/96 + self.buf[i:j] = array.array('c', aString) + def read(self, n = 0): + #jjk 02/28/96 + r = StringIO.StringIO.read(self, n) + return (r.tostring()) + def _findCharacter(self, char, start): + #probably very slow + #jjk 02/28/96 + for i in range(max(start, 0), len(self.buf)): + if (self.buf[i] == char): + return(i) + return(-1) + def readline(self): + #jjk 02/28/96 + i = self._findCharacter('\n', self.pos) + if i < 0: + newpos = len(self.buf) + else: + newpos = i+1 + r = self.buf[self.pos:newpos].tostring() + self.pos = newpos + return r + def write(self, s): + #jjk 02/28/96 + if not s: return + if self.pos > len(self.buf): + self.buf.fromstring('\0'*(self.pos - len(self.buf))) + newpos = self.pos + len(s) + self.buf[self.pos:newpos] = array.array('c', s) + self.pos = newpos + def getvalue(self): + #jjk 02/28/96 + return self.buf.tostring() + + +# A little test suite +# identical to test suite in StringIO.py , except for "f = ArrayIO()" +# too bad I couldn't inherit this :-) + +def test(): + import sys + if sys.argv[1:]: + file = sys.argv[1] + else: + file = '/etc/passwd' + lines = open(file, 'r').readlines() + text = open(file, 'r').read() + f = ArrayIO() + for line in lines[:-2]: + f.write(line) + f.writelines(lines[-2:]) + if f.getvalue() != text: + raise RuntimeError, 'write failed' + length = f.tell() + print 'File length =', length + f.seek(len(lines[0])) + f.write(lines[1]) + f.seek(0) + print 'First line =', `f.readline()` + here = f.tell() + line = f.readline() + print 'Second line =', `line` + f.seek(-len(line), 1) + line2 = f.read(len(line)) + if line != line2: + 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' + print 'Read', len(list), 'more lines' + print 'File length =', f.tell() + if f.tell() != length: + raise RuntimeError, 'bad length' + f.close() + +if __name__ == '__main__': + test() -- cgit v0.12