Class StructureDataType

    • Field Detail

      • offsetComparator

        protected static java.util.Comparator<java.lang.Object> offsetComparator
      • structLength

        protected int structLength
      • numComponents

        protected int numComponents
    • Constructor Detail

      • StructureDataType

        public StructureDataType​(java.lang.String name,
                                 int length)
        Construct a new structure with the given name and number of undefined bytes
        Parameters:
        name - the name of the new structure
        length - the initial size of the structure
      • StructureDataType

        public StructureDataType​(java.lang.String name,
                                 int length,
                                 DataTypeManager dtm)
      • StructureDataType

        public StructureDataType​(CategoryPath path,
                                 java.lang.String name,
                                 int length)
        Construct a new structure with the given name and number of undefined bytes
        Parameters:
        path - the category path indicating where this data type is located.
        name - the name of the new structure
        length - the initial size of the structure
      • StructureDataType

        public StructureDataType​(CategoryPath path,
                                 java.lang.String name,
                                 int length,
                                 UniversalID universalID,
                                 SourceArchive sourceArchive,
                                 long lastChangeTime,
                                 long lastChangeTimeInSourceArchive,
                                 DataTypeManager dtm)
        Construct a new structure with the given name and number of undefined bytes
        Parameters:
        path - the category path indicating where this data type is located.
        name - the name of the new structure
        length - the initial size of the structure
        dataTypeManager - the data type manager associated with this data type. This can be null. Also, the data type manager may not contain this actual data type.
    • Method Detail

      • getRepresentation

        public java.lang.String getRepresentation​(MemBuffer buf,
                                                  Settings settings,
                                                  int length)
        Description copied from interface: DataType
        Get bytes from memory in a printable format for this type.
        Specified by:
        getRepresentation in interface DataType
        Parameters:
        buf - the data.
        settings - the settings to use for the representation.
        length - the number of bytes to represent.
        Returns:
        the representation of the data in this format, never null.
      • isNotYetDefined

        public boolean isNotYetDefined()
        Description copied from interface: DataType
        Indicates if type has not yet been defined. Such types will always return a size of 1. (example: empty structure)
        Specified by:
        isNotYetDefined in interface DataType
        Overrides:
        isNotYetDefined in class DataTypeImpl
        Returns:
        true if this type is not yet defined.
      • getComponentAt

        public DataTypeComponent getComponentAt​(int offset)
        Description copied from interface: Structure
        Gets the immediate child component that contains the byte at the given offset.
        Specified by:
        getComponentAt in interface Structure
        Parameters:
        offset - the byte offset into this data type
        Returns:
        the immediate child component.
      • getDataTypeAt

        public DataTypeComponent getDataTypeAt​(int offset)
        Description copied from interface: Structure
        Returns the primitive Data Type that is at this offset. This is useful for prototypes that have components that are made up of other components
        Specified by:
        getDataTypeAt in interface Structure
        Parameters:
        offset - the byte offset into this data type.
        Returns:
        the primitive data type at the offset.
      • getLength

        public int getLength()
        Description copied from interface: DataType
        Get the length (number of 8-bit bytes) of this DataType.
        Specified by:
        getLength in interface DataType
        Returns:
        the length of this DataType
      • delete

        public void delete​(int index)
        Description copied from interface: Structure
        Deletes the ComponentDataType at the given index
        Specified by:
        delete in interface Composite
        Specified by:
        delete in interface Structure
        Parameters:
        index - the index of the component to be deleted.
      • delete

        public void delete​(int[] ordinals)
        Description copied from interface: Composite
        Deletes the components at the given ordinal positions.
        Note: For an aligned structure the delete will have no effect if the ordinal position is a component that provides alignment padding.
        Specified by:
        delete in interface Composite
        Parameters:
        ordinals - the ordinals of the component to be deleted.
      • shiftOffsets

        protected void shiftOffsets​(DataTypeComponentImpl dtc,
                                    int deltaOrdinal,
                                    int deltaOffset)
      • getNumComponents

        public int getNumComponents()
        Description copied from interface: Structure
        Gets the number of component data types in this data type excluding any trailing flexible array component if present.
        Specified by:
        getNumComponents in interface Composite
        Specified by:
        getNumComponents in interface Structure
        Returns:
        the number of components that make up this data prototype
      • getNumDefinedComponents

        public int getNumDefinedComponents()
        Description copied from interface: Structure
        Returns the number of non-undefined components in this composite. For example, say a structure has an int (4 bytes) at offset 0 and another int at offset 8. This structure would have 6 total components (one for each undefined between the two ints), but only 2 defined components. Any trailing flexible array component will not be included in this count.
        Specified by:
        getNumDefinedComponents in interface Structure
        Returns:
        the number of non-undefined components in this composite
      • insertAtOffset

        public DataTypeComponent insertAtOffset​(int offset,
                                                DataType dataType,
                                                int length,
                                                java.lang.String componentName,
                                                java.lang.String comment)
        Description copied from interface: Structure
        Inserts a new datatype at the specified offset into this structure.
        Specified by:
        insertAtOffset in interface Structure
        Parameters:
        offset - the byte offset into the structure where the new datatype is to be inserted.
        dataType - the datatype to insert.
        length - the length to associate with the dataType;
        componentName - the field name to associate with this component.
        comment - the comment to associate with this component.
        Returns:
        the componentDataType created.
      • insertAtOffset

        public DataTypeComponent insertAtOffset​(int offset,
                                                DataType dataType,
                                                int length)
        Description copied from interface: Structure
        Inserts a new datatype at the specified offset into this structure.
        Specified by:
        insertAtOffset in interface Structure
        Parameters:
        offset - the byte offset into the structure where the new datatype is to be inserted.
        dataType - the datatype to insert.
        Returns:
        the componentDataType created.
      • add

        public void add​(DataType dataType,
                        int length,
                        java.lang.String componentName,
                        java.lang.String comment,
                        int numCopies)
      • growStructure

        public void growStructure​(int amount)
        Description copied from interface: Structure
        Increases the size of the structure by the given amount by adding undefined datatypes at the end of the structure.
        Specified by:
        growStructure in interface Structure
        Parameters:
        amount - the amount by which to grow the structure.
      • insert

        public DataTypeComponent insert​(int index,
                                        DataType dataType,
                                        int length,
                                        java.lang.String componentName,
                                        java.lang.String comment)
        Description copied from interface: Composite
        Inserts a new datatype at the specified ordinal position in this composite.
        Note: For an aligned structure the ordinal position will get adjusted automatically to provide the proper alignment.
        Specified by:
        insert in interface Composite
        Specified by:
        insert in interface Structure
        Parameters:
        index - the ordinal where the new datatype is to be inserted.
        dataType - the datatype to insert.
        length - the length to associate with the datatype.
        componentName - the field name to associate with this component.
        comment - the comment to associate with this component.
        Returns:
        the componentDataType created.
        See Also:
        Composite.insert(int, ghidra.program.model.data.DataType, int, java.lang.String, java.lang.String)
      • insert

        public void insert​(int ordinal,
                           DataType dataType,
                           int length,
                           java.lang.String name,
                           java.lang.String comment,
                           int numCopies)
        Specified by:
        insert in interface Structure
      • deleteAtOffset

        public void deleteAtOffset​(int offset)
        Description copied from interface: Structure
        Deletes the datatype at the specified offset in this structure.
        Specified by:
        deleteAtOffset in interface Structure
        Parameters:
        offset - the byte offset into the structure where the datatype is to be deleted.
      • isEquivalent

        public boolean isEquivalent​(DataType dataType)
        Description copied from interface: DataType
        Returns true if the given dataType is equivalent to this dataType. The precise meaning of "equivalent" is dataType dependent.
        Specified by:
        isEquivalent in interface DataType
        Parameters:
        dataType - the dataType being tested for equivalence.
        Returns:
        true if the if the given dataType is equivalent to this dataType.
      • dataTypeSizeChanged

        public void dataTypeSizeChanged​(DataType dt)
        Description copied from interface: DataType
        Notification that the given dataType's size has changed. DataTypes may need to make internal changes in response.
        TODO: This method is reserved for internal DB use and should be removed from the public DataType interface!!
        Specified by:
        dataTypeSizeChanged in interface DataType
        Parameters:
        dt - the dataType that has changed.
      • dataTypeAlignmentChanged

        public void dataTypeAlignmentChanged​(DataType dt)
        Description copied from interface: Composite
        The overall (external) alignment changed for the specified data type. In other words, the data type has a different alignment when placed inside other structures.
        Specified by:
        dataTypeAlignmentChanged in interface Composite
        Parameters:
        dt - the data type whose alignment changed.
      • copy

        public DataType copy​(DataTypeManager dtm)
        Description copied from interface: DataType
        Returns a new instance of this DataType with a new identity. Note: for built-in DataType's, clone and copy should have the same affect.
        Specified by:
        copy in interface DataType
        Parameters:
        dtm - the data-type manager instance whose data-organization should apply.
      • clone

        public DataType clone​(DataTypeManager dtm)
        Description copied from interface: DataType
        Returns a new instance of this DataType with its universalID and SourceArchive identity retained. Note: for built-in DataType's, clone and copy should have the same affect.
        Specified by:
        clone in interface DataType
        Parameters:
        dtm - the data-type manager instance whose data-organization should apply.
      • clearComponent

        public void clearComponent​(int index)
        Description copied from interface: Structure
        clears the defined component at the given component index. Clearing a component causes a defined component to be replaced with a number of undefined dataTypes to offset the removal of the defined dataType.
        Specified by:
        clearComponent in interface Structure
        Parameters:
        index - the index of the component to clear.
      • replaceWith

        public void replaceWith​(DataType dataType)
        Replaces the internal components of this structure with components of the given structure.
        Specified by:
        replaceWith in interface DataType
        Overrides:
        replaceWith in class DataTypeImpl
        Parameters:
        dataType - the structure to get the component information from.
        Throws:
        java.lang.IllegalArgumentException - if any of the component data types are not allowed to replace a component in this composite data type. For example, suppose dt1 contains dt2. Therefore it is not valid to replace a dt2 component with dt1 since this would cause a cyclic dependency.
        See Also:
        DataType.replaceWith(ghidra.program.model.data.DataType)
      • dataTypeDeleted

        public void dataTypeDeleted​(DataType dt)
        Description copied from interface: DataType
        Informs this dataType that the given dataType has been deleted.
        TODO: This method is reserved for internal DB use and should be removed from the public DataType interface!!
        Specified by:
        dataTypeDeleted in interface DataType
        Parameters:
        dt - the dataType that has been deleted.
      • dataTypeReplaced

        public void dataTypeReplaced​(DataType oldDt,
                                     DataType newDt)
        Description copied from interface: DataType
        Informs this data type that the given oldDT has been replaced with newDT
        TODO: This method is reserved for internal DB use and should be removed from the public DataType interface!!
        Specified by:
        dataTypeReplaced in interface DataType
        Parameters:
        oldDt - old data type
        newDt - new data type
      • getDefinedComponents

        public DataTypeComponent[] getDefinedComponents()
        Description copied from interface: Structure
        Returns the list of components that are defined. (As opposed to "filler" undefined bytes.). Any trailing flexible array component will be omitted.
        Specified by:
        getDefinedComponents in interface Structure
      • getComponents

        public DataTypeComponent[] getComponents()
        Description copied from interface: Structure
        Returns a list of all components that make up this data type excluding any trailing flexible array component if present.
        Specified by:
        getComponents in interface Composite
        Specified by:
        getComponents in interface Structure
        Returns:
        an array containing the components
      • replace

        public DataTypeComponent replace​(int index,
                                         DataType dataType,
                                         int length,
                                         java.lang.String componentName,
                                         java.lang.String comment)
        Description copied from interface: Structure
        Replaces the component at the given component index with a new component of the indicated data type.
        Specified by:
        replace in interface Structure
        Parameters:
        index - the index where the datatype is to be replaced.
        dataType - the datatype to insert.
        length - the length to associate with the dataType;
        componentName - the field name to associate with this component.
        comment - the comment to associate with this component.
        Returns:
        the new componentDataType at the index.
      • replace

        public DataTypeComponent replace​(int index,
                                         DataType dataType,
                                         int length)
        Description copied from interface: Structure
        Replaces the component at the given component index with a new component of the indicated data type.
        Specified by:
        replace in interface Structure
        Parameters:
        index - the index where the datatype is to be replaced.
        dataType - the datatype to insert.
        length - the length of the dataType to insert
        Returns:
        the new componentDataType at the index.
      • replaceAtOffset

        public DataTypeComponent replaceAtOffset​(int offset,
                                                 DataType dataType,
                                                 int length,
                                                 java.lang.String componentName,
                                                 java.lang.String comment)
        Description copied from interface: Structure
        Replaces the component at the specified byte offset with a new component of the indicated data type.
        Specified by:
        replaceAtOffset in interface Structure
        Parameters:
        offset - the byte offset into the structure where the datatype is to be replaced.
        dataType - the datatype to insert.
        length - the length to associate with the dataType;
        componentName - the field name to associate with this component.
        comment - the comment to associate with this component.
        Returns:
        the new componentDataType at the index.
      • getNumUndefinedBytes

        protected int getNumUndefinedBytes​(int index)
        Gets the number of Undefined bytes beginning at the indicated component index. Undefined bytes that have a field name or comment specified are also included.
        Parameters:
        index - the component index to begin checking at.
        Returns:
        the number of contiguous undefined bytes
      • dataTypeNameChanged

        public void dataTypeNameChanged​(DataType dt,
                                        java.lang.String oldName)
        Description copied from interface: DataType
        Informs this data type that its name has changed from the indicated old name.
        TODO: This method is reserved for internal DB use and should be removed from the public DataType interface!!
        Specified by:
        dataTypeNameChanged in interface DataType
        Parameters:
        dt - the data type whose name changed
        oldName - the data type's old name
      • dependsOn

        public boolean dependsOn​(DataType dt)
        Description copied from interface: DataType
        Returns true if this dataType depends on the existence of the given dataType. For example byte[] depends on byte. If byte were deleted, then byte[] would also be deleted.
        Specified by:
        dependsOn in interface DataType
        Parameters:
        dt - the dataType to test that this dataType depends on.
      • deleteAll

        public void deleteAll()
        Description copied from interface: Structure
        Remove all components from this structure, effectively setting the length to zero.
        Specified by:
        deleteAll in interface Structure
      • getDefaultLabelPrefix

        public java.lang.String getDefaultLabelPrefix()
        Description copied from interface: DataType
        Returns the appropriate string to use as the default label prefix in the absence of any data.
        Specified by:
        getDefaultLabelPrefix in interface DataType
        Overrides:
        getDefaultLabelPrefix in class DataTypeImpl
        Returns:
        the default label prefix or null if none specified.
      • realign

        public void realign()
        Description copied from interface: Composite
        Updates the composite to any changes in the data organization. If the composite is not internally aligned, this method does nothing.
        Specified by:
        realign in interface Composite
      • adjustComponents

        protected boolean adjustComponents()
        Adjust the alignment, packing and padding of components within this structure based upon the current alignment and packing attributes for this structure. This method should be called to basically fix up the layout of the internal components of the structure after other code has changed the attributes of the structure.
        When switching between internally aligned and unaligned this method corrects the component ordinal numbering also.
        Returns:
        true if the structure was changed by this method.
      • adjustInternalAlignment

        public void adjustInternalAlignment()
        Description copied from class: CompositeDataTypeImpl
        Adjusts the internal alignment of components within this composite based on the current settings of the internal alignment, packing, alignment type and minimum alignment value. This method should be called whenever any of the above settings are changed or whenever a components data type is changed or a component is added or removed.
        Specified by:
        adjustInternalAlignment in class CompositeDataTypeImpl
      • hasFlexibleArrayComponent

        public boolean hasFlexibleArrayComponent()
        Description copied from interface: Structure
        Determine if a trailing flexible array component has been defined.
        Specified by:
        hasFlexibleArrayComponent in interface Structure
        Returns:
        true if trailing flexible array component has been defined.
      • getFlexibleArrayComponent

        public DataTypeComponent getFlexibleArrayComponent()
        Description copied from interface: Structure
        Get the optional trailing flexible array component associated with this structure.
        Specified by:
        getFlexibleArrayComponent in interface Structure
        Returns:
        optional trailing flexible array component associated with this structure or null if not present.
      • setFlexibleArrayComponent

        public DataTypeComponent setFlexibleArrayComponent​(DataType flexType,
                                                           java.lang.String name,
                                                           java.lang.String comment)
        Description copied from interface: Structure
        Set the optional trailing flexible array component associated with this structure.
        Specified by:
        setFlexibleArrayComponent in interface Structure
        Parameters:
        flexType - the flexible array dataType (example: for 'char[0]' the type 'char' should be specified)
        name - component field name or null for default name
        comment - component comment
        Returns:
        updated flexible array component
      • clearFlexibleArrayComponent

        public void clearFlexibleArrayComponent()
        Description copied from interface: Structure
        Remove the optional trailing flexible array component associated with this structure.
        Specified by:
        clearFlexibleArrayComponent in interface Structure