summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1996-05-28 23:17:13 (GMT)
committerGuido van Rossum <guido@python.org>1996-05-28 23:17:13 (GMT)
commit1b5a1d07704064181b76116d4529297d71769fdf (patch)
tree4deea77cd7cc164684fc0c6288ac51fb43857b8e /Lib
parent72e316428fe4603cdafa91c3d215ade87bf3c4b7 (diff)
downloadcpython-1b5a1d07704064181b76116d4529297d71769fdf.zip
cpython-1b5a1d07704064181b76116d4529297d71769fdf.tar.gz
cpython-1b5a1d07704064181b76116d4529297d71769fdf.tar.bz2
Total rewrite
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/ArrayIO.py136
1 files changed, 78 insertions, 58 deletions
diff --git a/Lib/ArrayIO.py b/Lib/ArrayIO.py
index 4a163ac..5b06f92 100755
--- a/Lib/ArrayIO.py
+++ b/Lib/ArrayIO.py
@@ -1,82 +1,102 @@
-# 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
-#
+"""File-like objects that read/write an array buffer.
+
+This implements (nearly) all stdio methods.
+
+f = ArrayIO() # ready for writing
+f = ArrayIO(buf) # ready for reading
+f.close() # explicitly release resources held
+flag = f.isatty() # always false
+pos = f.tell() # get current position
+f.seek(pos) # set current position
+f.seek(pos, mode) # mode 0: absolute; 1: relative; 2: relative to EOF
+buf = f.read() # read until EOF
+buf = f.read(n) # read up to n bytes
+buf = f.readline() # read until end of line ('\n') or EOF
+list = f.readlines()# list of f.readline() results until EOF
+f.write(buf) # write at current position
+f.writelines(list) # for line in list: f.write(line)
+f.getvalue() # return whole file's contents as a string
+
+Notes:
+- This is very similar to StringIO. StringIO is faster for reading,
+ but ArrayIO is faster for writing.
+- ArrayIO uses an array object internally, but all its interfaces
+ accept and return strings.
+- Using a real file is often faster (but less convenient).
+- fileno() is left unimplemented so that code which uses it triggers
+ an exception early.
+- Seeking far beyond EOF and then writing will insert real null
+ bytes that occupy space in the buffer.
+- There's a simple test set (see end of this file).
+"""
import string
-import array
-import StringIO
+from array import array
-class ArrayIO(StringIO.StringIO):
-# jjk 02/28/96
+class ArrayIO:
def __init__(self, buf = ''):
- #jjk 02/28/96
- self.buf = array.array('c', buf)
+ self.buf = 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)
+ self.softspace = 0
+ def close(self):
+ if not self.closed:
+ self.closed = 1
+ del self.buf, self.pos
+ def isatty(self):
+ return 0
+ def seek(self, pos, mode = 0):
+ if mode == 1:
+ pos = pos + self.pos
+ elif mode == 2:
+ pos = pos + len(self.buf)
+ self.pos = max(0, pos)
+ def tell(self):
+ return self.pos
+ def read(self, n = -1):
+ if n < 0:
+ newpos = len(self.buf)
+ else:
+ newpos = min(self.pos+n, len(self.buf))
+ r = self.buf[self.pos:newpos].tostring()
+ self.pos = newpos
+ return r
def readline(self):
- #jjk 02/28/96
- i = self._findCharacter('\n', self.pos)
+ i = string.find(self.buf[self.pos:].tostring(), '\n')
if i < 0:
newpos = len(self.buf)
else:
- newpos = i+1
+ newpos = self.pos+i+1
r = self.buf[self.pos:newpos].tostring()
self.pos = newpos
return r
+ def readlines(self):
+ lines = string.splitfields(self.read(), '\n')
+ if not lines:
+ return lines
+ for i in range(len(lines)-1):
+ lines[i] = lines[i] + '\n'
+ if not lines[-1]:
+ del lines[-1]
+ return lines
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)
+ a = array('c', s)
+ n = self.pos - len(self.buf)
+ if n > 0:
+ self.buf[len(self.buf):] = array('c', '\0')*n
+ newpos = self.pos + len(a)
+ self.buf[self.pos:newpos] = a
self.pos = newpos
+ def writelines(self, list):
+ self.write(string.joinfields(list, ''))
+ def flush(self):
+ pass
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