From 79ea738de5c4d863709ba7e3a9b294b61db4ca82 Mon Sep 17 00:00:00 2001 From: Artem Baguinski Date: Wed, 2 Apr 2008 21:44:48 +0200 Subject: [PATCH] lists support --- records.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/records.py b/records.py index 903bf26..be4596a 100644 --- a/records.py +++ b/records.py @@ -1,4 +1,4 @@ -import struct, os +import struct, os, re BIG_ENDIAN = True LITTLE_ENDIAN = False @@ -32,6 +32,17 @@ class Field(BaseField): def put_default(self, dict): dict[self.name] = self.default + class LenLookup: + re = re.compile("len\(([^)]+)\)") + def __init__(self, expr): + self.expr = expr + self.array_name = self.re.match(expr).group(1) + def get(self, dict): + return len( dict[self.array_name] ) + def put(self, dict, value): + dict[self.expr] = value + def put_default(self, dict): pass + class Const: def __init__(self, const, check): self.const = const @@ -58,7 +69,10 @@ class Field(BaseField): if name == '%reclen%': self.set_reclen = const_later elif name is not None: - set_value_handler(Field.Named(name,default)) + if Field.LenLookup.re.match(name) is not None: + set_value_handler(Field.LenLookup(name)) + else: + set_value_handler(Field.Named(name,default)) elif const is not None: set_value_handler(Field.Const(const, check)) else: @@ -75,6 +89,29 @@ class Field(BaseField): def write(self, file, dict): file.write( self.pack( self.get(dict) )) +class ListField(BaseField): + def __init__(self, name, cell): + self.cell = cell + self.name = name + + def read(self, file, dict): + lst = dict[self.name] if dict.has_key(self.name) else [] + n = dict["len(%s)" % self.name] + for i in xrange(0, n): + if i < len(lst): + lst[i] = self.cell.read(file, lst[i]) + else: + lst.append(self.cell.read(file, {})) + dict[self.name] = lst + + def write(self, file, dict): + lst = dict[ self.name ] + for c in lst: + self.cell.write( file, c ) + + # FIXME !!!! BAAAD !!!! + def get_size(self): return 0 + ### Packers class SimplePacker: def __init__(self, fmt): -- 2.11.4.GIT