Package ghidra.program.model.pcode

# Class PackedDecode

java.lang.Object
ghidra.program.model.pcode.PackedDecode

All Implemented Interfaces:
  `ByteIngest`, `Decoder`

Direct Known Subclasses:
  `PackedDecodeOverlay`

public class PackedDecode extends Object implements Decoder

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final int`
  `ATTRIBUTE`
  `static final int`
  `ELEMENT_END`
  `static final int`
  `ELEMENT_START`
  `static final int`
  `ELEMENTID_MASK`
  `static final int`
  `HEADER_MASK`
  `static final int`
  `HEADEREXTEND_MASK`
  `static final int`
  `LENGTHCODE_MASK`
  `static final int`
  `RAWDATA_BITSPERBYTE`
  `static final int`
  `RAWDATA_MARKER`
  `static final int`
  `RAWDATA_MASK`
  `protected AddressSpace[]`
  `spaces`
  `static final int`
  `SPECIALSPACE_FSPEC`
  `static final int`
  `SPECIALSPACE_IOP`
  `static final int`
  `SPECIALSPACE_JOIN`
  `static final int`
  `SPECIALSPACE_SPACEBASE`
  `static final int`
  `SPECIALSPACE_STACK`
  `static final int`
  `TYPECODE_ADDRESSSPACE`
  `static final int`
  `TYPECODE_BOOLEAN`
  `static final int`
  `TYPECODE_SHIFT`
  `static final int`
  `TYPECODE_SIGNEDINT_NEGATIVE`
  `static final int`
  `TYPECODE_SIGNEDINT_POSITIVE`
  `static final int`
  `TYPECODE_SPECIALSPACE`
  `static final int`
  `TYPECODE_STRING`
  `static final int`
  `TYPECODE_UNSIGNEDINT`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `PackedDecode()`
  Constructor for formats that do not use the readSpace() methods or use setAddressFactory() in the middle of decoding
  `PackedDecode(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 Type
  Method
  Description
  `void`
  `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`
  `endIngest()`
  Formal indicator that ingesting of bytes is complete and processing can begin
  `AddressFactory`
  `getAddressFactory()`
  `int`
  `getIndexedAttributeId(AttributeId attribId)`
  Get the id for the (current) attribute, assuming it is indexed.
  `int`
  `getNextAttributeId()`
  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`
  `ingestStreamToNextTerminator(InputStream stream)`
  Ingest bytes from the stream up to (and including) the first 0 byte.
  `boolean`
  `isEmpty()`
  `void`
  `open(int max, String desc)`
  Open the ingester for receiving bytes.
  `int`
  `openElement()`
  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`
  `peekElement()`
  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`
  `readOpcode()`
  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`
  `readSignedInteger()`
  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.
  `AddressSpace`
  `readSpace()`
  Parse the current attribute as an address space The last attribute, as returned by getNextAttributeId, is returned as an address space.
  `AddressSpace`
  `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.
  `String`
  `readString()`
  Parse the current attribute as a string The last attribute, as returned by getNextAttributeId, is returned as a string.
  `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`
  `readUnsignedInteger()`
  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`
  `rewindAttributes()`
  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:
      - Constant Field Values

  - ### ELEMENT_START

    public static final int ELEMENT_START
    See Also:
      - Constant Field Values

  - ### ELEMENT_END

    public static final int ELEMENT_END
    See Also:
      - Constant Field Values

  - ### ATTRIBUTE

    public static final int ATTRIBUTE
    See Also:
      - Constant Field Values

  - ### HEADEREXTEND_MASK

    public static final int HEADEREXTEND_MASK
    See Also:
      - Constant Field Values

  - ### ELEMENTID_MASK

    public static final int ELEMENTID_MASK
    See Also:
      - Constant Field Values

  - ### RAWDATA_MASK

    public static final int RAWDATA_MASK
    See Also:
      - Constant Field Values

  - ### RAWDATA_BITSPERBYTE

    public static final int RAWDATA_BITSPERBYTE
    See Also:
      - Constant Field Values

  - ### RAWDATA_MARKER

    public static final int RAWDATA_MARKER
    See Also:
      - Constant Field Values

  - ### TYPECODE_SHIFT

    public static final int TYPECODE_SHIFT
    See Also:
      - Constant Field Values

  - ### LENGTHCODE_MASK

    public static final int LENGTHCODE_MASK
    See Also:
      - Constant Field Values

  - ### TYPECODE_BOOLEAN

    public static final int TYPECODE_BOOLEAN
    See Also:
      - Constant Field Values

  - ### TYPECODE_SIGNEDINT_POSITIVE

    public static final int TYPECODE_SIGNEDINT_POSITIVE
    See Also:
      - Constant Field Values

  - ### TYPECODE_SIGNEDINT_NEGATIVE

    public static final int TYPECODE_SIGNEDINT_NEGATIVE
    See Also:
      - Constant Field Values

  - ### TYPECODE_UNSIGNEDINT

    public static final int TYPECODE_UNSIGNEDINT
    See Also:
      - Constant Field Values

  - ### TYPECODE_ADDRESSSPACE

    public static final int TYPECODE_ADDRESSSPACE
    See Also:
      - Constant Field Values

  - ### TYPECODE_SPECIALSPACE

    public static final int TYPECODE_SPECIALSPACE
    See Also:
      - Constant Field Values

  - ### TYPECODE_STRING

    public static final int TYPECODE_STRING
    See Also:
      - Constant Field Values

  - ### SPECIALSPACE_STACK

    public static final int SPECIALSPACE_STACK
    See Also:
      - Constant Field Values

  - ### SPECIALSPACE_JOIN

    public static final int SPECIALSPACE_JOIN
    See Also:
      - Constant Field Values

  - ### SPECIALSPACE_FSPEC

    public static final int SPECIALSPACE_FSPEC
    See Also:
      - Constant Field Values

  - ### SPECIALSPACE_IOP

    public static final int SPECIALSPACE_IOP
    See Also:
      - Constant Field Values

  - ### SPECIALSPACE_SPACEBASE

    public static final int SPECIALSPACE_SPACEBASE
    See Also:
      - Constant Field Values

  - ### spaces

    protected AddressSpace[] 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

    public PackedDecode(AddressFactory addrFactory)

  - ### PackedDecode

    public PackedDecode(InputStream stream, String desc) throws IOException
    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 stream
      `desc` - is a descriptive string for the stream used in error messages
    Throws:
      `IOException` - for problems initially reading from the stream

- ## Method Details

  - ### getAddressFactory

    public AddressFactory getAddressFactory()
    Specified by:
      `getAddressFactory` in interface `Decoder`

  - ### setAddressFactory

    public void setAddressFactory(AddressFactory addrFactory)
    Specified by:
      `setAddressFactory` in interface `Decoder`

  - ### clear

    public void clear()
    Description copied from interface: `ByteIngest`
    Clear any previous cached bytes.
    Specified by:
      `clear` in interface `ByteIngest`

  - ### open

    public void open(int max, String desc)
    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 interface `ByteIngest`
    Parameters:
      `max` - is the maximum number of bytes that can be read
      `desc` - is the description of the byte source

  - ### close

    public void close() throws IOException
    Close stream cached by the ingestStreamAsNeeded method.
    Throws:
      `IOException` - for low-level problems with the stream

  - ### ingestStreamToNextTerminator

    public void ingestStreamToNextTerminator(InputStream stream) throws IOException
    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 interface `ByteIngest`
    Parameters:
      `stream` - is the input stream to read from
    Throws:
      `IOException` - for errors reading from the stream

  - ### ingestStream

    public void ingestStream(InputStream stream) throws IOException
    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 interface `ByteIngest`
    Parameters:
      `stream` - is the input stream to read from
    Throws:
      `IOException` - for errors reading from the stream

  - ### ingestBytes

    public void ingestBytes(byte[] byteArray, int off, int sz) throws IOException
    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 interface `ByteIngest`
    Parameters:
      `byteArray` - is the array of bytes
      `off` - is the index of the first byte to ingest
      `sz` - 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 interface `ByteIngest`

  - ### isEmpty

    public boolean isEmpty()
    Specified by:
      `isEmpty` in interface `ByteIngest`
    Returns:
      true if no bytes have yet been ingested via ingestStream()

  - ### peekElement

    public int peekElement() throws DecoderException
    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 interface `Decoder`
    Returns:
      the element id or 0
    Throws:
      `DecoderException` - for an unexpected end of stream

  - ### openElement

    public int openElement() throws DecoderException
    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 interface `Decoder`
    Returns:
      the id of the child element or 0 if there are no additional children
    Throws:
      `DecoderException` - for an unexpected end of stream

  - ### openElement

    public int openElement(ElementId elemId) throws DecoderException
    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 interface `Decoder`
    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

    public void closeElement(int id) throws DecoderException
    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 interface `Decoder`
    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

    public void closeElementSkipping(int id) throws DecoderException
    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 interface `Decoder`
    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

    public int getNextAttributeId() throws DecoderException
    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 interface `Decoder`
    Returns:
      the id of the next attribute or 0
    Throws:
      `DecoderException` - for unexpected end of stream

  - ### getIndexedAttributeId

    public int getIndexedAttributeId(AttributeId attribId) throws DecoderException
    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 interface `Decoder`
    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 interface `Decoder`

  - ### readBool

    public boolean readBool() throws DecoderException
    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 interface `Decoder`
    Returns:
      the boolean value associated with the current attribute.
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readBool

    public boolean readBool(AttributeId attribId) throws DecoderException
    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 interface `Decoder`
    Parameters:
      `attribId` - is the specific attribute id to match
    Returns:
      the boolean value
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readSignedInteger

    public long readSignedInteger() throws DecoderException
    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 interface `Decoder`
    Returns:
      the signed integer value associated with the current attribute.
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readSignedInteger

    public long readSignedInteger(AttributeId attribId) throws DecoderException
    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 interface `Decoder`
    Parameters:
      `attribId` - is the specific attribute id to match
    Returns:
      the signed integer value
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readSignedIntegerExpectString

    public long readSignedIntegerExpectString(String expect, long expectval) throws DecoderException
    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 interface `Decoder`
    Parameters:
      `expect` - is the string value to expect if the attribute is encoded as a string
      `expectval` - 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 interface `Decoder`
    Parameters:
      `attribId` - is the specific attribute id to match
      `expect` - is the string to expect, if the attribute is not encoded as an integer
      `expectval` - 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

    public long readUnsignedInteger() throws DecoderException
    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 interface `Decoder`
    Returns:
      the unsigned integer value associated with the current attribute.
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readUnsignedInteger

    public long readUnsignedInteger(AttributeId attribId) throws DecoderException
    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 interface `Decoder`
    Parameters:
      `attribId` - is the specific attribute id to match
    Returns:
      the unsigned integer value
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readString

    public String readString() throws DecoderException
    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 interface `Decoder`
    Returns:
      the string associated with the current attribute.
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readString

    public String readString(AttributeId attribId) throws DecoderException
    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 interface `Decoder`
    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

    public AddressSpace readSpace() throws DecoderException
    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 interface `Decoder`
    Returns:
      the address space associated with the current attribute.
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readSpace

    public AddressSpace readSpace(AttributeId attribId) throws DecoderException
    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 interface `Decoder`
    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

    public int readOpcode() throws DecoderException
    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 in `PcodeOp`
    Specified by:
      `readOpcode` in interface `Decoder`
    Returns:
      the opcode associated with the current attribute
    Throws:
      `DecoderException` - if the expected value is not present

  - ### readOpcode

    public int readOpcode(AttributeId attribId) throws DecoderException
    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 from `PcodeOp`. If there is no matching attribute id, an exception is thrown. Parse via getNextAttributeId is reset.
    Specified by:
      `readOpcode` in interface `Decoder`
    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