in reply to C-like structures parsing and validation


Convert::Binary::C may do what you want.

It will parse the C structs into Perl structures and you may be able to do your validation from there. From the docs:

use Convert::Binary::C; #--------------------------------------------- # Create a new object and parse embedded code #--------------------------------------------- my $c = Convert::Binary::C->new->parse(<<ENDC); enum Month { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC }; struct Date { int year; enum Month month; int day; }; ENDC #----------------------------------------------- # Pack Perl data structure into a binary string #----------------------------------------------- my $date = { year => 2002, month => 'DEC', day => 24 }; my $packed = $c->pack('Date', $date);

--
John.

Replies are listed 'Best First'.
Re^2: C-like structures parsing and validation
by przemo (Scribe) on Nov 17, 2009 at 12:17 UTC

    This is nice! However, the module restricts one to use only constants as array indices, required to calculate offsets, etc. So it will not handle more complicated expressions:

    use Convert::Binary::C; use 5.010; my $structs = <<EOT; struct vertex { int id; double lon; double lat; }; struct arc { struct vertex from; struct vertex to; double cost; }; struct graph { struct vertex v[]; struct arc a[]; }; EOT $c = Convert::Binary::C->new; $c->parse($structs); # now we can validate say $c->typeof("graph"); # says "struct graph" say $c->typeof("graph.v[0].id"); # says "int" say $c->typeof("graph.v[graph.v[0].id].id"); # error: Array indices m +ust be constant decimal values