def patch_field(self, field, dest, names): byte_size = math.floor(field.size / 8) # Only patch fields with a 2- or 4 times multiple of 8 # Greater sizes are taken care of differently if byte_size != 2 and byte_size != 4: dest.fields.append(field) return # A field name is four letters in size, try all combinations except 0 subfields = [] for i in range(1, 4): # Try to create all sub-fields without name collisions for j in range(0, byte_size): # Create new name by changing character at i to j curr_name = field.name[:i] + str(j) + field.name[i + 1:] # Collision, stop the loop if len(list(filter(lambda x: x == curr_name, names))) != 0: subfields = [] break # Create subfield subfield = Field(field.offset + j, -1, []) subfield.name = curr_name subfield.size = 8 subfield.former_name = field.name # Append subfield names.append(subfield.name) subfields.append(subfield) # Process was successful, no further trials required if len(subfields) == byte_size: break # Not successful, even after all four tries, exit the program if len(subfields) != byte_size: print( f'Could not create subfields for field {field.name} without name-collisions!' ) sys.exit() dest.fields = dest.fields + subfields return