diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2014-10-13 19:14:30 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2014-10-13 19:14:30 +0000 |
commit | eafd7a3974e8605fd02794269db6114a3446e016 (patch) | |
tree | 064737b35dbe10f2995753ead92f95bac30ba048 /test/forder2.rl | |
download | ragel-tarball-eafd7a3974e8605fd02794269db6114a3446e016.tar.gz |
ragel-6.9ragel-6.9
Diffstat (limited to 'test/forder2.rl')
-rw-r--r-- | test/forder2.rl | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/test/forder2.rl b/test/forder2.rl new file mode 100644 index 0000000..d92f888 --- /dev/null +++ b/test/forder2.rl @@ -0,0 +1,133 @@ +/* + * @LANG: c + */ + +#include <stdio.h> +#include <string.h> + +/* + * After the fact start and ending transitions. Behaves like constructors of + * and destructors in c++. + */ + +struct forder +{ + int cs; +}; + +%%{ + machine forder; + variable cs fsm->cs; + + inner = 'inner' + >{printf("enter inner\n");} + ${printf("inside inner\n");} + %{printf("leave inner\n");} + ; + + outter = inner + >{printf("enter outter\n");} + ${printf("inside outter\n");} + %{printf("leave outter\n");} + ; + + main := outter . '\n'; +}%% + +%% write data; + +void forder_init( struct forder *fsm ) +{ + %% write init; +} + +void forder_execute( struct forder *fsm, const char *_data, int _len ) +{ + const char *p = _data; + const char *pe = _data+_len; + + %% write exec; +} + +int forder_finish( struct forder *fsm ) +{ + if ( fsm->cs == forder_error ) + return -1; + if ( fsm->cs >= forder_first_final ) + return 1; + return 0; +} + +struct forder fsm; + +void test( char *buf ) +{ + int len = strlen( buf ); + forder_init( &fsm ); + forder_execute( &fsm, buf, len ); + if ( forder_finish( &fsm ) > 0 ) + printf("ACCEPT\n"); + else + printf("FAIL\n"); +} + + +int main() +{ + test( "inner\n"); + + test( + "inner\n" + "foobar\n" + ); + + test( "" ); + test( "\n" ); + test( "inn\n" ); + + return 0; +} + +#ifdef _____OUTPUT_____ +enter outter +enter inner +inside inner +inside outter +inside inner +inside outter +inside inner +inside outter +inside inner +inside outter +inside inner +inside outter +leave inner +leave outter +ACCEPT +enter outter +enter inner +inside inner +inside outter +inside inner +inside outter +inside inner +inside outter +inside inner +inside outter +inside inner +inside outter +leave inner +leave outter +FAIL +FAIL +FAIL +enter outter +enter inner +inside inner +inside outter +inside inner +inside outter +inside inner +inside outter +FAIL +#endif |