3 #includeonce( "hll.hhf" )
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;
21 current_state : dword;
25 procedure smtpfsm_advance
31 @external( "smtpfsm_advance" );
33 procedure quit_callback
38 @external( "quit_callback" );
46 @external( "helo_enter" );
54 @external( "mail_enter" );
62 @external( "rcpt_enter" );
70 @external( "data_enter" );
78 @external( "quit_enter" );
80 procedure smtpfsm_advance
86 begin smtpfsm_advance;
92 mov( (type myfsm [ebx]).current_state, eax );
94 switch ( eax ) case ( STATE_INIT )
96 if ( ecx == EVENT_HELO ) then
97 mov( STATE_HELO, (type myfsm [ebx]).current_state );
98 helo_enter ( event, STATE_INIT, ctx );
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 );
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 );
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 );
129 if ( ecx == EVENT_END_DATA ) then
130 mov( STATE_MAIL, (type myfsm [ebx]).current_state );
131 mail_enter ( event, STATE_DATA, ctx );
137 //myfsm_adv( fsm, event, ctx );