class DL::Packer

Public Class Methods

[](*types) click to toggle source
# File ext/dl/lib/dl/pack.rb, line 66
def self.[](*types)
  new(types)
end
new(types) click to toggle source
# File ext/dl/lib/dl/pack.rb, line 70
def initialize(types)
  parse_types(types)
end

Public Instance Methods

pack(ary) click to toggle source
# File ext/dl/lib/dl/pack.rb, line 78
def pack(ary)
  case SIZEOF_VOIDP
  when SIZEOF_LONG
    ary.pack(@template)
  when SIZEOF_LONG_LONG
    ary.pack(@template)
  else
    raise(RuntimeError, "sizeof(void*)?")
  end
end
size() click to toggle source
# File ext/dl/lib/dl/pack.rb, line 74
def size()
  @size
end
unpack(ary) click to toggle source
# File ext/dl/lib/dl/pack.rb, line 89
def unpack(ary)
  case SIZEOF_VOIDP
  when SIZEOF_LONG
    ary.join().unpack(@template)
  when SIZEOF_LONG_LONG
    ary.join().unpack(@template)
  else
    raise(RuntimeError, "sizeof(void*)?")
  end
end

Private Instance Methods

parse_types(types) click to toggle source
# File ext/dl/lib/dl/pack.rb, line 102
def parse_types(types)
  @template = ""
  addr     = 0
  types.each{|t|
    orig_addr = addr
    if( t.is_a?(Array) )
      addr = align(orig_addr, ALIGN_MAP[TYPE_VOIDP])
    else
      addr = align(orig_addr, ALIGN_MAP[t])
    end
    d = addr - orig_addr
    if( d > 0 )
      @template << "x#{d}"
    end
    if( t.is_a?(Array) )
      @template << (PACK_MAP[t[0]] * t[1])
      addr += (SIZE_MAP[t[0]] * t[1])
    else
      @template << PACK_MAP[t]
      addr += SIZE_MAP[t]
    end
  }
  addr = align(addr, ALIGN_MAP[TYPE_VOIDP])
  @size = addr
end