The runtests script was improved so that the Java and Ruby test cases don't
[external/ragel.git] / test / forder2.rl
1 /*
2  * @LANG: c
3  */
4
5 #include <stdio.h>
6 #include <string.h>
7
8 /*
9  * After the fact start and ending transitions. Behaves like constructors of
10  * and destructors in c++.
11  */
12
13 struct forder
14 {
15         int cs;
16 };
17
18 %%{
19         machine forder;
20         variable curstate fsm->cs;
21
22         inner = 'inner'
23                 >{printf("enter inner\n");}
24                 ${printf("inside inner\n");}
25                 %{printf("leave inner\n");}
26         ;
27
28         outter = inner
29                 >{printf("enter outter\n");}
30                 ${printf("inside outter\n");}
31                 %{printf("leave outter\n");}
32         ;
33
34         main := outter . '\n';
35 }%%
36
37 %% write data;
38
39 void forder_init( struct forder *fsm )
40 {
41         %% write init;
42 }
43
44 void forder_execute( struct forder *fsm, const char *_data, int _len )
45 {
46         const char *p = _data;
47         const char *pe = _data+_len;
48
49         %% write exec;
50 }
51
52 int forder_finish( struct forder *fsm )
53 {
54         %% write eof;
55
56         if ( fsm->cs == forder_error )
57                 return -1;
58         if ( fsm->cs >= forder_first_final )
59                 return 1;
60         return 0;
61 }
62
63 struct forder fsm;
64
65 void test( char *buf )
66 {
67         int len = strlen( buf );
68         forder_init( &fsm );
69         forder_execute( &fsm, buf, len );
70         if ( forder_finish( &fsm ) > 0 )
71                 printf("ACCEPT\n");
72         else
73                 printf("FAIL\n");
74 }
75
76
77 int main()
78 {
79         test( "inner\n");
80
81         test(
82                 "inner\n"
83                 "foobar\n"
84         );
85
86         test( "" );
87         test( "\n" );
88         test( "inn\n" );
89
90         return 0;
91 }
92
93 #ifdef _____OUTPUT_____
94 enter outter
95 enter inner
96 inside inner
97 inside outter
98 inside inner
99 inside outter
100 inside inner
101 inside outter
102 inside inner
103 inside outter
104 inside inner
105 inside outter
106 leave inner
107 leave outter
108 ACCEPT
109 enter outter
110 enter inner
111 inside inner
112 inside outter
113 inside inner
114 inside outter
115 inside inner
116 inside outter
117 inside inner
118 inside outter
119 inside inner
120 inside outter
121 leave inner
122 leave outter
123 FAIL
124 FAIL
125 FAIL
126 enter outter
127 enter inner
128 inside inner
129 inside outter
130 inside inner
131 inside outter
132 inside inner
133 inside outter
134 FAIL
135 #endif