1.1 --- a/iixr/files.py Tue Sep 15 00:15:58 2009 +0200
1.2 +++ b/iixr/files.py Tue Sep 15 00:32:56 2009 +0200
1.3 @@ -137,12 +137,20 @@
1.4
1.5 def __init__(self, f):
1.6 File.__init__(self, f)
1.7 - self.reset_cache()
1.8 + self.reset_cache(0)
1.9
1.10 - def reset_cache(self):
1.11 + def reset_cache(self, offset):
1.12 self.cache = ""
1.13 self.cache_length = 0
1.14 self.cache_start = 0
1.15 + self.cache_offset = offset
1.16 + self.f.seek(offset)
1.17 +
1.18 + def resize_cache(self, next_start):
1.19 + self.cache = self.cache[next_start:]
1.20 + self.cache_length = len(self.cache)
1.21 + self.cache_start = 0
1.22 + self.cache_offset += next_start
1.23
1.24 def read_number(self):
1.25
1.26 @@ -217,31 +225,28 @@
1.27 return s
1.28
1.29 def tell(self):
1.30 - return self.f.tell() - self.cache_length + self.cache_start
1.31 + return self.cache_offset + self.cache_start
1.32
1.33 def seek(self, offset):
1.34 current = self.tell()
1.35 - self.f.seek(offset)
1.36
1.37 # If seeking forward, attempt to navigate the cache.
1.38
1.39 if offset >= current:
1.40 self._seek_cache(offset - current)
1.41 else:
1.42 - self.reset_cache()
1.43 + self.reset_cache(offset)
1.44
1.45 def _seek_cache(self, delta):
1.46 next_start = self.cache_start + delta
1.47
1.48 if next_start > 0 and next_start >= len(self.cache):
1.49 - self.reset_cache()
1.50 + self.reset_cache(self.cache_offset + next_start)
1.51
1.52 # If the cache is too big, resize it.
1.53
1.54 elif next_start > READ_CACHE_RESIZE:
1.55 - self.cache = self.cache[next_start:]
1.56 - self.cache_length = len(self.cache)
1.57 - self.cache_start = 0
1.58 + self.resize_cache(next_start)
1.59
1.60 # Otherwise, just reference the next part of the cache.
1.61