Graphviz presentation of SMTP test FSM
[hlafsm.git] / fsm.hhf
blobd44e6294477ecd78bd482664bb5b7e45473368d4
2 #if( ! @defined( fsm_hhf ))
3 ?fsm_hhf := true;
5 #includeonce( "hla.hhf" )
8 type
9         myfsm : record
10                 current_state : dword;
11         endrecord;
13 #macro fsm_callback ( _cbfunc_, _extname_ ) ;
15 procedure _cbfunc_
17         ev : dword;
18         old_state : dword;
19         ctx : dword
20 );      @cdecl;
21         @external( _extname_ );
23 #endmacro
25 #macro fsm_callback2 ( _cbfunc_, _extname_ ) ;
27 procedure _cbfunc_
29         ev : dword;
30         ctx : dword
31 );      @cdecl;
32         @external( _extname_ );
34 #endmacro
36 #macro fsm_start ( _fsm_, _advance_func_, _ext_ ) :
37         _fsm_end_;
39 ?_state_id_ := 0;
40 ?_event_ := 0;
42 #print ( "digraph myfsm_mindrot_org {" )
43 #print ( "      rankdir = LR;" )
45 procedure _advance_func_
47         var fsm : myfsm;
48         ev : dword;
49         ctx : dword
50 );      @cdecl;
51         @external( _ext_ );
53 #keyword init_state ( _state_ ) ;
55         const _state_ := 0;
56         ?_state_id_ := _state_id_ + 1;
59 #print ( "      node [shape = doublecircle];" )
60 #print ( "      ", @string:_state_, " ;" )
62 #keyword state ( _state_ ) ;
64         const _state_ := _state_id_;
65         ?_state_id_ := _state_id_ + 1;
67 #print ( "      node [shape = circle];" )
68 #print ( "      ", @string:_state_, " ;" )
70 #keyword event ( _ev_ ) ;
72         const _ev_ := _event_;
73         ?_event_ := _event_ + 1;
75 #keyword fsm_advance ;
77 procedure _advance_func_
79         var fsm : myfsm;
80         ev : dword;
81         ctx : dword
83 begin _advance_func_;
85         push ( eax );
86         push ( ebx );
87         push ( ecx );
88         push ( edx );
90         mov ( fsm, ebx );
91         mov ( (type myfsm [ebx]).current_state, eax );
93         mov ( ev, ecx );
95         mov ( ctx, edx );
97 #keyword tr ( _state_, _ev_, _new_state_, _cbfunc_ ) :
98         _tr_end_;
100 #print ( "      ", @string:_state_, " -> ", @string:_new_state_ )
101 #print (  "             [ label = """, @string:_ev_, """];" )
103         cmp ( eax, _state_ );
104         jnz _tr_end_;
106         cmp ( ecx, _ev_ );
107         jnz _tr_end_;
109         mov ( _new_state_, eax );
111         mov ( eax, (type myfsm [ebx]).current_state );
113         push ( edx );
114         push ( eax );
115         push ( ecx );
116         call ( _cbfunc_ );
117         jmp _fsm_end_;
119 _tr_end_:
121 #keyword tr2 ( _state_, _ev_, _new_state_, _cbfunc_ ) :
122         _tr2_end_;
124 #print ( "      ", @string:_state_, " -> ", @string:_new_state_ )
125 #print (  "             [ label = """, @string:_ev_, """];" )
127         cmp ( eax, _state_ );
128         jnz _tr2_end_;
130         cmp ( ecx, _ev_ );
131         jnz _tr2_end_;
133         mov ( eax, (type myfsm [ebx]).current_state );
135         push ( edx ); // _ctx_
136         push ( ecx ); // _ev_
137         call ( _cbfunc_ ); // _cb_func_ ( _ev_, _ctx_ );
138         jmp _fsm_end_;
140 _tr2_end_:
142 #terminator end_fsm;
144 _fsm_end_:
146         pop ( edx );
147         pop ( ecx );
148         pop ( ebx );
149         pop ( eax );
151 end _advance_func_;
153 #print ( "}" )
155 #endmacro
157 #endif