Graphviz presentation of SMTP test FSM
[hlafsm.git] / test / smtp-manual.hla
blob7a61ff9dd263460d33799aa8d23759f03f563531
1 unit SMTP1unit;
3 #includeonce( "hll.hhf" )
5 const STATE_INIT := 0;
6 const STATE_HELO := 1;
7 const STATE_MAIL := 2;
8 const STATE_RCPT := 3;
9 const STATE_DATA := 4;
10 const STATE_QUIT := 5;
12 const EVENT_HELO := 0;
13 const EVENT_MAIL := 1;
14 const EVENT_QUIT := 2;
15 const EVENT_RCPT := 3;
16 const EVENT_DATA := 4;
17 const EVENT_END_DATA := 5;
19 type
20         myfsm : record
21                 current_state : dword;
22         endrecord;
25 procedure smtpfsm_advance
27         var fsm : myfsm;
28         event : dword;
29         ctx : dword
30 );      @cdecl;
31         @external( "smtpfsm_advance" );
33 procedure quit_callback
35         ev : dword;
36         ctx : dword
37 );      @cdecl;
38         @external( "quit_callback" );
40 procedure helo_enter
42         ev : dword;
43         old_state : dword;
44         ctx : dword
45 );      @cdecl;
46         @external( "helo_enter" );
48 procedure mail_enter
50         ev : dword;
51         old_state : dword;
52         ctx : dword
53 );      @cdecl;
54         @external( "mail_enter" );
56 procedure rcpt_enter
58         ev : dword;
59         old_state : dword;
60         ctx : dword
61 );      @cdecl;
62         @external( "rcpt_enter" );
64 procedure data_enter
66         ev : dword;
67         old_state : dword;
68         ctx : dword
69 );      @cdecl;
70         @external( "data_enter" );
72 procedure quit_enter
74         ev : dword;
75         old_state : dword;
76         ctx : dword
77 );      @cdecl;
78         @external( "quit_enter" );
80 procedure smtpfsm_advance
82         var fsm : myfsm;
83         event : dword;
84         ctx : dword
86 begin smtpfsm_advance;
87         push( eax );
88         push( ebx );
89         push( ecx );
91         mov( fsm, ebx );
92         mov( (type myfsm [ebx]).current_state, eax );
94         switch ( eax ) case ( STATE_INIT )
95                 mov( event, ecx );
96                 if ( ecx == EVENT_HELO ) then
97                         mov( STATE_HELO, (type myfsm [ebx]).current_state );
98                         helo_enter ( event, STATE_INIT, ctx );
99                 endif;
100         case ( STATE_HELO )
101                 mov( event, ecx );
102                 if ( ecx == EVENT_MAIL ) then
103                         mov( STATE_MAIL, (type myfsm [ebx]).current_state );
104                         mail_enter ( event, STATE_HELO, ctx );
105                 elseif ( ecx == EVENT_QUIT ) then
106                         mov( STATE_QUIT, (type myfsm [ebx]).current_state );
107                         quit_callback ( event, ctx );
108                 endif;
109         case ( STATE_MAIL )
110                 mov( event, ecx );
111                 if ( ecx == EVENT_RCPT ) then
112                         mov( STATE_RCPT, (type myfsm [ebx]).current_state );
113                         rcpt_enter ( event, STATE_MAIL, ctx );
114                 elseif ( ecx == EVENT_QUIT ) then
115                         mov( STATE_QUIT, (type myfsm [ebx]).current_state );
116                         quit_callback ( event, ctx );
117                 endif;
118         case ( STATE_RCPT )
119                 mov( event, ecx );
120                 if ( ecx == EVENT_DATA ) then
121                         mov( STATE_DATA, (type myfsm [ebx]).current_state );
122                         data_enter ( event, STATE_RCPT, ctx );
123                 elseif ( ecx == EVENT_QUIT ) then
124                         mov( STATE_QUIT, eax );
125                         quit_callback ( event, ctx );
126                 endif;
127         case ( STATE_DATA )
128                 mov( event, ecx );
129                 if ( ecx == EVENT_END_DATA ) then
130                         mov( STATE_MAIL, (type myfsm [ebx]).current_state );
131                         mail_enter ( event, STATE_DATA, ctx );
132                 endif;
133         // default
134                 // ...
135         endswitch;
137         //myfsm_adv( fsm, event, ctx );
139         pop( ecx );
140         pop( ebx );
141         pop( eax );
142 end smtpfsm_advance;
144 end SMTP1unit;