Package ghidra.program.model.pcode
Class PackedDecode
java.lang.Object
ghidra.program.model.pcode.PackedDecode
- All Implemented Interfaces:
ByteIngest
,Decoder
- Direct Known Subclasses:
PackedDecodeOverlay
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
protected AddressSpace[]
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
-
Constructor Summary
ConstructorDescriptionConstructor for formats that do not use the readSpace() methods or use setAddressFactory() in the middle of decodingPackedDecode
(AddressFactory addrFactory) PackedDecode
(InputStream stream, String desc) Build a decoder for an input stream, where the decoder is set to read pages from the stream "as needed". -
Method Summary
Modifier and TypeMethodDescriptionvoid
clear()
Clear any previous cached bytes.void
close()
Close stream cached by the ingestStreamAsNeeded method.void
closeElement
(int id) Close the current element The data for the current element is considered fully processed.void
closeElementSkipping
(int id) Close the current element, skipping any child elements that have not yet been parsed.void
Formal indicator that ingesting of bytes is complete and processing can beginint
getIndexedAttributeId
(AttributeId attribId) Get the id for the (current) attribute, assuming it is indexed.int
Get the next attribute id for the current element Attributes are automatically set up for traversal using this method, when the element is opened.void
ingestBytes
(byte[] byteArray, int off, int sz) Ingest bytes directly from a byte array.void
ingestStream
(InputStream stream) Ingest bytes from the stream until the end of stream is encountered.void
Ingest bytes from the stream up to (and including) the first 0 byte.boolean
isEmpty()
void
Open the ingester for receiving bytes.int
Open (traverse into) the next child element of the current parent.int
openElement
(ElementId elemId) Open (traverse into) the next child element, which must be of a specific type The child becomes the current parent, and its attributes are initialized for use with getNextAttributeId.int
Peek at the next child element of the current parent, without traversing in (opening) it.boolean
readBool()
Parse the current attribute as a boolean value The last attribute, as returned by getNextAttributeId, is treated as a boolean, and its value is returned.boolean
readBool
(AttributeId attribId) Find and parse a specific attribute in the current element as a boolean value The set of attributes for the current element is searched for a match to the given attribute id.int
Parse the current attribute is a p-code opcode The last attribute, as returned by getNextAttributeId, is returned as an opcode.int
readOpcode
(AttributeId attribId) Find the specific attribute in the current element and return it as an opcode Search attributes from the current element for a match to the given attribute id.long
Parse the current attribute as a signed integer value The last attribute, as returned by getNextAttributeId, is treated as a signed integer, and its value is returned.long
readSignedInteger
(AttributeId attribId) Find and parse a specific attribute in the current element as a signed integer The set of attributes for the current element is searched for a match to the given attribute id.long
readSignedIntegerExpectString
(AttributeId attribId, String expect, long expectval) Find and parse a specific attribute in the current element as either a signed integer or a string.long
readSignedIntegerExpectString
(String expect, long expectval) Parse the current attribute as either a signed integer value or a string.Parse the current attribute as an address space The last attribute, as returned by getNextAttributeId, is returned as an address space.readSpace
(AttributeId attribId) Find the specific attribute in the current element and return it as an address space Search attributes from the current element for a match to the given attribute id.Parse the current attribute as a string The last attribute, as returned by getNextAttributeId, is returned as a string.readString
(AttributeId attribId) Find the specific attribute in the current element and return it as a string The set of attributes for the current element is searched for a match to the given attribute id.long
Parse the current attribute as an unsigned integer value The last attribute, as returned by getNextAttributeId, is treated as an unsigned integer, and its value is returned.long
readUnsignedInteger
(AttributeId attribId) Find and parse a specific attribute in the current element as an unsigned integer The set of attributes for the current element is searched for a match to the given attribute id.void
Reset attribute traversal for the current element Attributes for a single element can be traversed more than once using the getNextAttributeId method.void
setAddressFactory
(AddressFactory addrFactory) Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface ghidra.program.model.pcode.Decoder
skipElement
-
Field Details
-
HEADER_MASK
public static final int HEADER_MASK- See Also:
-
ELEMENT_START
public static final int ELEMENT_START- See Also:
-
ELEMENT_END
public static final int ELEMENT_END- See Also:
-
ATTRIBUTE
public static final int ATTRIBUTE- See Also:
-
HEADEREXTEND_MASK
public static final int HEADEREXTEND_MASK- See Also:
-
ELEMENTID_MASK
public static final int ELEMENTID_MASK- See Also:
-
RAWDATA_MASK
public static final int RAWDATA_MASK- See Also:
-
RAWDATA_BITSPERBYTE
public static final int RAWDATA_BITSPERBYTE- See Also:
-
RAWDATA_MARKER
public static final int RAWDATA_MARKER- See Also:
-
TYPECODE_SHIFT
public static final int TYPECODE_SHIFT- See Also:
-
LENGTHCODE_MASK
public static final int LENGTHCODE_MASK- See Also:
-
TYPECODE_BOOLEAN
public static final int TYPECODE_BOOLEAN- See Also:
-
TYPECODE_SIGNEDINT_POSITIVE
public static final int TYPECODE_SIGNEDINT_POSITIVE- See Also:
-
TYPECODE_SIGNEDINT_NEGATIVE
public static final int TYPECODE_SIGNEDINT_NEGATIVE- See Also:
-
TYPECODE_UNSIGNEDINT
public static final int TYPECODE_UNSIGNEDINT- See Also:
-
TYPECODE_ADDRESSSPACE
public static final int TYPECODE_ADDRESSSPACE- See Also:
-
TYPECODE_SPECIALSPACE
public static final int TYPECODE_SPECIALSPACE- See Also:
-
TYPECODE_STRING
public static final int TYPECODE_STRING- See Also:
-
SPECIALSPACE_STACK
public static final int SPECIALSPACE_STACK- See Also:
-
SPECIALSPACE_JOIN
public static final int SPECIALSPACE_JOIN- See Also:
-
SPECIALSPACE_FSPEC
public static final int SPECIALSPACE_FSPEC- See Also:
-
SPECIALSPACE_IOP
public static final int SPECIALSPACE_IOP- See Also:
-
SPECIALSPACE_SPACEBASE
public static final int SPECIALSPACE_SPACEBASE- See Also:
-
spaces
-
-
Constructor Details
-
PackedDecode
public PackedDecode()Constructor for formats that do not use the readSpace() methods or use setAddressFactory() in the middle of decoding -
PackedDecode
-
PackedDecode
Build a decoder for an input stream, where the decoder is set to read pages from the stream "as needed". An initial page is read from the stream by this constructor. But then the stream must remain open and additional pages are read during the decoding process. Calling close() after decoding, will close the underlying stream.- Parameters:
stream
- is the streamdesc
- is a descriptive string for the stream used in error messages- Throws:
IOException
- for problems initially reading from the stream
-
-
Method Details
-
getAddressFactory
- Specified by:
getAddressFactory
in interfaceDecoder
-
setAddressFactory
- Specified by:
setAddressFactory
in interfaceDecoder
-
clear
public void clear()Description copied from interface:ByteIngest
Clear any previous cached bytes.- Specified by:
clear
in interfaceByteIngest
-
open
Description copied from interface:ByteIngest
Open the ingester for receiving bytes. This establishes the description of the source of the bytes and maximum number of bytes that can be read- Specified by:
open
in interfaceByteIngest
- Parameters:
max
- is the maximum number of bytes that can be readdesc
- is the description of the byte source
-
close
Close stream cached by the ingestStreamAsNeeded method.- Throws:
IOException
- for low-level problems with the stream
-
ingestStreamToNextTerminator
Description copied from interface:ByteIngest
Ingest bytes from the stream up to (and including) the first 0 byte. This can be called multiple times to read in bytes in different chunks. An absolute limit is set on the number of bytes that can be ingested via the max parameter to a previous call to open(). If this limit is exceeded, an exception is thrown.- Specified by:
ingestStreamToNextTerminator
in interfaceByteIngest
- Parameters:
stream
- is the input stream to read from- Throws:
IOException
- for errors reading from the stream
-
ingestStream
Description copied from interface:ByteIngest
Ingest bytes from the stream until the end of stream is encountered. An absolute limit is set on the number of bytes that can be ingested via the max parameter to a previous call to open(). If this limit is exceeded, an exception is thrown.- Specified by:
ingestStream
in interfaceByteIngest
- Parameters:
stream
- is the input stream to read from- Throws:
IOException
- for errors reading from the stream
-
ingestBytes
Description copied from interface:ByteIngest
Ingest bytes directly from a byte array. If these bytes would cause the total number of bytes ingested to exceed the maximum (as set by the call to open()), an exception is thrown. This can be called multiple times to read in different chunks.- Specified by:
ingestBytes
in interfaceByteIngest
- Parameters:
byteArray
- is the array of bytesoff
- is the index of the first byte to ingestsz
- is the number of bytes to ingest- Throws:
IOException
- if the max number of bytes to ingest is exceeded
-
endIngest
public void endIngest()Description copied from interface:ByteIngest
Formal indicator that ingesting of bytes is complete and processing can begin- Specified by:
endIngest
in interfaceByteIngest
-
isEmpty
public boolean isEmpty()- Specified by:
isEmpty
in interfaceByteIngest
- Returns:
- true if no bytes have yet been ingested via ingestStream()
-
peekElement
Description copied from interface:Decoder
Peek at the next child element of the current parent, without traversing in (opening) it. The element id is returned, which can be compared to ElementId labels. If there are no remaining child elements to traverse, 0 is returned.- Specified by:
peekElement
in interfaceDecoder
- Returns:
- the element id or 0
- Throws:
DecoderException
- for an unexpected end of stream
-
openElement
Description copied from interface:Decoder
Open (traverse into) the next child element of the current parent. The child becomes the current parent. The list of attributes is initialized for use with getNextAttributeId.- Specified by:
openElement
in interfaceDecoder
- Returns:
- the id of the child element or 0 if there are no additional children
- Throws:
DecoderException
- for an unexpected end of stream
-
openElement
Description copied from interface:Decoder
Open (traverse into) the next child element, which must be of a specific type The child becomes the current parent, and its attributes are initialized for use with getNextAttributeId. The child must match the given element id or an exception is thrown.- Specified by:
openElement
in interfaceDecoder
- Parameters:
elemId
- is the given element id to match- Returns:
- the id of the child element
- Throws:
DecoderException
- if the expected element is not the next element
-
closeElement
Description copied from interface:Decoder
Close the current element The data for the current element is considered fully processed. If the element has additional children, an exception is thrown. The stream must indicate the end of the element in some way.- Specified by:
closeElement
in interfaceDecoder
- Parameters:
id
- is the id of the element to close (which must be the current element)- Throws:
DecoderException
- if not at end of expected element
-
closeElementSkipping
Description copied from interface:Decoder
Close the current element, skipping any child elements that have not yet been parsed. This closes the given element, which must be current. If there are child elements that have not been parsed, this is not considered an error, and they are skipped over in the parse.- Specified by:
closeElementSkipping
in interfaceDecoder
- Parameters:
id
- is the id of the element to close (which must be the current element)- Throws:
DecoderException
- if the indicated element is not the current element
-
getNextAttributeId
Description copied from interface:Decoder
Get the next attribute id for the current element Attributes are automatically set up for traversal using this method, when the element is opened. If all attributes have been traversed (or there are no attributes), 0 is returned.- Specified by:
getNextAttributeId
in interfaceDecoder
- Returns:
- the id of the next attribute or 0
- Throws:
DecoderException
- for unexpected end of stream
-
getIndexedAttributeId
Description copied from interface:Decoder
Get the id for the (current) attribute, assuming it is indexed. Assuming the previous call to getNextAttributeId() returned the id of ATTRIB_UNKNOWN, reinterpret the attribute as being an indexed form of the given attribute. If the attribute matches, return this indexed id, otherwise return ATTRIB_UNKNOWN.- Specified by:
getIndexedAttributeId
in interfaceDecoder
- Parameters:
attribId
- is the attribute being indexed- Returns:
- the indexed id or ATTRIB_UNKNOWN
- Throws:
DecoderException
- for unexpected end of stream
-
rewindAttributes
public void rewindAttributes()Description copied from interface:Decoder
Reset attribute traversal for the current element Attributes for a single element can be traversed more than once using the getNextAttributeId method.- Specified by:
rewindAttributes
in interfaceDecoder
-
readBool
Description copied from interface:Decoder
Parse the current attribute as a boolean value The last attribute, as returned by getNextAttributeId, is treated as a boolean, and its value is returned.- Specified by:
readBool
in interfaceDecoder
- Returns:
- the boolean value associated with the current attribute.
- Throws:
DecoderException
- if the expected value is not present
-
readBool
Description copied from interface:Decoder
Find and parse a specific attribute in the current element as a boolean value The set of attributes for the current element is searched for a match to the given attribute id. This attribute is then parsed as a boolean and its value returned. If there is no attribute matching the id, an exception is thrown. Parsing via getNextAttributeId is reset.- Specified by:
readBool
in interfaceDecoder
- Parameters:
attribId
- is the specific attribute id to match- Returns:
- the boolean value
- Throws:
DecoderException
- if the expected value is not present
-
readSignedInteger
Description copied from interface:Decoder
Parse the current attribute as a signed integer value The last attribute, as returned by getNextAttributeId, is treated as a signed integer, and its value is returned.- Specified by:
readSignedInteger
in interfaceDecoder
- Returns:
- the signed integer value associated with the current attribute.
- Throws:
DecoderException
- if the expected value is not present
-
readSignedInteger
Description copied from interface:Decoder
Find and parse a specific attribute in the current element as a signed integer The set of attributes for the current element is searched for a match to the given attribute id. This attribute is then parsed as a signed integer and its value returned. If there is no attribute matching the id, an exception is thrown. Parsing via getNextAttributeId is reset.- Specified by:
readSignedInteger
in interfaceDecoder
- Parameters:
attribId
- is the specific attribute id to match- Returns:
- the signed integer value
- Throws:
DecoderException
- if the expected value is not present
-
readSignedIntegerExpectString
Description copied from interface:Decoder
Parse the current attribute as either a signed integer value or a string. If the attribute is an integer, its value is returned. If the attribute is a string, it must match an expected string passed to the method, and a predetermined integer value associated with the string is returned. If the attribute string does not match, or the attribute is encoded as anything other than a string or signed integer, an exception is thrown.- Specified by:
readSignedIntegerExpectString
in interfaceDecoder
- Parameters:
expect
- is the string value to expect if the attribute is encoded as a stringexpectval
- is the integer value to return if the attribute matches the expected string- Returns:
- the encoded integer or the integer value associated with the expected string
- Throws:
DecoderException
- is an integer value or expected string cannot be parsed
-
readSignedIntegerExpectString
public long readSignedIntegerExpectString(AttributeId attribId, String expect, long expectval) throws DecoderException Description copied from interface:Decoder
Find and parse a specific attribute in the current element as either a signed integer or a string. If the attribute is an integer, its value is returned. If the attribute is encoded as a string, it must match an expected string passed to this method. In this case, a predetermined integer value is passed back, indicating a matching string was parsed. If the attribute string does not match, or the attribute is encoded as anything other than a string or signed integer, an exception is thrown.- Specified by:
readSignedIntegerExpectString
in interfaceDecoder
- Parameters:
attribId
- is the specific attribute id to matchexpect
- is the string to expect, if the attribute is not encoded as an integerexpectval
- is the integer value to return if the attribute matches the expected string- Returns:
- the encoded integer or the integer value associated with the expected string
- Throws:
DecoderException
- if an integer value or expected string cannot be parsed
-
readUnsignedInteger
Description copied from interface:Decoder
Parse the current attribute as an unsigned integer value The last attribute, as returned by getNextAttributeId, is treated as an unsigned integer, and its value is returned.- Specified by:
readUnsignedInteger
in interfaceDecoder
- Returns:
- the unsigned integer value associated with the current attribute.
- Throws:
DecoderException
- if the expected value is not present
-
readUnsignedInteger
Description copied from interface:Decoder
Find and parse a specific attribute in the current element as an unsigned integer The set of attributes for the current element is searched for a match to the given attribute id. This attribute is then parsed as an unsigned integer and its value returned. If there is no attribute matching the id, an exception is thrown. Parsing via getNextAttributeId is reset.- Specified by:
readUnsignedInteger
in interfaceDecoder
- Parameters:
attribId
- is the specific attribute id to match- Returns:
- the unsigned integer value
- Throws:
DecoderException
- if the expected value is not present
-
readString
Description copied from interface:Decoder
Parse the current attribute as a string The last attribute, as returned by getNextAttributeId, is returned as a string.- Specified by:
readString
in interfaceDecoder
- Returns:
- the string associated with the current attribute.
- Throws:
DecoderException
- if the expected value is not present
-
readString
Description copied from interface:Decoder
Find the specific attribute in the current element and return it as a string The set of attributes for the current element is searched for a match to the given attribute id. This attribute is then returned as a string. If there is no attribute matching the id, and exception is thrown. Parse via getNextAttributeId is reset.- Specified by:
readString
in interfaceDecoder
- Parameters:
attribId
- is the specific attribute id to match- Returns:
- the string associated with the attribute
- Throws:
DecoderException
- if the expected value is not present
-
readSpace
Description copied from interface:Decoder
Parse the current attribute as an address space The last attribute, as returned by getNextAttributeId, is returned as an address space.- Specified by:
readSpace
in interfaceDecoder
- Returns:
- the address space associated with the current attribute.
- Throws:
DecoderException
- if the expected value is not present
-
readSpace
Description copied from interface:Decoder
Find the specific attribute in the current element and return it as an address space Search attributes from the current element for a match to the given attribute id. Return this attribute as an address space. If there is no attribute matching the id, an exception is thrown. Parse via getNextAttributeId is reset.- Specified by:
readSpace
in interfaceDecoder
- Parameters:
attribId
- is the specific attribute id to match- Returns:
- the address space associated with the attribute
- Throws:
DecoderException
- if the expected value is not present
-
readOpcode
Description copied from interface:Decoder
Parse the current attribute is a p-code opcode The last attribute, as returned by getNextAttributeId, is returned as an opcode. The opcode is one of the constants specified inPcodeOp
- Specified by:
readOpcode
in interfaceDecoder
- Returns:
- the opcode associated with the current attribute
- Throws:
DecoderException
- if the expected value is not present
-
readOpcode
Description copied from interface:Decoder
Find the specific attribute in the current element and return it as an opcode Search attributes from the current element for a match to the given attribute id. Return this attribute as an opcode constant fromPcodeOp
. If there is no matching attribute id, an exception is thrown. Parse via getNextAttributeId is reset.- Specified by:
readOpcode
in interfaceDecoder
- Parameters:
attribId
- is the specific attribute id to match- Returns:
- the opcode associated with the attribute
- Throws:
DecoderException
- if the expected value is not present
-