Class StructureDataType
- java.lang.Object
-
- ghidra.program.model.data.AbstractDataType
-
- ghidra.program.model.data.DataTypeImpl
-
- ghidra.program.model.data.GenericDataType
-
- ghidra.program.model.data.CompositeDataTypeImpl
-
- ghidra.program.model.data.StructureDataType
-
- All Implemented Interfaces:
Composite
,CompositeInternal
,DataType
,Structure
,StructureInternal
public class StructureDataType extends CompositeDataTypeImpl implements StructureInternal
Basic implementation of the structure data type. NOTES:- Implementation is not thread safe when being modified.
- For a structure to treated as having a zero-length (see
isZeroLength()
) it
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface ghidra.program.model.data.CompositeInternal
CompositeInternal.ComponentComparator, CompositeInternal.OffsetComparator, CompositeInternal.OrdinalComparator
-
Nested classes/interfaces inherited from interface ghidra.program.model.data.Structure
Structure.BitOffsetComparator
-
-
Field Summary
Fields Modifier and Type Field Description protected java.util.List<DataTypeComponentImpl>
components
protected int
numComponents
protected int
structLength
-
Fields inherited from class ghidra.program.model.data.CompositeDataTypeImpl
minimumAlignment, packing
-
Fields inherited from class ghidra.program.model.data.DataTypeImpl
defaultSettings
-
Fields inherited from class ghidra.program.model.data.AbstractDataType
categoryPath, dataMgr, name
-
Fields inherited from interface ghidra.program.model.data.CompositeInternal
ALIGN_NAME, DEFAULT_ALIGNMENT, DEFAULT_PACKING, DEFAULT_PACKING_NAME, DISABLED_PACKING_NAME, MACHINE_ALIGNMENT, NO_PACKING, PACKING_NAME
-
Fields inherited from interface ghidra.program.model.data.DataType
CONFLICT_SUFFIX, DEFAULT, NO_LAST_CHANGE_TIME, NO_SOURCE_SYNC_TIME, VOID
-
-
Constructor Summary
Constructors Constructor Description StructureDataType(CategoryPath path, java.lang.String name, int length)
Construct a new structure with the given name and length within the specified categry path.StructureDataType(CategoryPath path, java.lang.String name, int length, DataTypeManager dtm)
Construct a new structure with the given name, length and datatype manager within the specified categry path.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 lengthStructureDataType(java.lang.String name, int length)
Construct a new structure with the given name and length.StructureDataType(java.lang.String name, int length, DataTypeManager dtm)
Construct a new structure with the given name, length and datatype manager which conveys data organization.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description DataTypeComponent
add(DataType dataType, int length, java.lang.String componentName, java.lang.String comment)
Adds a new datatype to the end of this composite.DataTypeComponent
addBitField(DataType baseDataType, int bitSize, java.lang.String componentName, java.lang.String comment)
Adds a new bitfield to the end of this composite.void
clearAtOffset(int offset)
Clears all defined components containing the specified offset in this structure.void
clearComponent(int ordinal)
Clears the defined component at the specified component ordinal.StructureDataType
clone(DataTypeManager dtm)
Create cloned structure for target dtm preserving source archive information.DataType
copy(DataTypeManager dtm)
Create copy of structure for target dtm (source archive information is discarded).void
dataTypeAlignmentChanged(DataType dt)
Notification that the given datatype's alignment has changed.void
dataTypeDeleted(DataType dt)
Informs this datatype that the given datatype has been deleted.void
dataTypeReplaced(DataType oldDt, DataType replacementDt)
Informs this datatype that the given oldDT has been replaced with newDTvoid
dataTypeSizeChanged(DataType dt)
Notification that the given datatype's size has changed.void
delete(int ordinal)
Deletes the component at the given ordinal position.void
delete(java.util.Set<java.lang.Integer> ordinals)
Deletes the specified set of components at the given ordinal positions.void
deleteAll()
Remove all components from this structure, effectively setting the length to zero.void
deleteAtOffset(int offset)
Deletes all defined components containing the specified offset in this structure.boolean
dependsOn(DataType dt)
Check if this datatype depends on the existence of the given datatype.int
getAlignment()
Gets the alignment to be used when aligning this datatype within another datatype.DataTypeComponentImpl
getComponent(int ordinal)
Returns the component of this structure with the indicated ordinal.DataTypeComponent
getComponentContaining(int offset)
Gets the first non-zero-length component that contains the byte at the specified offset.DataTypeComponent[]
getComponents()
Returns an array of Data Type Components that make up this composite including undefined filler components which may be present within a Structure whch has packing disabled.java.util.List<DataTypeComponent>
getComponentsContaining(int offset)
Get an ordered list of components that contain the byte at the specified offset.DataTypeComponent
getDataTypeAt(int offset)
Returns the lowest-level component that contains the specified offset.java.lang.String
getDefaultLabelPrefix()
Returns the appropriate string to use as the default label prefix in the absence of any data.DataTypeComponent
getDefinedComponentAtOrAfterOffset(int offset)
Gets the first defined component located at or after the specified offset.DataTypeComponent[]
getDefinedComponents()
Returns an array of Data Type Components that make up this composite excluding undefined filler components which may be present within Structures where packing is disabled.int
getLength()
Get the length (number of 8-bit bytes) of this DataType.int
getNumComponents()
Gets the number of component data types in this composite.int
getNumDefinedComponents()
Returns the number of explicitly defined components in this composite.protected int
getNumUndefinedBytes(int index)
Gets the number of Undefined bytes beginning at the indicated component index.java.lang.String
getRepresentation(MemBuffer buf, Settings settings, int length)
Get bytes from memory in a printable format for this type.void
growStructure(int amount)
Increases the size of the structure by the specified amount by adding undefined filler at the end of the structure.boolean
hasLanguageDependantLength()
Indicates if the length of this data-type is determined based upon theDataOrganization
obtained from the associatedDataTypeManager
.DataTypeComponent
insert(int ordinal, DataType dataType, int length, java.lang.String componentName, java.lang.String comment)
Inserts a new datatype at the specified ordinal position in this composite.DataTypeComponentImpl
insertAtOffset(int offset, DataType dataType, int length)
Inserts a new datatype at the specified offset into this structure.DataTypeComponentImpl
insertAtOffset(int offset, DataType dataType, int length, java.lang.String componentName, java.lang.String comment)
Inserts a new datatype at the specified offset into this structure.DataTypeComponent
insertBitField(int ordinal, int byteWidth, int bitOffset, DataType baseDataType, int bitSize, java.lang.String componentName, java.lang.String comment)
Inserts a new bitfield at the specified ordinal position in this structure.DataTypeComponentImpl
insertBitFieldAt(int byteOffset, int byteWidth, int bitOffset, DataType baseDataType, int bitSize, java.lang.String componentName, java.lang.String comment)
Inserts a new bitfield at the specified location in this composite.boolean
isEquivalent(DataType dataType)
Check if the given datatype is equivalent to this datatype.boolean
isZeroLength()
Indicates this datatype is defined with a zero length.boolean
repack(boolean notify)
Repack components within this composite based on the current packing, alignment andDataOrganization
settings.DataTypeComponent
replace(int index, DataType dataType, int length)
Replaces the component at the specified ordinal with a new component using the specified datatype, length, name and comment.DataTypeComponent
replace(int ordinal, DataType dataType, int length, java.lang.String componentName, java.lang.String comment)
Replaces the component at the specified ordinal with a new component using the specified datatype, length, name and comment.DataTypeComponent
replaceAtOffset(int offset, DataType dataType, int length, java.lang.String name, java.lang.String comment)
Replaces all components containing the specified byte offset with a new component using the specified datatype, length, name and comment.void
replaceWith(DataType dataType)
Replaces the internal components of this structure with components of the given structure including packing and alignment settings.protected void
shiftOffset(DataTypeComponentImpl dtc, int deltaOrdinal, int deltaOffset)
-
Methods inherited from class ghidra.program.model.data.CompositeDataTypeImpl
add, add, add, checkAncestry, dataTypeNameChanged, getAlignmentType, getDescription, getExplicitMinimumAlignment, getExplicitPackingValue, getMnemonic, getNonPackedAlignment, getPackingType, getPreferredComponentLength, getStoredMinimumAlignment, getStoredPackingValue, getValue, insert, insert, isNotYetDefined, isPartOf, repack, setDescription, setExplicitMinimumAlignment, setExplicitPackingValue, setName, setPackingEnabled, setToDefaultAligned, setToDefaultPacking, setToMachineAligned, setValue, toString, updateBitFieldDataType, validateDataType
-
Methods inherited from class ghidra.program.model.data.GenericDataType
setCategoryPath, setNameAndCategory
-
Methods inherited from class ghidra.program.model.data.DataTypeImpl
addParent, equals, getDefaultSettings, getLastChangeTime, getLastChangeTimeInSourceArchive, getParents, getPathName, getSettingsDefinitions, getSourceArchive, getUniversalID, getValueClass, hashCode, notifyAlignmentChanged, notifyDeleted, notifyNameChanged, notifyParents, notifyReplaced, notifySizeChanged, removeParent, setDefaultSettings, setLastChangeTime, setLastChangeTimeInSourceArchive, setSourceArchive
-
Methods inherited from class ghidra.program.model.data.AbstractDataType
encodeRepresentation, encodeValue, getCategoryPath, getDataOrganization, getDataTypeManager, getDataTypePath, getDefaultAbbreviatedLabelPrefix, getDefaultLabelPrefix, getDefaultOffcutLabelPrefix, getDisplayName, getDocs, getName, isDeleted, isEncodable
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface ghidra.program.model.data.Composite
add, add, add, align, getAlignmentType, getExplicitMinimumAlignment, getExplicitPackingValue, getPackingType, hasDefaultPacking, hasExplicitMinimumAlignment, hasExplicitPackingValue, insert, insert, isDefaultAligned, isMachineAligned, isPackingEnabled, isPartOf, pack, repack, setDescription, setExplicitMinimumAlignment, setExplicitPackingValue, setPackingEnabled, setToDefaultAligned, setToDefaultPacking, setToMachineAligned
-
Methods inherited from interface ghidra.program.model.data.CompositeInternal
getStoredMinimumAlignment, getStoredPackingValue
-
Methods inherited from interface ghidra.program.model.data.DataType
addParent, dataTypeNameChanged, encodeRepresentation, encodeValue, getCategoryPath, getDataOrganization, getDataTypeManager, getDataTypePath, getDefaultAbbreviatedLabelPrefix, getDefaultLabelPrefix, getDefaultOffcutLabelPrefix, getDefaultSettings, getDescription, getDisplayName, getDocs, getLastChangeTime, getLastChangeTimeInSourceArchive, getMnemonic, getName, getParents, getPathName, getSettingsDefinitions, getSourceArchive, getUniversalID, getValue, getValueClass, isDeleted, isEncodable, isNotYetDefined, removeParent, setCategoryPath, setDefaultSettings, setLastChangeTime, setLastChangeTimeInSourceArchive, setName, setNameAndCategory, setSourceArchive
-
Methods inherited from interface ghidra.program.model.data.Structure
getComponentAt
-
-
-
-
Field Detail
-
structLength
protected int structLength
-
numComponents
protected int numComponents
-
components
protected java.util.List<DataTypeComponentImpl> components
-
-
Constructor Detail
-
StructureDataType
public StructureDataType(java.lang.String name, int length)
Construct a new structure with the given name and length. The root category will be used.- Parameters:
name
- the name of the new structurelength
- the initial size of the structure in bytes. If 0 is specified the structure will report its length as 1 andCompositeDataTypeImpl.isNotYetDefined()
will return true.
-
StructureDataType
public StructureDataType(java.lang.String name, int length, DataTypeManager dtm)
Construct a new structure with the given name, length and datatype manager which conveys data organization. The root category will be used.- Parameters:
name
- the name of the new structurelength
- the initial size of the structure in bytes. If 0 is specified the structure will report its length as 1 andCompositeDataTypeImpl.isNotYetDefined()
will return true.dtm
- the data type manager associated with this data type. This can be null. Also, the data type manager may not yet contain this actual data type.
-
StructureDataType
public StructureDataType(CategoryPath path, java.lang.String name, int length)
Construct a new structure with the given name and length within the specified categry path.- Parameters:
path
- the category path indicating where this data type is located.name
- the name of the new structurelength
- the initial size of the structure in bytes. If 0 is specified the structure will report its length as 1 andCompositeDataTypeImpl.isNotYetDefined()
will return true.
-
StructureDataType
public StructureDataType(CategoryPath path, java.lang.String name, int length, DataTypeManager dtm)
Construct a new structure with the given name, length and datatype manager within the specified categry path.- Parameters:
path
- the category path indicating where this data type is located.name
- the name of the new structurelength
- the initial size of the structure in bytes. If 0 is specified the structure will report its length as 1 andCompositeDataTypeImpl.isNotYetDefined()
will return true.dtm
- the data type manager associated with this data type. This can be null. Also, the data type manager may not yet contain this actual data type.
-
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 length- Parameters:
path
- the category path indicating where this data type is located.name
- the name of the new structurelength
- the initial size of the structure in bytes. If 0 is specified the structure will report its length as 1 andCompositeDataTypeImpl.isNotYetDefined()
will return true.universalID
- the id for the data typesourceArchive
- the source archive for this data typelastChangeTime
- the last time this data type was changedlastChangeTimeInSourceArchive
- the last time this data type was changed in its source archive.dtm
- the data type manager associated with this data type. This can be null. Also, the data type manager may not yet 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 interfaceDataType
- 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.
-
getAlignment
public int getAlignment()
Description copied from interface:DataType
Gets the alignment to be used when aligning this datatype within another datatype.- Specified by:
getAlignment
in interfaceComposite
- Specified by:
getAlignment
in interfaceDataType
- Specified by:
getAlignment
in classCompositeDataTypeImpl
- Returns:
- this datatype's alignment.
-
getDefinedComponentAtOrAfterOffset
public DataTypeComponent getDefinedComponentAtOrAfterOffset(int offset)
Description copied from interface:Structure
Gets the first defined component located at or after the specified offset. Note: The returned component may be a zero-length component.- Specified by:
getDefinedComponentAtOrAfterOffset
in interfaceStructure
- Parameters:
offset
- the byte offset into this structure- Returns:
- the first defined component located at or after the specified offset or null if not found.
-
getComponentContaining
public DataTypeComponent getComponentContaining(int offset)
Description copied from interface:Structure
Gets the first non-zero-length component that contains the byte at the specified offset. Note that one or more components may share the same offset when a bit-field or zero-length component is present since these may share an offset. A null may be returned under one of the following conditions:- offset only corresponds to a zero-length component within a packed structure
- offset corresponds to a padding byte within a packed structure
- offset is >= structure length.
Structure.getComponentsContaining(int)
be invoked to gather all bitfields which contain the specified offset.- Specified by:
getComponentContaining
in interfaceStructure
- Parameters:
offset
- the byte offset into this structure- Returns:
- the first non-zero-length component that contains the byte at the specified offset or null if not found.
-
getComponentsContaining
public java.util.List<DataTypeComponent> getComponentsContaining(int offset)
Description copied from interface:Structure
Get an ordered list of components that contain the byte at the specified offset. UnlikeStructure.getComponentAt(int)
andStructure.getComponentContaining(int)
this method will include zero-length components if they exist at the specified offset. For this reason the specified offset may equal the structure length to obtain and trailing zero-length components. Note that this method will only return more than one component when a bit-fields and/or zero-length components are present since these may share an offset. An empty list may be returned under the following conditions:- offset only corresponds to a padding byte within a packed structure
- offset is equal structure length and no trailing zero-length components exist
- offset is > structure length
- Specified by:
getComponentsContaining
in interfaceStructure
- Parameters:
offset
- the byte offset into this structure- Returns:
- a list of zero or more components containing the specified offset
-
getDataTypeAt
public DataTypeComponent getDataTypeAt(int offset)
Description copied from interface:Structure
Returns the lowest-level component that contains the specified offset. This is useful for structures that have sub-structures. This method is best used when working with known structures which do not contain bitfields or zero-length components since in those situations multiple components may correspond to the specified offset. A similar ambiguous condition occurs if offset corresponds to a union component.- Specified by:
getDataTypeAt
in interfaceStructure
- Parameters:
offset
- the byte offset into this data type.- Returns:
- a primitive component data type which contains the specified offset.
-
isZeroLength
public boolean isZeroLength()
Description copied from interface:DataType
Indicates this datatype is defined with a zero length.This method should not be confused with
DataType.isNotYetDefined()
which indicates that nothing but the name and basic type is known.NOTE: a zero-length datatype must return a length of 1 via
DataType.getLength()
. Zero-length datatypes used as a component within aComposite
may, or may not, be assigned a component length of 0. The methodDataTypeComponent.usesZeroLengthComponent(DataType)
is used to make this determination.- Specified by:
isZeroLength
in interfaceDataType
- Overrides:
isZeroLength
in classAbstractDataType
- Returns:
- true if type definition has a length of 0, else false
-
getLength
public int getLength()
Description copied from interface:DataType
Get the length (number of 8-bit bytes) of this DataType.NOTE: No datatype should ever return 0, even if
DataType.isZeroLength()
, and onlyDynamic
datatypes should return -1. IfDataType.isZeroLength()
is true a length of 1 should be returned. Where a zero-length datatype can be handled (e.g.,Composite
) theDataType.isZeroLength()
method should be used.
-
hasLanguageDependantLength
public boolean hasLanguageDependantLength()
Description copied from interface:DataType
Indicates if the length of this data-type is determined based upon theDataOrganization
obtained from the associatedDataTypeManager
.- Specified by:
hasLanguageDependantLength
in interfaceDataType
- Specified by:
hasLanguageDependantLength
in classCompositeDataTypeImpl
- Returns:
- true length is language/compiler-specification dependent, else false
-
delete
public void delete(int ordinal)
Description copied from interface:Composite
Deletes the component at the given ordinal position.
Note: Removal of bitfields from a structure with packing disabled will not shift other components causing vacated bytes to revert to undefined filler.
-
delete
public void delete(java.util.Set<java.lang.Integer> ordinals)
Description copied from interface:Composite
Deletes the specified set of components at the given ordinal positions.
Note: Removal of bitfields from a structure with packing disabled will not shift other components causing vacated bytes to revert to undefined filler.
-
shiftOffset
protected void shiftOffset(DataTypeComponentImpl dtc, int deltaOrdinal, int deltaOffset)
-
getComponent
public DataTypeComponentImpl getComponent(int ordinal)
Description copied from interface:Structure
Returns the component of this structure with the indicated ordinal.- Specified by:
getComponent
in interfaceComposite
- Specified by:
getComponent
in interfaceStructure
- Parameters:
ordinal
- the ordinal of the component requested.- Returns:
- the data type component.
-
getNumComponents
public int getNumComponents()
Description copied from interface:Composite
Gets the number of component data types in this composite. If this is Structure with packing disabled, the count will include all undefined filler components which may be present.- Specified by:
getNumComponents
in interfaceComposite
- Returns:
- the number of components that make up this composite
-
getNumDefinedComponents
public int getNumDefinedComponents()
Description copied from interface:Composite
Returns the number of explicitly defined components in this composite. For Unions and packed Structures this is equivalent toComposite.getNumComponents()
since they do not contain undefined components. This count will always exclude all undefined filler components which may be present within a Structure whose packing is disabled (seeComposite.isPackingEnabled()
).- Specified by:
getNumDefinedComponents
in interfaceComposite
- Returns:
- the number of explicitly defined components in this composite
-
insertAtOffset
public final DataTypeComponentImpl insertAtOffset(int offset, DataType dataType, int length)
Description copied from interface:Structure
Inserts a new datatype at the specified offset into this structure. Inserting a component will cause any conflicting components to shift down to the extent necessary to avoid a conflict.- Specified by:
insertAtOffset
in interfaceStructure
- Parameters:
offset
- the byte offset into the structure where the new datatype is to be inserted.dataType
- the datatype to insert. IfDataType.DEFAULT
is specified for a packed structure anUndefined1DataType
will be used in its place.length
- the length to associate with the dataType. For fixed length types a length <= 0 will use the length of the resolved dataType.- Returns:
- the componentDataType created.
-
insertAtOffset
public DataTypeComponentImpl insertAtOffset(int offset, DataType dataType, int length, java.lang.String componentName, java.lang.String comment) throws java.lang.IllegalArgumentException
Description copied from interface:Structure
Inserts a new datatype at the specified offset into this structure. Inserting a component will cause any conflicting components to shift down to the extent necessary to avoid a conflict.This method does not support bit-field insertions which must use the method
Structure.insertBitFieldAt(int, int, int, DataType, int, String, String)
.- Specified by:
insertAtOffset
in interfaceStructure
- Parameters:
offset
- the byte offset into the structure where the new datatype is to be inserted.dataType
- the datatype to insert. IfDataType.DEFAULT
is specified for a packed structure anUndefined1DataType
will be used in its place.length
- the length to associate with the dataType. For fixed length types a length <= 0 will use the length of the resolved dataType.componentName
- the field name to associate with this component.comment
- the comment to associate with this component.- Returns:
- the componentDataType created.
- Throws:
java.lang.IllegalArgumentException
- if the specified data type is not allowed to be inserted into this composite data type or an invalid length is specified. For example, suppose dt1 contains dt2. Therefore it is not valid to insert dt1 to dt2 since this would cause a cyclic dependency.
-
add
public DataTypeComponent add(DataType dataType, int length, java.lang.String componentName, java.lang.String comment)
Description copied from interface:Composite
Adds a new datatype to the end of this composite. This is the preferred method to use for adding components to an aligned structure for dynamic dataTypes such as strings whose length must be specified.- Specified by:
add
in interfaceComposite
- Parameters:
dataType
- the datatype to add.length
- the length to associate with the datatype. For fixed length types a length <= 0 will use the length of the resolved dataType.componentName
- the field name to associate with this component.comment
- the comment to associate with this component.- Returns:
- the componentDataType created.
-
growStructure
public void growStructure(int amount)
Description copied from interface:Structure
Increases the size of the structure by the specified amount by adding undefined filler at the end of the structure. NOTE: This method only has an affect on non-packed structures.- Specified by:
growStructure
in interfaceStructure
- Parameters:
amount
- the amount by which to grow the structure.
-
insert
public DataTypeComponent insert(int ordinal, DataType dataType, int length, java.lang.String componentName, java.lang.String comment) throws java.lang.IndexOutOfBoundsException, java.lang.IllegalArgumentException
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 interfaceComposite
- Parameters:
ordinal
- the ordinal where the new datatype is to be inserted.dataType
- the datatype to insert.length
- the length to associate with the datatype. For fixed length types a length <= 0 will use the length of the resolved dataType.componentName
- the field name to associate with this component.comment
- the comment to associate with this component.- Returns:
- the componentDataType created.
- Throws:
java.lang.IndexOutOfBoundsException
- if component ordinal is out of boundsjava.lang.IllegalArgumentException
- if the specified data type is not allowed to be inserted into this composite data type or an invalid length is specified. For example, suppose dt1 contains dt2. Therefore it is not valid to insert dt1 to dt2 since this would cause a cyclic dependency.
-
addBitField
public DataTypeComponent addBitField(DataType baseDataType, int bitSize, java.lang.String componentName, java.lang.String comment) throws InvalidDataTypeException
Description copied from interface:Composite
Adds a new bitfield to the end of this composite. This method is intended to be used with packed structures/unions only where the bitfield will be appropriately packed. The minimum storage storage byte size will be applied. It will not provide useful results for composites with packing disabled.- Specified by:
addBitField
in interfaceComposite
- Parameters:
baseDataType
- the bitfield base datatype (certain restrictions apply).bitSize
- the bitfield size in bitscomponentName
- the field name to associate with this component.comment
- the comment to associate with this component.- Returns:
- the componentDataType created whose associated data type will be BitFieldDataType.
- Throws:
InvalidDataTypeException
- if the specified data type is not a valid base type for bitfields.
-
insertBitField
public DataTypeComponent insertBitField(int ordinal, int byteWidth, int bitOffset, DataType baseDataType, int bitSize, java.lang.String componentName, java.lang.String comment) throws InvalidDataTypeException, java.lang.IndexOutOfBoundsException
Description copied from interface:Structure
Inserts a new bitfield at the specified ordinal position in this structure. Within packed structures the specified byteWidth and bitOffset will be ignored since packing will occur at the specified ordinal position. The resulting component length and bitfield details will reflect the use of minimal storage sizing.For structures with packing disabled, a component shift will only occur if the bitfield placement conflicts with another component. If no conflict occurs, the bitfield will be placed at the specified location consuming any DEFAULT components as needed. When a conflict does occur a shift will be performed at the ordinal position based upon the specified byteWidth. When located onto existing bitfields they will be packed together provided they do not conflict, otherwise the conflict rule above applies.
Supported packing starts with bit-0 (lsb) of the first byte for little-endian, and with bit-7 (msb) of the first byte for big-endian. This is the default behavior for most compilers. Insertion behavior may not work as expected if packing rules differ from this.
- Specified by:
insertBitField
in interfaceStructure
- Parameters:
ordinal
- the ordinal of the component to be inserted.byteWidth
- the storage allocation unit width which contains the bitfield. Must be large enough to contain the "effective bit size" and corresponding bitOffset. The actual component size used will be recomputed during insertion.bitOffset
- corresponds to the bitfield left-shift amount with the storage unit when viewed as big-endian. The final offset may be reduced based upon the minimal storage size determined during insertion.baseDataType
- the bitfield base datatype (certain restrictions apply).bitSize
- the declared bitfield size in bits. The effective bit size may be adjusted based upon the specified baseDataType.componentName
- the field name to associate with this component.comment
- the comment to associate with this component.- Returns:
- the bitfield component created whose associated data type will be BitFieldDataType.
- Throws:
InvalidDataTypeException
- if the specified baseDataType is not a valid base type for bitfields.java.lang.IndexOutOfBoundsException
- if ordinal is less than 0 or greater than the current number of components.
-
insertBitFieldAt
public DataTypeComponentImpl insertBitFieldAt(int byteOffset, int byteWidth, int bitOffset, DataType baseDataType, int bitSize, java.lang.String componentName, java.lang.String comment) throws InvalidDataTypeException
Description copied from interface:Structure
Inserts a new bitfield at the specified location in this composite. This method is intended to be used with structures with packing disabled where the bitfield will be precisely placed. Within an packed structure the specified byteOffset, byteWidth and bitOffset will be used to identify the appropriate ordinal but may not be preserved. The component length will be computed based upon the specified parameters and will be reduced from byteWidth to its minimal size for the new component.When packing disabled, a component shift will only occur if the bitfield placement conflicts with another component. If no conflict occurs, the bitfield will be placed at the specified location consuming any DEFAULT components as needed. When a conflict does occur a shift will be performed at the point of conflict based upon the specified byteWidth. When located onto existing bitfields they will be packed together provided they do not conflict, otherwise the conflict rule above applies.
Supported packing for little-endian fills lsb first, whereas big-endian fills msb first. Insertion behavior may not work as expected if packing rules differ from this.
Zero length bitfields may be inserted although they have no real affect when packing disabled. Only the resulting byte offset within the structure is of significance in determining its ordinal placement.
- Specified by:
insertBitFieldAt
in interfaceStructure
- Parameters:
byteOffset
- the first byte offset within this structure which corresponds to the first byte of the specified storage unit identified by its byteWidth.byteWidth
- the storage unit width which contains the bitfield. Must be large enough to contain the specified bitSize and corresponding bitOffset. The actual component size used will be recomputed during insertion.bitOffset
- corresponds to the bitfield left-shift amount with the storage unit when viewed as big-endian. The final offset may be reduced based upon the minimal storage size determined during insertion.baseDataType
- the bitfield base datatype (certain restrictions apply).bitSize
- the bitfield size in bits. A bitSize of 0 may be specified although its name will be ignored.componentName
- the field name to associate with this component.comment
- the comment to associate with this component.- Returns:
- the componentDataType created whose associated data type will be BitFieldDataType.
- Throws:
InvalidDataTypeException
- if the specified data type is not a valid base type for bitfields.
-
deleteAtOffset
public void deleteAtOffset(int offset)
Description copied from interface:Structure
Deletes all defined components containing the specified offset in this structure. If the offset corresponds to a bit-field or zero-length component (e.g., 0-element array) multiple components may be deleted. Bit-fields are only cleared and may leave residual undefined components in their place. This method will generally reduce the length of the structure. TheStructure.clearAtOffset(int)
method should be used for non-packed structures to preserve the structure length and placement of other components.- Specified by:
deleteAtOffset
in interfaceStructure
- Parameters:
offset
- the byte offset into the structure where the component(s) are to be deleted. An offset equal to the structure length may be specified to delete any trailing zero-length components.
-
clearAtOffset
public void clearAtOffset(int offset)
Description copied from interface:Structure
Clears all defined components containing the specified offset in this structure. If the offset corresponds to a bit-field or zero-length component (e.g., 0-element array) multiple components may be cleared. This method will preserve the structure length and placement of other components since freed space will appear as undefined components.To avoid clearing zero-length components at a specified offset within a non-packed structure, the
Structure.replaceAtOffset(int, DataType, int, String, String)
may be used with to clear only the sized component at the offset by specifiedDataType.DEFAULT
as the replacement datatype.- Specified by:
clearAtOffset
in interfaceStructure
- Parameters:
offset
- the byte offset into the structure where the component(s) are to be deleted.
-
isEquivalent
public boolean isEquivalent(DataType dataType)
Description copied from interface:DataType
Check if the given datatype is equivalent to this datatype.The precise meaning of "equivalent" is datatype dependent.
NOTE: if invoked by a DB object or manager it should be invoked on the DataTypeDB object passing the other datatype as the argument.- Specified by:
isEquivalent
in interfaceDataType
- 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.- Specified by:
dataTypeSizeChanged
in interfaceDataType
- Overrides:
dataTypeSizeChanged
in classAbstractDataType
- Parameters:
dt
- the datatype that has changed.
-
dataTypeAlignmentChanged
public void dataTypeAlignmentChanged(DataType dt)
Description copied from interface:DataType
Notification that the given datatype's alignment has changed.DataTypes may need to make internal changes in response.
TODO: This method is reserved for internal DB use.- Specified by:
dataTypeAlignmentChanged
in interfaceComposite
- Specified by:
dataTypeAlignmentChanged
in interfaceDataType
- Overrides:
dataTypeAlignmentChanged
in classAbstractDataType
- Parameters:
dt
- the datatype that has changed.
-
copy
public DataType copy(DataTypeManager dtm)
Create copy of structure for target dtm (source archive information is discarded).WARNING! copying non-packed structures which contain bitfields can produce invalid results when switching endianess due to the differences in packing order.
-
clone
public StructureDataType clone(DataTypeManager dtm)
Create cloned structure for target dtm preserving source archive information. WARNING! cloning non-packed structures which contain bitfields can produce invalid results when switching endianess due to the differences in packing order.
-
clearComponent
public void clearComponent(int ordinal)
Description copied from interface:Structure
Clears the defined component at the specified component ordinal. Clearing a component within a non-packed structure causes a defined component to be replaced with a number of undefined components. This may not the case when clearing a zero-length component or bit-field which may not result in such undefined components. In the case of a packed structure clearing is always completed without backfill.- Specified by:
clearComponent
in interfaceStructure
- Parameters:
ordinal
- the ordinal of the component to clear.
-
replaceWith
public void replaceWith(DataType dataType)
Replaces the internal components of this structure with components of the given structure including packing and alignment settings.- Specified by:
replaceWith
in interfaceDataType
- Overrides:
replaceWith
in classDataTypeImpl
- 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.
-
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.
- Specified by:
dataTypeDeleted
in interfaceDataType
- Overrides:
dataTypeDeleted
in classAbstractDataType
- Parameters:
dt
- the datatype that has been deleted.
-
dataTypeReplaced
public void dataTypeReplaced(DataType oldDt, DataType replacementDt) throws java.lang.IllegalArgumentException
Description copied from interface:DataType
Informs this datatype that the given oldDT has been replaced with newDTTODO: This method is reserved for internal DB use.
- Specified by:
dataTypeReplaced
in interfaceDataType
- Overrides:
dataTypeReplaced
in classAbstractDataType
- Parameters:
oldDt
- old datatypereplacementDt
- new datatype- Throws:
java.lang.IllegalArgumentException
-
getDefinedComponents
public DataTypeComponent[] getDefinedComponents()
Description copied from interface:Composite
Returns an array of Data Type Components that make up this composite excluding undefined filler components which may be present within Structures where packing is disabled. The number of components corresponds toComposite.getNumDefinedComponents()
. For Unions and packed Structures this is equivalent toComposite.getComponents()
since they do not contain undefined filler components.- Specified by:
getDefinedComponents
in interfaceComposite
- Returns:
- array all explicitly defined components
-
getComponents
public DataTypeComponent[] getComponents()
Description copied from interface:Composite
Returns an array of Data Type Components that make up this composite including undefined filler components which may be present within a Structure whch has packing disabled. The number of components corresponds toComposite.getNumComponents()
.- Specified by:
getComponents
in interfaceComposite
- Returns:
- array all components
-
replace
public final DataTypeComponent replace(int index, DataType dataType, int length)
Description copied from interface:Structure
Replaces the component at the specified ordinal with a new component using the specified datatype, length, name and comment. In the case of a packed structure a 1-for-1 replacement will occur. In the case of a non-packed structure certain restrictions apply:- A zero-length component may only be replaced with another zero-length component.
- If ordinal corresponds to a bit-field, all bit-fields which overlap the specified bit-field will be replaced.
Datatypes not permitted include
FactoryDataType
types, non-sizableDynamic
types, and those which result in a circular direct dependency.NOTE: In general, it is not recommended that this method be used with non-packed structures where the replaced component is a bit-field.
- Specified by:
replace
in interfaceStructure
- Parameters:
index
- the ordinal of the component to be replaced.dataType
- the datatype to insert. IfDataType.DEFAULT
is specified for a packed structure anUndefined1DataType
will be used in its place. IfDataType.DEFAULT
is specified for a non-packed structure this is equivelant toStructure.clearComponent(int)
, ignoring the length, name and comment arguments.length
- component length for containing the specified dataType. A positive length is required for sizableDynamic
datatypes and should be specified as -1 for fixed-length datatypes to rely on their resolved size.- Returns:
- the new component.
-
replace
public DataTypeComponent replace(int ordinal, DataType dataType, int length, java.lang.String componentName, java.lang.String comment) throws java.lang.IndexOutOfBoundsException, java.lang.IllegalArgumentException
Description copied from interface:Structure
Replaces the component at the specified ordinal with a new component using the specified datatype, length, name and comment. In the case of a packed structure a 1-for-1 replacement will occur. In the case of a non-packed structure certain restrictions apply:- A zero-length component may only be replaced with another zero-length component.
- If ordinal corresponds to a bit-field, all bit-fields which overlap the specified bit-field will be replaced.
Datatypes not permitted include
FactoryDataType
types, non-sizableDynamic
types, and those which result in a circular direct dependency.NOTE: In general, it is not recommended that this method be used with non-packed structures where the replaced component is a bit-field.
- Specified by:
replace
in interfaceStructure
- Parameters:
ordinal
- the ordinal of the component to be replaced.dataType
- the datatype to insert. IfDataType.DEFAULT
is specified for a packed structure anUndefined1DataType
will be used in its place. IfDataType.DEFAULT
is specified for a non-packed structure this is equivelant toStructure.clearComponent(int)
, ignoring the length, name and comment arguments.length
- component length for containing the specified dataType. A positive length is required for sizableDynamic
datatypes and should be specified as -1 for fixed-length datatypes to rely on their resolved size.componentName
- the field name to associate with this component or null.comment
- the comment to associate with this component or null.- Returns:
- the new component.
- Throws:
java.lang.IndexOutOfBoundsException
- if component ordinal is out of boundsjava.lang.IllegalArgumentException
- may be caused by: 1) invalid offset specified, 2) invalid datatype or associated length specified, or 3) insufficient space for replacement.
-
replaceAtOffset
public DataTypeComponent replaceAtOffset(int offset, DataType dataType, int length, java.lang.String name, java.lang.String comment) throws java.lang.IllegalArgumentException
Description copied from interface:Structure
Replaces all components containing the specified byte offset with a new component using the specified datatype, length, name and comment. If the offset corresponds to a bit-field more than one component may be consumed by this replacement.This method may not be used to replace a zero-length component since there may be any number of zero-length components at the same offset. If the only defined component(s) at the specified offset are zero-length the subsequent undefined will be replaced in the case of a non-packed structure. For a packed structure such a case would be treated as an insert as would an offset which is not contained within a component.
For a non-packed structure a replacement will attempt to consume sufficient space within moving other defined components. There must be sufficient space to complete the replacement factoring in the space freed by the consumed component(s). When replacing the last defined component the structure size will be expanded as needed to fit the new component. For a packed If there are no remaining defined components beyond the consumed components, or an offset equals to the structure length is specified, the structure will expand its length as needed.
For a non-packed structure the new component will use the specified offset. In the case of packed structure, the actual offset will be determined during a repack.
Datatypes not permitted include
FactoryDataType
types, non-sizableDynamic
types, and those which result in a circular direct dependency.- Specified by:
replaceAtOffset
in interfaceStructure
- Parameters:
offset
- the byte offset into the structure where the datatype is to be placed. The specified offset must be less than the length of the structure.dataType
- the datatype to insert. IfDataType.DEFAULT
is specified for a packed structure anUndefined1DataType
will be used in its place. IfDataType.DEFAULT
is specified for a non-packed structure this is equivelant to clearing all components, which contain the specified offset, ignoring the length, name and comment arguments.length
- component length for containing the specified dataType. A positive length is required for sizableDynamic
datatypes and should be specified as -1 for fixed-length datatypes to rely on their resolved size.name
- the field name to associate with this component or null.comment
- the comment to associate with this component or null.- Returns:
- the new component.
- Throws:
java.lang.IllegalArgumentException
- may be caused by: 1) invalid offset specified, 2) invalid datatype or associated length specified, or 3) insufficient space for replacement.
-
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
-
dependsOn
public boolean dependsOn(DataType dt)
Description copied from interface:DataType
Check 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 interfaceDataType
- Overrides:
dependsOn
in classAbstractDataType
- Parameters:
dt
- the datatype to test that this datatype depends on.- Returns:
- true if the existence of this datatype relies on the existence of the specified datatype dt.
-
deleteAll
public void deleteAll()
Description copied from interface:Structure
Remove all components from this structure, effectively setting the length to zero. Packing and minimum alignment settings are unaffected.
-
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 interfaceDataType
- Overrides:
getDefaultLabelPrefix
in classAbstractDataType
- Returns:
- the default label prefix or null if none specified.
-
repack
public boolean repack(boolean notify)
Description copied from class:CompositeDataTypeImpl
Repack components within this composite based on the current packing, alignment andDataOrganization
settings. Non-packed Structures: change detection is limited to component count and length is assumed to already be correct.NOTE: If modifications to stored length are made prior to invoking this method, detection of a size change may not be possible.
NOTE: Currently a change in calculated alignment can not be provided since this value is not stored.
- Specified by:
repack
in classCompositeDataTypeImpl
- Parameters:
notify
- if true notification will be sent to parents if a size change or component placement change is detected.- Returns:
- true if a layout change was detected.
-
-