lua-users home
lua-l archive

Re: [PROPOSAL 5.4] alternate way of format/pack/unpack (in the string library)

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Quoting Sean Conner <sean@conman.org>:
 I don't find the pack/unpack minilanguage all that bad, per se. Lowercase
letters are signed quantities, uppercase unsigned and there's some mneumonic
meaning to the letters used. But it can get silly (sample from an SMPP
parser):
	result.service_type,
	result.source.addr_ton,
	result.source.addr_npi,
	result.source.addr,
	result.dest.addr_ton,
	result.dest.addr_npi,
	result.dest.addr,
	result.esm_class,
	result.protocol_id,
	result.prority,
	result.schedule_time,
	result.validity_period,
	result.registered_delivery,
	result.replace_if_present,
	result.data_coding,
	result.sm_default_msg_id,
	result.message =
	string.unpack(">z I1 I1 z I1 I1 z I1 I1 I1 z z I1 I1 I1 I1 s1",blob,13)
 It was hard to debug, and the obvious solution:
	result.service_type,pos = string.unpack(">z",blob,pos)
	result.source.addr_ton,pos = string.unpack(">I1",blob,pos)
	result.source.addr_npi,pos = string.unpack(">I1",blob,pos)
	--- and so on
This is exactly what I'm trying to solve with lua-t library Pack module. It
doesn't support zero terminated strings yet but once it does your code could
look like:
snppParser = Pack(
 { service_type = ">z" },
 { source = Pack(
 { addr_ton = 'I1' },
 { addr_npi = 'I1' },
 { addr = 'z' }
 ) },
 { dest = Pack(
 { addr_ton = 'I1' },
 { addr_npi = 'I1' },
 { addr = 'z' }
 ) },
 { esm_class = 'I1' },
 { protocol_id = 'I1' },
 { prority = 'I1' },
 { schedule_time = 'z' },
 { validity_period = 'z' },
 { registered_delivery = 'I1' },
 { replace_if_present = 'I1' },
 { data_coding = 'I1' },
 { sm_default_msg_id = 'I1' },
 { message = 's1' }
)
result = snppParser( blob )
--access via
valA = result.service_type
valB = result.dest.addr
-- ...
https://github.com/tobbik/lua-t
 -tobbik

AltStyle によって変換されたページ (->オリジナル) /