Use the new import feature of Ragel for bringing in defines from the parser
[ragel.git] / test / forder1.rl
bloba6366cb32ae779ef30564aa463c6f8c06c788938
1 /*
2  * @LANG: c
3  */
5 #include <stdio.h>
6 #include <string.h>
8 struct forder 
10         int cs;
13 %%{
14         machine forder;
15         variable curstate fsm->cs;
17         second = 'b'
18                 >{printf("enter b1\n");}
19                 >{printf("enter b2\n");}
20         ;
22         first = 'a'
23                 %{printf("leave a\n");}
24                 @{printf("finish a\n");}
25         ;
27         main := first . second . '\n';
28 }%%
30 %% write data;
32 void forder_init( struct forder *fsm )
34         %% write init;
37 void forder_execute( struct forder *fsm, const char *_data, int _len )
39         const char *p = _data;
40         const char *pe = _data+_len;
42         %% write exec;
45 int forder_finish( struct forder *fsm )
47         %% write eof;
49         if ( fsm->cs == forder_error )
50                 return -1;
51         if ( fsm->cs >= forder_first_final )
52                 return 1;
53         return 0;
56 struct forder fsm;
58 void test( char *buf )
60         int len = strlen(buf);
61         forder_init( &fsm );
62         forder_execute( &fsm, buf, len );
63         if ( forder_finish( &fsm ) > 0 )
64                 printf("ACCEPT\n");
65         else
66                 printf("FAIL\n");
69 int main()
71         test( "ab\n");
72         test( "abx\n");
73         test( "" );
75         test(
76                 "ab\n"
77                 "fail after newline\n"
78         );
80         return 0;
83 #ifdef _____OUTPUT_____
84 finish a
85 leave a
86 enter b1
87 enter b2
88 ACCEPT
89 finish a
90 leave a
91 enter b1
92 enter b2
93 FAIL
94 FAIL
95 finish a
96 leave a
97 enter b1
98 enter b2
99 FAIL
100 #endif