[= AutoGen5 Template -*- Mode: text -*-
h=%s-fsm.h
c=%s-fsm.c
# Time-stamp: "2007-07-04 11:51:31 bkorb"
## This file is part of AutoGen.
## AutoGen copyright (c) 1992-2007 by Bruce Korb - all rights reserved
##
## AutoGen is free software: you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## AutoGen is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
## See the GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program. If not, see .
##
## NB: THIS FILE IS GPL. THE OUTPUT OF THIS FILE IS LICENSED MBSD.
(setenv "SHELL" "/bin/sh")
(define fmt "")
(shellf "test -f %1$s-fsm.h && mv -f %1$s-fsm.h .fsm.head
test -f %1$s-fsm.c && mv -f %1$s-fsm.c .fsm.code" (base-name))
(define add-cleanup (lambda (t)
(set! shell-cleanup (string-append shell-cleanup "\n" t "\n")) ))
(add-cleanup "rm -f .fsm.*")
=]
[=
CASE (suffix) =][=
== h =][=
INCLUDE "fsm-trans.tpl" =][=
INCLUDE "fsm-macro.tpl" =][=
INVOKE preamble
=]
/*
* This file enumerates the states and transition events for a FSM.
*
* te_[=(. pfx)=]_state
* The available states. FSS_INIT is always defined to be zero
* and FSS_INVALID and FSS_DONE are always made the last entries.
*
* te_[=(. pfx)=]_event
* The transition events. These enumerate the event values used
* to select the next state from the current state.
* [=(. PFX)=]_EV_INVALID is always defined at the end.
*/
[=(make-header-guard "autofsm")=]
/*
* Finite State machine States
*
* Count of non-terminal states. The generated states INVALID and DONE
* are terminal, but INIT is not :-).
*/
#define [=(. PFX)=]_STATE_CT [=(+ 1 (count "state"))=]
typedef enum {
[=
(shellf "${CLexe-columns} --spread=1 -I4 -S, -f'%s_ST_%%s' <<_EOF_
INIT
%s
INVALID
DONE
_EOF_" PFX (string-upcase! (join "\n" (stack "state"))) )=]
} te_[=(. pfx)=]_state;
/*
* Finite State machine transition Events.
*
* Count of the valid transition events
*/
#define [=(. PFX)=]_EVENT_CT [=(count "event")=]
typedef enum {
[= compute-transitions =][=
(shellf "${CLexe-columns} --spread=1 -I4 -S, -f'%s_EV_%%s' <<_EOF_
%s
INVALID
_EOF_" PFX (string-upcase! (join "\n" (stack "event"))) )=]
} te_[=(. pfx)=]_event;
[=
CASE method =][=
~* call|case =][=
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# We are implementing the machine. Declare the external =][=
CASE type =][=
~* step|reent =][= make-step-proc mode = "extern " =];[=
=* loop =][= make-loop-proc mode = "extern " =];[=
* =][=
(error (string-append "invalid FSM type: ``" (get "type")
"'' must be ``looping'', ``stepping'' or ``reentrant''" ))
=][=
ESAC =][=
# End external procedure declarations
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# We are *NOT* implementing the machine. Define the table =][=
== "" =][=
enumerate-transitions use_ifdef = yes =][=
=* no =][=
enumerate-transitions use_ifdef = yes =][=
* =][=
(error (sprintf
"invalid FSM method: ``%s'' must be ``callout'', ``case'' or ``none''"
(get "method"))) =][=
ESAC =]
#endif /* [=(. header-guard)=] */[=
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# C OUTPUT BEGINS HERE
#
=][=
== c =][=
(if (~ (get "method") "(no.*){0,1}")
(out-delete) ) =][=
INVOKE preamble
=]
#define DEFINE_FSM
#include "[=(. header-file)=]"
#include
/*
* Do not make changes to this file, except between the START/END
* comments, or it will be removed the next time it is generated.
*/
[=(extract fsm-source "/* %s === USER HEADERS === %s */")=]
#ifndef NULL
# define NULL 0
#endif
[= CASE method =][=
=* "case" =][= enumerate-transitions =][=
=* "call" =][= callback-transitions =][=
ESAC =]
[=IF (=* (get "type") "step")=]
/*
* The FSM machine state
*/
static te_[=(. pfx)=]_state [=(. pfx)=]_state = [=(. PFX)=]_ST_INIT;
[=ENDIF=]
[= emit-invalid-msg =][=
IF (=* (get "method") "call") =][=
`set -- \`sed 's/,//' .fsm.xlist\`` =][=
WHILE `echo $#` =][=
INVOKE build-callback
cb_prefix = (string-append pfx "_do")
cb_name = (shell "echo $1 ; shift") =][=
ENDWHILE echo $# =][=
ENDIF =][=
CASE type =][=
=* loop =][= looping-machine =][=
~* step|reent =][= stepping-machine =][=
ESAC =][=
ESAC (suffix)
=]
/*
* Local Variables:
* mode: C
* c-file-style: "stroustrup"
* indent-tabs-mode: nil
* End:
* end of [=(out-name)=] */