[ragel-users] fcall/fret operator error?
Gordon Smith
spiderkarma at gmail.com
Fri Oct 10 21:15:25 UTC 2008
Hello all -
Having a bit of trouble with fcall/fret.
I need to read a number in a string that indicates the number of bytes to
follow. I do this correctly with a complete string, but also reach a final
state with an incomplete string that includes some of the binary data. I'm
using fcall into another machine to read the binary data.
Have I missed something obvious?
Thanks,
Gordon
%%{
machine TEST;
alphtype char;
action binary_data_length_check {
fsm.binary_data_count++;
if ( fsm.binary_data_count >= fsm.byte_count ) {
//fhold;
fret;
}
}
action binary_data_init { fsm.binary_data_count = 0; }
binary_data_machine := any+ $binary_data_length_check >binary_data_init;
# We're trying to do this:
# any{fsm.byte_count}
action binary_data_action {
fcall binary_data_machine;
}
binary_payload = 'r.' @binary_data_action;
# b:<NumBytes>:<NumBytes of chars>:<CRC><CR>
bridge_packet =
'b:'
( xdigit @{ AddXDigit( fsm.byte_count, * p ); } )+
':'
binary_payload
':'
xdigit+
'\r';
main := bridge_packet;
}%%
%% write data;
void init() {
%% write init;
fsm.byte_count = 0;
}
void parse(char * payload, char * payloadEnd) {
const char * p = payload;
const char * pe = payloadEnd;
%% access fsm.;
%% write exec;
if ( fsm.cs == TEST_error ) {
std::cout << "FINISH_ERROR\n";
} else if ( fsm.cs >= TEST_first_final ) {
std::cout << "FINISH_FINAL\n";
} else {
std::cout << "FINISH_NOT_FINAL\n";
}
}
int main() {
init();
{
// Complete
char * t1 = "b:0004:r.abcd:a0\r";
parse(t1, t1 + strlen( t1 ) );
}
init();
{
// Incomplete
char * t1 = "b:0004:r.ab";
parse(t1, t1 + strlen( t1 ) );
}
return 0;
}
----------
Output is:
{{{
FINISH_FINAL
FINISH_FINAL
}}}
and I expect
{{{
FINISH_FINAL
FINISH_NOT_FINAL
}}}
AddXDigit( unsigned target, char c ) adds value of hexadecimal digit to
target.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.colm.net/pipermail/ragel/attachments/20081010/74e63ad8/attachment.html>
More information about the ragel-users
mailing list