Patch from David Waite:
[ragel.git] / test / forder1.rl
blob9873af41230fba0dbb772b51a038bfcecfb33ed7
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 cs 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         if ( fsm->cs == forder_error )
48                 return -1;
49         if ( fsm->cs >= forder_first_final )
50                 return 1;
51         return 0;
54 struct forder fsm;
56 void test( char *buf )
58         int len = strlen(buf);
59         forder_init( &fsm );
60         forder_execute( &fsm, buf, len );
61         if ( forder_finish( &fsm ) > 0 )
62                 printf("ACCEPT\n");
63         else
64                 printf("FAIL\n");
67 int main()
69         test( "ab\n");
70         test( "abx\n");
71         test( "" );
73         test(
74                 "ab\n"
75                 "fail after newline\n"
76         );
78         return 0;
81 #ifdef _____OUTPUT_____
82 finish a
83 leave a
84 enter b1
85 enter b2
86 ACCEPT
87 finish a
88 leave a
89 enter b1
90 enter b2
91 FAIL
92 FAIL
93 finish a
94 leave a
95 enter b1
96 enter b2
97 FAIL
98 #endif