-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfsm.h
More file actions
63 lines (44 loc) · 1.27 KB
/
fsm.h
File metadata and controls
63 lines (44 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#ifndef __FSM_H
#define __FSM_H
#include <stdint.h>
#define FSM_DECLARE(name, initial) \
typedef enum { \
initial##__ST = 0
#define FSM_DECLARE_END(name) \
, name##__ST_FINAL \
} name##__fsm__t ; \
static name##__fsm__t name##__fsm__var = 0; \
#define FSM_STATE_DECL(name) ,name##__ST
#define FSM_BEGIN(name, n) { \
name##__fsm__t fsmlocal = name##__fsm__var; \
const name##__fsm__t fsmfinal = name##__ST_FINAL; \
static name##__fsm__t fsmstack[n] = { 0 }; \
static name##__fsm__t *fsmstackp = &fsmstack[0]; \
switch(fsmlocal) { \
#define FSM_STACK_PUSH(n) *fsmstackp++ = (n)
#define FSM_STACK_POP() *(--fsmstackp)
#define FSM_STATE_BEGIN(name) \
case name##__ST: { \
#define FSM_NEXT_STATE (fsmlocal+1)
#define FSM_CURRENT_STATE (fsmlocal)
#define FSM_FINAL_STATE (fsmfinal)
#define FSM_RESET(n) n##__fsm__var = 0
#define FSM_STATE_ENDS(nxt) \
fsmlocal = nxt##__ST; \
break; \
} \
#define FSM_STATE_END(nxt) \
fsmlocal = (nxt); \
break; \
} \
#define FSM_NEXT() fsmlocal++;
#define FSM_S(n) n##__ST
#define FSM_TRANS(v) \
fsmlocal = v; \
#define FSM_END(name) \
} \
name##__fsm__var = fsmlocal; \
} \
#define FSM_SET_STATE(f, name) f##__fsm__var = name##__ST
#define FSM_GET_STATE(f) f##__fsm__var
#endif