summaryrefslogtreecommitdiff
path: root/test/forder2.rl
blob: d92f888d00e03de16533cfac04b67aa72622f1f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * @LANG: c
 */

#include <stdio.h>
#include <string.h>

/*
 * After the fact start and ending transitions. Behaves like constructors of
 * and destructors in c++.
 */

struct forder
{
	int cs;
};

%%{
	machine forder;
	variable cs fsm->cs;

	inner = 'inner'
		>{printf("enter inner\n");}
		${printf("inside inner\n");}
		%{printf("leave inner\n");}
	;

	outter = inner
		>{printf("enter outter\n");}
		${printf("inside outter\n");}
		%{printf("leave outter\n");}
	;

	main := outter . '\n';
}%%

%% write data;

void forder_init( struct forder *fsm )
{
	%% write init;
}

void forder_execute( struct forder *fsm, const char *_data, int _len )
{
	const char *p = _data;
	const char *pe = _data+_len;

	%% write exec;
}

int forder_finish( struct forder *fsm )
{
	if ( fsm->cs == forder_error )
		return -1;
	if ( fsm->cs >= forder_first_final )
		return 1;
	return 0;
}

struct forder fsm;

void test( char *buf )
{
	int len = strlen( buf );
	forder_init( &fsm );
	forder_execute( &fsm, buf, len );
	if ( forder_finish( &fsm ) > 0 )
		printf("ACCEPT\n");
	else
		printf("FAIL\n");
}


int main()
{
	test( "inner\n");

	test(
		"inner\n"
		"foobar\n"
	);

	test( "" );
	test( "\n" );
	test( "inn\n" );

	return 0;
}

#ifdef _____OUTPUT_____
enter outter
enter inner
inside inner
inside outter
inside inner
inside outter
inside inner
inside outter
inside inner
inside outter
inside inner
inside outter
leave inner
leave outter
ACCEPT
enter outter
enter inner
inside inner
inside outter
inside inner
inside outter
inside inner
inside outter
inside inner
inside outter
inside inner
inside outter
leave inner
leave outter
FAIL
FAIL
FAIL
enter outter
enter inner
inside inner
inside outter
inside inner
inside outter
inside inner
inside outter
FAIL
#endif