Started on the frontend support for pointer-based length conditions.
[external/ragel.git] / test / forder1.rl
1 /*
2  * @LANG: c
3  */
4
5 #include <stdio.h>
6 #include <string.h>
7
8 struct forder 
9 {
10         int cs;
11 };
12
13 %%{
14         machine forder;
15         variable cs fsm->cs;
16
17         second = 'b'
18                 >{printf("enter b1\n");}
19                 >{printf("enter b2\n");}
20         ;
21
22         first = 'a'
23                 %{printf("leave a\n");}
24                 @{printf("finish a\n");}
25         ;
26
27         main := first . second . '\n';
28 }%%
29
30 %% write data;
31
32 void forder_init( struct forder *fsm )
33 {
34         %% write init;
35 }
36
37 void forder_execute( struct forder *fsm, const char *_data, int _len )
38 {
39         const char *p = _data;
40         const char *pe = _data+_len;
41
42         %% write exec;
43 }
44
45 int forder_finish( struct forder *fsm )
46 {
47         if ( fsm->cs == forder_error )
48                 return -1;
49         if ( fsm->cs >= forder_first_final )
50                 return 1;
51         return 0;
52 }
53
54 struct forder fsm;
55
56 void test( char *buf )
57 {
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");
65 }
66
67 int main()
68 {
69         test( "ab\n");
70         test( "abx\n");
71         test( "" );
72
73         test(
74                 "ab\n"
75                 "fail after newline\n"
76         );
77
78         return 0;
79 }
80
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