24 ary.pack(@template).unpack('l!*')
26 ary.pack(@template).unpack('q*')
28 raise(RuntimeError, "sizeof(void*)?")
35 ary.pack('l!*').unpack(@template)
37 ary.pack('q*').unpack(@template)
39 raise(RuntimeError, "sizeof(void*)?")
45 def align(addr, align)
54 if( defined?(TYPE_LONG_LONG) )
56 TYPE_VOIDP => ALIGN_VOIDP,
57 TYPE_CHAR => ALIGN_VOIDP,
58 TYPE_SHORT => ALIGN_VOIDP,
59 TYPE_INT => ALIGN_VOIDP,
60 TYPE_LONG => ALIGN_VOIDP,
61 TYPE_LONG_LONG => ALIGN_LONG_LONG,
62 TYPE_FLOAT => ALIGN_FLOAT,
63 TYPE_DOUBLE => ALIGN_DOUBLE,
67 TYPE_VOIDP => ((SIZEOF_VOIDP == SIZEOF_LONG_LONG)? "q" : "l!"),
72 TYPE_LONG_LONG => "q",
78 TYPE_VOIDP => SIZEOF_VOIDP,
79 TYPE_CHAR => SIZEOF_CHAR,
80 TYPE_SHORT => SIZEOF_SHORT,
81 TYPE_INT => SIZEOF_INT,
82 TYPE_LONG => SIZEOF_LONG,
83 TYPE_LONG_LONG => SIZEOF_LONG_LONG,
84 TYPE_FLOAT => SIZEOF_FLOAT,
85 TYPE_DOUBLE => SIZEOF_DOUBLE,
89 TYPE_VOIDP => ALIGN_VOIDP,
90 TYPE_CHAR => ALIGN_VOIDP,
91 TYPE_SHORT => ALIGN_VOIDP,
92 TYPE_INT => ALIGN_VOIDP,
93 TYPE_LONG => ALIGN_VOIDP,
94 TYPE_FLOAT => ALIGN_FLOAT,
95 TYPE_DOUBLE => ALIGN_DOUBLE,
99 TYPE_VOIDP => ((SIZEOF_VOIDP == SIZEOF_LONG_LONG)? "q" : "l!"),
109 TYPE_VOIDP => SIZEOF_VOIDP,
110 TYPE_CHAR => SIZEOF_CHAR,
111 TYPE_SHORT => SIZEOF_SHORT,
112 TYPE_INT => SIZEOF_INT,
113 TYPE_LONG => SIZEOF_LONG,
114 TYPE_FLOAT => SIZEOF_FLOAT,
115 TYPE_DOUBLE => SIZEOF_DOUBLE,
119 def parse_types(types)
124 addr = add_padding(addr, ALIGN_MAP[t])
125 @template << PACK_MAP[t]
128 addr = add_padding(addr, ALIGN_MAP[SIZEOF_VOIDP])
129 if( addr % SIZEOF_VOIDP == 0 )
130 @size = addr / SIZEOF_VOIDP
132 @size = (addr / SIZEOF_VOIDP) + 1
136 def add_padding(addr, align)
138 addr = align(orig_addr, align)