sync/gen_statemachine.ysl2
author Volker Birk <vb@pep-project.org>
Thu, 05 May 2016 14:21:40 +0200
changeset 579 99a3e946928a
parent 578 b313077e13f2
child 580 99cd18ba8a1b
permissions -rw-r--r--
...
vb@577
     1
// generate state machine code
vb@577
     2
vb@577
     3
// Copyleft (c) 2016, p≡p foundation
vb@577
     4
vb@577
     5
// Written by Volker Birk
vb@577
     6
vb@577
     7
include yslt.yml2
vb@577
     8
vb@577
     9
tstylesheet {
vb@577
    10
    template "/protocol/fsm"
vb@577
    11
    ||
vb@577
    12
    // state machine for «@name»
vb@577
    13
vb@577
    14
    #include "pEpEngine.h"
vb@577
    15
vb@578
    16
    typedef enum _fsm_error {
vb@578
    17
        invalid_state = -1,
vb@578
    18
        invalid_event = -2
vb@578
    19
    } fsm_error;
vb@577
    20
vb@578
    21
    typedef enum _«@name»_state {
vb@578
    22
    `` apply "state", mode=declare
vb@578
    23
    } «@name»_state;
vb@578
    24
vb@578
    25
    typedef enum _«@name»_event {
vb@578
    26
    `` apply "state/event", mode=declare
vb@578
    27
    } «@name»_event;
vb@578
    28
vb@579
    29
    «@name»_state fsm_«@name»(«@name»_state state, «@name»_event event)
vb@577
    30
    {
vb@577
    31
        switch (state) {
vb@578
    32
            `` apply "state", mode=implement
vb@578
    33
            default:
vb@578
    34
                return invalid_state;
vb@577
    35
        }
vb@577
    36
    }
vb@577
    37
vb@577
    38
    ||
vb@577
    39
vb@578
    40
    template "state", mode=declare
vb@578
    41
        | «@name»`if "position()!=last()" > , `
vb@578
    42
vb@578
    43
    template "state", mode=implement
vb@577
    44
    ||
vb@577
    45
    case «@name»:
vb@578
    46
        switch (event) {
vb@578
    47
        `` apply "event", 2
vb@578
    48
        default:
vb@578
    49
            return invalid_event;
vb@578
    50
        }
vb@577
    51
        break;
vb@577
    52
vb@577
    53
    ||
vb@578
    54
vb@578
    55
    template "event", mode=declare
vb@578
    56
        | «@name»`if "position()!=last()" > , `
vb@578
    57
vb@578
    58
    template "event"
vb@578
    59
    ||
vb@578
    60
    case «@name»:
vb@578
    61
    `` apply "action|transition";
vb@578
    62
        break;
vb@578
    63
    ||
vb@578
    64
vb@578
    65
    template "action" | «@name»();
vb@578
    66
    template "transition" | return «@target»;
vb@577
    67
}
vb@577
    68