Cleanup: simplify block path resolving

move into own function, use from field get/set
This commit is contained in:
2014-10-16 16:04:48 +02:00
parent 754c571210
commit ef5f4bb1eb

View File

@@ -504,14 +504,23 @@ class DNAStruct:
if dna_name.name_short == name: if dna_name.name_short == name:
return field return field
def field_from_path(self, path):
assert(type(path) == bytes)
name, _, name_tail = path.partition(b'.')
field = self.field_from_name(name)
if field is not None:
if name_tail == b'':
return field
else:
return field.dna_type[2].field_from_path(name_tail)
def field_get(self, header, handle, path, def field_get(self, header, handle, path,
use_nil=True, use_str=True): use_nil=True, use_str=True):
assert(type(path) == bytes) assert(type(path) == bytes)
splitted = path.partition(b'.')
name = splitted[0]
rest = splitted[2]
field = self.field_from_name(name) field = self.field_from_path(path)
if field is None: if field is None:
raise KeyError("%r not found in %r" % (path, [s[1].name_short for s in self.fields])) raise KeyError("%r not found in %r" % (path, [s[1].name_short for s in self.fields]))
@@ -519,37 +528,30 @@ class DNAStruct:
dna_name = field.dna_name dna_name = field.dna_name
handle.seek(field.dna_offset, os.SEEK_CUR) handle.seek(field.dna_offset, os.SEEK_CUR)
if rest == b'': if dna_name.is_pointer:
if dna_name.is_pointer: return DNA_IO.read_pointer(handle, header)
return DNA_IO.read_pointer(handle, header) elif dna_type[0] == b'int':
elif dna_type[0] == b'int': return DNA_IO.read_int(handle, header)
return DNA_IO.read_int(handle, header) elif dna_type[0] == b'short':
elif dna_type[0] == b'short': return DNA_IO.read_short(handle, header)
return DNA_IO.read_short(handle, header) elif dna_type[0] == b'float':
elif dna_type[0] == b'float': return DNA_IO.read_float(handle, header)
return DNA_IO.read_float(handle, header) elif dna_type[0] == b'char':
elif dna_type[0] == b'char': if use_str:
if use_str: if use_nil:
if use_nil: return DNA_IO.read_string0(handle, dna_name.array_size)
return DNA_IO.read_string0(handle, dna_name.array_size)
else:
return DNA_IO.read_string(handle, dna_name.array_size)
else: else:
if use_nil: return DNA_IO.read_string(handle, dna_name.array_size)
return DNA_IO.read_bytes0(handle, dna_name.array_size) else:
else: if use_nil:
return DNA_IO.read_bytes(handle, dna_name.array_size) return DNA_IO.read_bytes0(handle, dna_name.array_size)
else: else:
return dna_type[2].field_get(header, handle, rest, return DNA_IO.read_bytes(handle, dna_name.array_size)
use_nil=use_nil, use_str=use_str)
def field_set(self, header, handle, path, value): def field_set(self, header, handle, path, value):
assert(type(path) == bytes) assert(type(path) == bytes)
splitted = path.partition(b'.')
name = splitted[0]
rest = splitted[2]
field = self.field_from_name(name) field = self.field_from_path(path)
if field is None: if field is None:
raise KeyError("%r not found in %r" % (path, [f.dna_name.name_short for s in self.fields])) raise KeyError("%r not found in %r" % (path, [f.dna_name.name_short for s in self.fields]))
@@ -557,14 +559,13 @@ class DNAStruct:
dna_name = field.dna_name dna_name = field.dna_name
handle.seek(field.dna_offset, os.SEEK_CUR) handle.seek(field.dna_offset, os.SEEK_CUR)
if rest == b'': if dna_type[0] == b'char':
if dna_type[0] == b'char': if type(value) is str:
if type(value) is str: return DNA_IO.write_string(handle, value, dna_name.array_size)
return DNA_IO.write_string(handle, value, dna_name.array_size) else:
else: return DNA_IO.write_bytes(handle, value, dna_name.array_size)
return DNA_IO.write_bytes(handle, value, dna_name.array_size)
else: else:
return dna_type[2].field_set(header, handle, rest, value) raise NotImplementedError("Setting %r is not yet supported" % dna_type[0])
class DNA_IO: class DNA_IO: