summaryrefslogtreecommitdiff
path: root/agen5/pseudo-fsm.h
diff options
context:
space:
mode:
Diffstat (limited to 'agen5/pseudo-fsm.h')
-rw-r--r--agen5/pseudo-fsm.h227
1 files changed, 227 insertions, 0 deletions
diff --git a/agen5/pseudo-fsm.h b/agen5/pseudo-fsm.h
new file mode 100644
index 0000000..338022f
--- /dev/null
+++ b/agen5/pseudo-fsm.h
@@ -0,0 +1,227 @@
+/* -*- buffer-read-only: t -*- vi: set ro:
+ *
+ * DO NOT EDIT THIS FILE (pseudo-fsm.h)
+ *
+ * It has been AutoGen-ed August 11, 2012 at 09:41:36 AM by AutoGen 5.16.2pre7
+ * From the definitions pseudo.def
+ * and the template file fsm
+ *
+ * Automated Finite State Machine
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name ``Bruce Korb'' nor the name of any other
+ * contributor may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * AutoFSM IS PROVIDED BY Bruce Korb ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL Bruce Korb OR ANY OTHER CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * This file enumerates the states and transition events for a FSM.
+ *
+ * te_pm_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_pm_event
+ * The transition events. These enumerate the event values used
+ * to select the next state from the current state.
+ * PM_EV_INVALID is always defined at the end.
+ */
+#ifndef AUTOFSM_PSEUDO_FSM_H_GUARD
+#define AUTOFSM_PSEUDO_FSM_H_GUARD 1
+
+/*
+ * Finite State machine States
+ *
+ * Count of non-terminal states. The generated states INVALID and DONE
+ * are terminal, but INIT is not :-).
+ */
+#define PM_STATE_CT 5
+typedef enum {
+ PM_ST_INIT, PM_ST_ST_MARK, PM_ST_AGEN, PM_ST_TEMPL,
+ PM_ST_END_MARK, PM_ST_INVALID, PM_ST_DONE
+} te_pm_state;
+
+/*
+ * Finite State machine transition Events.
+ *
+ * Count of the valid transition events
+ */
+#define PM_EVENT_CT 7
+typedef enum {
+ PM_EV_ED_MODE, PM_EV_MARKER, PM_EV_END_PSEUDO, PM_EV_AUTOGEN,
+ PM_EV_TEMPLATE, PM_EV_SUFFIX, PM_EV_SCHEME, PM_EV_INVALID
+} te_pm_event;
+
+/*
+ * Enumeration of the valid transition types
+ * Some transition types may be common to several transitions.
+ */
+typedef enum {
+ PM_TR_INIT_MARKER,
+ PM_TR_INVALID,
+ PM_TR_NOOP,
+ PM_TR_SKIP_ED_MODE,
+ PM_TR_TEMPL_MARKER,
+ PM_TR_TEMPL_SCHEME,
+ PM_TR_TEMPL_SUFFIX
+} te_pm_trans;
+#define PM_TRANSITION_CT 7
+
+/**
+ * State transition handling map. Map the state enumeration and the event
+ * enumeration to the new state and the transition enumeration code (in that
+ * order). It is indexed by first the current state and then the event code.
+ */
+typedef struct pm_transition t_pm_transition;
+struct pm_transition {
+ te_pm_state next_state;
+ te_pm_trans transition;
+};
+
+#ifndef DEFINE_FSM
+extern const t_pm_transition pm_trans_table[ PM_STATE_CT ][ PM_EVENT_CT ];
+
+extern int
+pm_invalid_transition( te_pm_state st, te_pm_event evt );
+#else
+const t_pm_transition
+pm_trans_table[ PM_STATE_CT ][ PM_EVENT_CT ] = {
+
+ /* STATE 0: PM_ST_INIT */
+ { { PM_ST_INIT, PM_TR_SKIP_ED_MODE }, /* EVT: -*- */
+ { PM_ST_ST_MARK, PM_TR_INIT_MARKER }, /* EVT: MARKER */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: END_PSEUDO */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: AUTOGEN */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: TEMPLATE */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: SUFFIX */
+ { PM_ST_INVALID, PM_TR_INVALID } /* EVT: SCHEME */
+ },
+
+
+ /* STATE 1: PM_ST_ST_MARK */
+ { { PM_ST_ST_MARK, PM_TR_SKIP_ED_MODE }, /* EVT: -*- */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: MARKER */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: END_PSEUDO */
+ { PM_ST_AGEN, PM_TR_NOOP }, /* EVT: AUTOGEN */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: TEMPLATE */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: SUFFIX */
+ { PM_ST_INVALID, PM_TR_INVALID } /* EVT: SCHEME */
+ },
+
+
+ /* STATE 2: PM_ST_AGEN */
+ { { PM_ST_AGEN, PM_TR_SKIP_ED_MODE }, /* EVT: -*- */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: MARKER */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: END_PSEUDO */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: AUTOGEN */
+ { PM_ST_TEMPL, PM_TR_NOOP }, /* EVT: TEMPLATE */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: SUFFIX */
+ { PM_ST_INVALID, PM_TR_INVALID } /* EVT: SCHEME */
+ },
+
+
+ /* STATE 3: PM_ST_TEMPL */
+ { { PM_ST_TEMPL, PM_TR_SKIP_ED_MODE }, /* EVT: -*- */
+ { PM_ST_END_MARK, PM_TR_TEMPL_MARKER }, /* EVT: MARKER */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: END_PSEUDO */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: AUTOGEN */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: TEMPLATE */
+ { PM_ST_TEMPL, PM_TR_TEMPL_SUFFIX }, /* EVT: SUFFIX */
+ { PM_ST_TEMPL, PM_TR_TEMPL_SCHEME } /* EVT: SCHEME */
+ },
+
+
+ /* STATE 4: PM_ST_END_MARK */
+ { { PM_ST_END_MARK, PM_TR_INVALID }, /* EVT: -*- */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: MARKER */
+ { PM_ST_DONE, PM_TR_NOOP }, /* EVT: END_PSEUDO */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: AUTOGEN */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: TEMPLATE */
+ { PM_ST_INVALID, PM_TR_INVALID }, /* EVT: SUFFIX */
+ { PM_ST_INVALID, PM_TR_INVALID } /* EVT: SCHEME */
+ }
+};
+#define PmFsmErr_off 19
+#define PmEvInvalid_off 75
+#define PmStInit_off 83
+
+
+static char const zPmStrings[169] =
+/* 0 */ "** OUT-OF-RANGE **\0"
+/* 19 */ "FSM Error: in state %d (%s), event %d (%s) is invalid\n\0"
+/* 75 */ "invalid\0"
+/* 83 */ "init\0"
+/* 88 */ "st_mark\0"
+/* 96 */ "agen\0"
+/* 101 */ "templ\0"
+/* 107 */ "end_mark\0"
+/* 116 */ "-*-\0"
+/* 120 */ "marker\0"
+/* 127 */ "end_pseudo\0"
+/* 138 */ "autogen\0"
+/* 146 */ "template\0"
+/* 155 */ "suffix\0"
+/* 162 */ "scheme";
+
+static const size_t aszPmStates[5] = {
+ 83, 88, 96, 101, 107 };
+
+static const size_t aszPmEvents[8] = {
+ 116, 120, 127, 138, 146, 155, 162, 75 };
+
+
+#define PM_EVT_NAME(t) ( (((unsigned)(t)) >= 8) \
+ ? zPmStrings : zPmStrings + aszPmEvents[t])
+
+#define PM_STATE_NAME(s) ( (((unsigned)(s)) >= 5) \
+ ? zPmStrings : zPmStrings + aszPmStates[s])
+
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+static int pm_invalid_transition( te_pm_state st, te_pm_event evt );
+
+/* * * * * * * * * THE CODE STARTS HERE * * * * * * * *
+ *
+ * Print out an invalid transition message and return EXIT_FAILURE
+ */
+static int
+pm_invalid_transition( te_pm_state st, te_pm_event evt )
+{
+ /* START == INVALID TRANS MSG == DO NOT CHANGE THIS COMMENT */
+ char const * fmt = zPmStrings + PmFsmErr_off;
+ fprintf( stderr, fmt, st, PM_STATE_NAME(st), evt, PM_EVT_NAME(evt));
+ /* END == INVALID TRANS MSG == DO NOT CHANGE THIS COMMENT */
+
+ return EXIT_FAILURE;
+}
+
+#endif /* DEFINE_FSM */
+
+#endif /* AUTOFSM_PSEUDO_FSM_H_GUARD */
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * end of pseudo-fsm.h */