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/call3.rl | |
download | ragel-tarball-eafd7a3974e8605fd02794269db6114a3446e016.tar.gz |
ragel-6.9ragel-6.9
Diffstat (limited to 'test/call3.rl')
-rw-r--r-- | test/call3.rl | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/test/call3.rl b/test/call3.rl new file mode 100644 index 0000000..b19b96c --- /dev/null +++ b/test/call3.rl @@ -0,0 +1,122 @@ +/* + * @LANG: obj-c + */ + +#include <stdio.h> +#include <string.h> +#include <objc/Object.h> + + +int num = 0; + +@interface CallTest : Object +{ +@public + /* State machine operation data. */ + int cs, top, stack[32]; +}; + +// Initialize the machine. Invokes any init statement blocks. Returns 0 +// if the machine begins in a non-accepting state and 1 if the machine +// begins in an accepting state. +- (void) initFsm; + +// Execute the machine on a block of data. Returns -1 if after processing +// the data, the machine is in the error state and can never accept, 0 if +// the machine is in a non-accepting state and 1 if the machine is in an +// accepting state. +- (void) executeWithData:(const char *)data len:(int)len; + +// Indicate that there is no more data. Returns -1 if the machine finishes +// in the error state and does not accept, 0 if the machine finishes +// in any other non-accepting state and 1 if the machine finishes in an +// accepting state. +- (int) finish; + +@end + +@implementation CallTest + +%%{ + machine CallTest; + + action check_num { + if ( num & 1 ) + fcall odd; + else + fcall even; + } + + # Test call and return functionality. + even := 'even' any @{fhold; fret;}; + odd := 'odd' any @{fhold; fret;}; + num = [0-9]+ ${ num = num * 10 + (fc - '0'); }; + even_odd = num ' ' @check_num "\n"; + + # Test calls in out actions. + fail := !(any*); + out_acts = 'OA ok\n' | + 'OA error1\n' | + 'OA error2\n'; + + main := even_odd | out_acts; +}%% + +%% write data; + +- (void) initFsm; +{ + num = 0; + %% write init; +} + +- (void) executeWithData:(const char *)data len:(int)len; +{ + const char *p = data; + const char *pe = data + len; + %% write exec; +} + +- (int) finish; +{ + if ( cs == CallTest_error ) + return -1; + return ( cs >= CallTest_first_final ) ? 1 : 0; +} + +@end + +#define BUFSIZE 1024 + +void test( char *buf ) +{ + CallTest *test = [[CallTest alloc] init]; + [test initFsm]; + [test executeWithData:buf len:strlen(buf)]; + if ( [test finish] > 0 ) + printf( "ACCEPT\n" ); + else + printf( "FAIL\n" ); +} + +int main() +{ + test( "78 even\n" ); + test( "89 odd\n" ); + test( "1 even\n" ); + test( "0 odd\n" ); + test( "OA ok\n" ); + test( "OA error1\n" ); + test( "OA error2\n" ); + return 0; +} + +#ifdef _____OUTPUT_____ +ACCEPT +ACCEPT +FAIL +FAIL +ACCEPT +ACCEPT +ACCEPT +#endif |