[ragel-users] Work On Binary datagrams
Joseph Stewart
joseph.stewart at gmail.com
Thu Dec 16 14:24:29 UTC 2010
Adrian,
Do you have any tips or small examples for dealing with lengths? While I
have something that works, it doesn't feel right and I don't have the
experience with Ragel to know if I'm doing this right.
Below is a shell I've started to parse/validate binary chunks out of
XML-like tags (BTW, I did not create the format... I'm just the victim).
Eventually I need to parse data inside the Bin chunks.
The graphviz output for this is so gigantic that I think I'm doing something
fundamentally wrong.
Suggestions are greatly appreciated!
-joe
--- code follows ---
#include <stdio.h>
/*
chunks in file look like
<XRNDATA08192020001>LenData</XRNDATA>
where "08192" is an ASCII type designator (can expect other types)
where "020001" is an ASCII information field
where Len is a 4-byte little endian length designator
where Data is binary data of Len length
*/
#define XRN 'X', 'R', 'N', 'D', 'A', 'T', 'A'
#define T1 '0', '8', '1', '9', '2'
#define T2 '0', '0', '0', '1', '6'
#define T3 '0', '0', '0', '0', '8'
#define T4 '0', '0', '0', '0', '1'
#define I1 '0', '2', '0', '0', '0', '1'
%%{
machine tds;
write data;
}%%
int main() {
int len = 0;
unsigned char buf[] = {
'<', XRN, T1, I1, '>', 0, 0, 0, 5, 48,49,50,51,52, '<', '/', XRN, '>',
'<', XRN, T2, I1, '>', 0, 0, 0, 1, 10, '<', '/', XRN, '>',
'<', XRN, T3, I1, '>', 0, 0, 0, 1, 10, '<', '/', XRN, '>',
'<', XRN, T4, I1, '>', 0, 0, 0, 1, 10, '<', '/', XRN, '>',
'<', XRN, T1, I1, '>', 0, 0, 0, 0, '<', '/', XRN, '>',
};
int cs, r = 0;
unsigned char *p = (unsigned char *)&buf;
unsigned char *pe = p + sizeof(buf);
printf("len=%d\n", len);
%%{
t1 = '08192' @{ printf("t1\n"); };
t2 = '00016' @{ printf("t2\n"); };
t3 = '00008' @{ printf("t3\n"); };
t4 = '00001' @{ printf("t4\n"); };
type = (t1 | t2 | t3 | t4);
info = '020001';
open = '<XRNDATA' type info '>' @{ printf("begin XRNDATA\n"); len = 0; };
len = extend{4} @{ printf("len = %d\n", (int)*p); len = (len*256) + (*p); };
buffer = (extend when {len--})* @{ printf("[%d]:%d\n", len, *p); };
close = '</XRNDATA>' @{ printf("end XRNDATA\n"); };
expr = open len buffer close;
main := expr*;
write init;
write exec;
}%%
return 0;
}
On Mon, Dec 6, 2010 at 1:16 PM, Adrian Thurston <
adrian.thurston at esentire.com> wrote:
> I use ragel to parse binary protocols at work. Often, the most difficult
> part is dealing with lengths, or counts of things. A good example is the DNS
> protocol. There are several sections of N blocks of questions and resource
> records items. Inside the blocks you must also deal with lengths in names.
>
> Unfortunately, there are not many open examples of parsing this way. Start
> by looking in the manual. I would like to improve Ragel's support for this
> kind of parsing.
>
> -Adrian
>
>
> On 10-12-03 02:53 AM, Vitaly V. Ch wrote:
>
>> Hi!
>>
>> I'm interested in any tips or examples of using ragel on binary datagrams.
>>
>> \\wbr Vitaly Chernooky
>>
>> _______________________________________________
>> ragel-users mailing list
>> ragel-users at complang.org
>> http://www.complang.org/mailman/listinfo/ragel-users
>>
>>
> _______________________________________________
> ragel-users mailing list
> ragel-users at complang.org
> http://www.complang.org/mailman/listinfo/ragel-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.colm.net/pipermail/ragel-users/attachments/20101216/aa495f1a/attachment-0001.html>
-------------- next part --------------
_______________________________________________
ragel-users mailing list
ragel-users at complang.org
http://www.complang.org/mailman/listinfo/ragel-users
More information about the ragel-users
mailing list