summaryrefslogtreecommitdiff
path: root/agen5/fsm.tpl
diff options
context:
space:
mode:
Diffstat (limited to 'agen5/fsm.tpl')
-rw-r--r--agen5/fsm.tpl207
1 files changed, 207 insertions, 0 deletions
diff --git a/agen5/fsm.tpl b/agen5/fsm.tpl
new file mode 100644
index 0000000..8039776
--- /dev/null
+++ b/agen5/fsm.tpl
@@ -0,0 +1,207 @@
+[= AutoGen5 Template -*- Mode: text -*-
+
+h=%s-fsm.h
+
+c=%s-fsm.c
+
+# Time-stamp: "2011-06-03 12:10:58 bkorb"
+
+## This file is part of AutoGen.
+## Copyright (c) 1992-2012 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 <http://www.gnu.org/licenses/>.
+##
+## NB: THIS FILE IS GPL. THE OUTPUT OF THIS FILE IS LICENSED MBSD.
+
+(setenv "SHELL" "/bin/sh")
+
+=]
+[=
+
+CASE (suffix) =][=
+
+== h =][=
+
+ (define fmt "")
+ (define fsm-ver "0.1") =][=
+ INCLUDE "fsm-trans.tlib" =][=
+ INCLUDE "fsm-macro.tlib" =][=
+
+ 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")=]
+[=
+
+FOR extra-header "\n" \=]
+#include "[=extra-header=]"[=
+ENDFOR
+
+=]
+/*
+ * 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 {
+[=
+ (shell (string-append
+ "${CLexe-columns} --spread=1 -I4 -S, -f'" PFX "_ST_%s' <<_EOF_
+INIT
+" (stack-up "state") "
+INVALID
+DONE
+_EOF_" )) =]
+} 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 (stack-up "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 <stdio.h>
+[=IF (exist? "handler-file")=]
+#define FSM_USER_HEADERS
+#include "[= handler-file =]"
+#undef FSM_USER_HEADERS[=
+ ELSE =]
+/*
+ * 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 */")=][=
+ ENDIF =]
+
+#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") =][=
+
+ IF (exist? "handler-file") =]
+#define FSM_HANDLER_CODE
+#include "[= handler-file =]"
+#undef FSM_HANDLER_CODE
+[=
+ ELSE =][=
+ INVOKE callbacks =][=
+ ENDIF =][=
+
+ ELSE =][=
+ 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) ;; agen5/fsm.tpl =] */