lua-users home
lua-l archive

[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