1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2019-2022 Red Hat, Inc. Daniel Bristot de Oliveira  <bristot@kernel.org>
4 *
5 * Deterministic automata helper functions, to be used with the automata
6 * models in C generated by the dot2k tool.
7 */
8
9/*
10 * DECLARE_AUTOMATA_HELPERS - define a set of helper functions for automata
11 *
12 * Define a set of helper functions for automata. The 'name' argument is used
13 * as suffix for the functions and data. These functions will handle automaton
14 * with data type 'type'.
15 */
16#define DECLARE_AUTOMATA_HELPERS(name, type)					\
17										\
18/*										\
19 * model_get_state_name_##name - return the (string) name of the given state	\
20 */ 										\
21static char *model_get_state_name_##name(enum states_##name state)		\
22{										\
23	if ((state < 0) || (state >= state_max_##name))				\
24		return "INVALID";						\
25										\
26	return automaton_##name.state_names[state];				\
27}										\
28										\
29/*										\
30 * model_get_event_name_##name - return the (string) name of the given event	\
31 */										\
32static char *model_get_event_name_##name(enum events_##name event)		\
33{										\
34	if ((event < 0) || (event >= event_max_##name))				\
35		return "INVALID";						\
36										\
37	return automaton_##name.event_names[event];				\
38}										\
39										\
40/*										\
41 * model_get_initial_state_##name - return the automaton's initial state		\
42 */										\
43static inline type model_get_initial_state_##name(void)				\
44{										\
45	return automaton_##name.initial_state;					\
46}										\
47										\
48/*										\
49 * model_get_next_state_##name - process an automaton event occurrence		\
50 *										\
51 * Given the current state (curr_state) and the event (event), returns		\
52 * the next state, or INVALID_STATE in case of error.				\
53 */										\
54static inline type model_get_next_state_##name(enum states_##name curr_state,	\
55					       enum events_##name event)	\
56{										\
57	if ((curr_state < 0) || (curr_state >= state_max_##name))		\
58		return INVALID_STATE;						\
59										\
60	if ((event < 0) || (event >= event_max_##name))				\
61		return INVALID_STATE;						\
62										\
63	return automaton_##name.function[curr_state][event];			\
64}										\
65										\
66/*										\
67 * model_is_final_state_##name - check if the given state is a final state	\
68 */										\
69static inline bool model_is_final_state_##name(enum states_##name state)	\
70{										\
71	if ((state < 0) || (state >= state_max_##name))				\
72		return 0;							\
73										\
74	return automaton_##name.final_states[state];				\
75}
76