Right now there is no 'right' way. There are actually are many different ways each with their own ups and downs. There is some work I want to do on conditions to ease length processing (comes up at work a lot) and I'm hoping to soon be able to prescribe a recommended way of dealing with lengths that is general enough to apply to the majority of cases that I see.

On 10-12-16 06:24 AM, Joseph Stewart wrote:
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
<[email protected] <mailto:[email protected]>> 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
        [email protected] <mailto:[email protected]>
        http://www.complang.org/mailman/listinfo/ragel-users


    _______________________________________________
    ragel-users mailing list
    [email protected] <mailto:[email protected]>
    http://www.complang.org/mailman/listinfo/ragel-users




_______________________________________________
ragel-users mailing list
[email protected]
http://www.complang.org/mailman/listinfo/ragel-users

_______________________________________________
ragel-users mailing list
[email protected]
http://www.complang.org/mailman/listinfo/ragel-users

Reply via email to