lua-users home
lua-l archive

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



Sent from my BlackBerry 10 smartphone on the Virgin Mobile network.
  Original Message  
From: tobias@justdreams.de
Sent: Friday, May 26, 2017 3:29 PM.‎
To: lua-l@lists.lua.org
Reply To: Lua mailing list‎
Subject: Re: [PROPOSAL 5.4] alternate way of format/pack/unpack (in the string library)


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