293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
# File 'lib/binary_finery.rb', line 293
def method_missing(method_name, *args, &block)
if method_name.to_s =~ OP_INT_RE
op, type, bits, byte_order = Regexp.last_match[1..4]
op, type, byte_order = [op, type].map!(&:to_sym)
byte_size = (bits.to_i / 8)
byte_order = byte_order.to_sym unless byte_order.nil?
byte_order = :big if byte_order == 'network'
fmt = format(byte_size,type,byte_order)
case op
when :read
self.class.send :define_method, method_name do
readn_unpack(byte_size, fmt, byte_order)
end
self.send method_name
when :write
if (args.first.kind_of? Integer) && (args.size == 1)
self.class.send :define_method, method_name do |value|
write_pack(value, fmt, byte_order)
end
self.send method_name, args.first
end
end
elsif method_name.to_s =~ OP_STR_RE
op, string_flavor = Regexp.last_match[1..2]
case op
when :read
options = args.first.indexes(:size, :padding)
self.send :read_string, options
when :write
str, options = args.shift, args
self.send :write_string, str, options
end
else
super
end
end
|