diff options
Diffstat (limited to 'test/eofcall1.rl')
-rw-r--r-- | test/eofcall1.rl | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/test/eofcall1.rl b/test/eofcall1.rl new file mode 100644 index 00000000..598f8705 --- /dev/null +++ b/test/eofcall1.rl @@ -0,0 +1,138 @@ +/* + * @LANG: c + * + * Testing fcall in an EOF action. + */ + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +int neg; +int value; + +%%{ + machine atoi; + + action begin { + neg = 0; + value = 0; + } + + action see_neg + { + neg = 1; + } + + action add_digit + { + value = value * 10 + ( int ) ( fc - 48 ); + } + + action finish + { + if ( neg != 0 ) { + value = -1 * value; + } + } + + action print + { + printf( "%d", value ); + printf( "%s", "\n" ); + } + + atoi = ( + ('-'@see_neg | '+')? (digit @add_digit)+ + ) >begin %finish; + + main := atoi '\n' @print %{ printf("goto extra\n"); fcall extra; }; + + extra := "" %{ printf("done: %d\n", (int)(p-data)); }; + +}%% + +%% write data; +int cs; +int blen; +char buffer[1024]; +int top, stack[1]; + +void init() +{ + value = 0; + neg = 0; + %% write init; +} + +void exec( char *data, int len ) +{ + char *p = data; + char *pe = data + len; + char *eof = pe; + %% write exec; +} + +void finish( ) +{ + if ( cs >= atoi_first_final ) + printf( "ACCEPT\n" ); + else + printf( "FAIL\n" ); + +} + +char *inp[] = { + "1\n", + "12\n", + "222222\n", + "+2123\n", + "213 3213\n", + "-12321\n", + "--123\n", + "-99\n", + " -3000\n", +}; + +int inplen = 9; + +int main( ) +{ + int i; + for ( i = 0; i < inplen; i++ ) { + init(); + exec( inp[i], strlen(inp[i]) ); + finish(); + } + return 0; +} + +#ifdef ___________OUTPUT___________ +1 +goto extra +done: 2 +ACCEPT +12 +goto extra +done: 3 +ACCEPT +222222 +goto extra +done: 7 +ACCEPT +2123 +goto extra +done: 6 +ACCEPT +FAIL +-12321 +goto extra +done: 7 +ACCEPT +FAIL +-99 +goto extra +done: 4 +ACCEPT +FAIL +#endif |