Пример #1
0
    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