class Ronin::Support::Binary::CTypes::UnboundedArrayType

Represents an unbounded array type.

@api private

@since 1.0.0

Attributes

type[R]

The type of each element in the unbounded array type.

@return [Type]

Public Class Methods

new(type, alignment: nil) click to toggle source

Initializes the unbounded array type.

@param [Type] type

The type of each element in the unbounded array type.

@raise [ArgumentError]

Cannot initialize a nested {UnboundedArrayType}.
Calls superclass method
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 49
def initialize(type, alignment: nil)
  if type.kind_of?(UnboundedArrayType)
    raise(ArgumentError,"cannot initialize a nested #{UnboundedArrayType}")
  end

  @type      = type
  @alignment = alignment

  super(
    # "T*" syntax only works on individual pack-string codes,
    # so we only set #pack_string for scalar types that also have
    # a #pack_string.
    pack_string: if @type.kind_of?(ScalarType) && @type.pack_string
                   "#{@type.pack_string}*"
                 end
  )
end

Public Instance Methods

align(new_alignment) click to toggle source

Creates a copy of the unbounded array type with a different {#alignment}.

@param [Integer] new_alignment

The new alignment for the new unbounded array type.

@return [ScalarType]

The new unbounded array type.
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 95
def align(new_alignment)
  self.class.new(@type, alignment: new_alignment)
end
alignment() click to toggle source

The alignment, in bytes, for the unbounded array.

@return [Integer]

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 81
def alignment
  @alignment || @type.alignment
end
dequeue_value(values) click to toggle source

Dequeues an array from the flat list of values.

@param [Array] values

The flat array of values.

@return [Array]

The dequeued array.

@api private

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 218
def dequeue_value(values)
  array = []

  until values.empty?
    array << @type.dequeue_value(values)
  end

  return array
end
endian() click to toggle source

The endianness of each element in the unbounded array.

@return [:little, :big, nil]

Indicates whether each element is little-endian, big-endian,
or `nil` if each element has no endianness.
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 115
def endian
  @type.endian
end
enqueue_value(values,array) click to toggle source

Enqueues an array of values onto the flat list of values.

@param [Array] values

The flat array of values.

@param [Array] array

The array to enqueue.

@api private

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 201
def enqueue_value(values,array)
  array.each do |element|
    @type.enqueue_value(values,element)
  end
end
length() click to toggle source

The “length” of the unbounded array type.

@return [Float::INFINITY]

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 104
def length
  Float::INFINITY
end
pack(array) click to toggle source

Packs an array of values into the type’s binary format.

@param [Array<Integer, Float, String>] array

The array to pack.

@return [String]

The packed binary data.

@api public

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 148
def pack(array)
  if @pack_string
    super(array)
  else
    buffer = String.new

    array.each do |element|
      buffer << @type.pack(element)
    end

    return buffer
  end
end
signed?() click to toggle source

Indicates whether each element is signed.

@return [Boolean]

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 124
def signed?
  @type.signed?
end
size() click to toggle source

The “size” in bytes of the unbounded array type.

@return [Float::INFINITY]

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 72
def size
  Float::INFINITY
end
unpack(data) click to toggle source

Unpacks an array of binary data.

@param [String] data

The binary data to unpack.

@return [Array<Integer, Float, String, nil>]

The unpacked array.

@api public

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 173
def unpack(data)
  if @pack_string
    super(data)
  else
    case @type
    when StringType
      unpack_strings(data)
    else
      type_size = @type.size

      (0...data.bytesize).step(type_size).map do |offset|
        @type.unpack(data.byteslice(offset,type_size))
      end
    end
  end
end
unsigned?() click to toggle source

Indicates whether each element is unsigned.

@return [Boolean]

# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 133
def unsigned?
  @type.unsigned?
end

Private Instance Methods

unpack_strings(data) click to toggle source

Unpacks an arbitrary number of null-terminated C Strings.

@param [String] data

The binary encoded data.

@return [Array<String>]

The unpacked Strings.
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 239
def unpack_strings(data)
  array  = []
  length = data.bytesize
  offset = 0

  while offset < length
    string = @type.unpack(data[offset..])
    array  << string

    offset += string.bytesize + 1
  end

  return array
end