self.filename = filename
self.file = file
self.current_line = 0 # assuming that file is at BOF!
+
+ # 'linestart' stores the file offset of the start of each logical
+ # line; it is used to back up the file pointer when the caller
+ # wants to "unread" a line
+ self.linestart = []
def open (self, filename):
buildup_line = ''
while 1:
+ # record current file position; this will be appended to
+ # the linestart array *unless* we're accumulating a
+ # continued logical line
+ current_pos = self.file.tell()
+
# read the line, optionally strip comments
line = self.file.readline()
if self.strip_comments and line:
self.current_line[1] = self.current_line[1] + 1
else:
self.current_line = [self.current_line, self.current_line+1]
+
+ # Forget current position: don't want to save it in the
+ # middle of a logical line
+ current_pos = None
+
# just an ordinary line, read it as usual
else:
if not line:
self.current_line = self.current_line[1] + 1
else:
self.current_line = self.current_line + 1
-
+
# strip whitespace however the client wants (leading and
# trailing, or one or the other, or neither)
if line == '' or line == '\n' and self.skip_blanks:
continue
+ # if we're still here and have kept the current position,
+ # then this physical line starts a logical line; record its
+ # starting offset
+ if current_pos is not None:
+ self.linestart.append (current_pos)
+
if self.join_lines:
if line[-1] == '\\':
buildup_line = line[:-1]
# end readline
+ def unreadline (self):
+ if not self.linestart:
+ raise IOError, "at beginning of file -- can't unreadline"
+ pos = self.linestart[-1]
+ del self.linestart[-1]
+ self.file.seek (pos)
+
+
def readlines (self):
lines = []
while 1: