sync/gen_statemachine.ysl2
author Volker Birk <vb@pep-project.org>
Tue, 10 May 2016 17:11:24 +0200
changeset 589 bdff8843f086
parent 583 2392a33ae121
child 605 70e80b27b624
permissions -rw-r--r--
const pEp_identity *
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@583
    16
    // error values
vb@583
    17
vb@578
    18
    typedef enum _fsm_error {
vb@578
    19
        invalid_state = -1,
vb@578
    20
        invalid_event = -2
vb@578
    21
    } fsm_error;
vb@577
    22
vb@583
    23
    // states
vb@583
    24
vb@578
    25
    typedef enum _«@name»_state {
vb@580
    26
    `` for "set:distinct(state/@name)" |> «.»`if "position()!=last()" > , `
vb@578
    27
    } «@name»_state;
vb@578
    28
vb@583
    29
    // events
vb@583
    30
vb@578
    31
    typedef enum _«@name»_event {
vb@580
    32
    `` for "set:distinct(state/event/@name)" |> «.»`if "position()!=last()" > , `
vb@578
    33
    } «@name»_event;
vb@578
    34
vb@583
    35
    // actions
vb@583
    36
vb@589
    37
    `` for "set:distinct(state/event//action/@name)" | void «.»(const pEp_identity *partner);
vb@582
    38
vb@583
    39
    // state machine
vb@583
    40
vb@582
    41
    «@name»_state fsm_«@name»(
vb@582
    42
            «@name»_state state,
vb@582
    43
            «@name»_event event,
vb@589
    44
            const pEp_identity *partner
vb@582
    45
        )
vb@577
    46
    {
vb@577
    47
        switch (state) {
vb@580
    48
            `` apply "state"
vb@578
    49
            default:
vb@578
    50
                return invalid_state;
vb@577
    51
        }
vb@582
    52
vb@582
    53
        return state;
vb@577
    54
    }
vb@577
    55
vb@577
    56
    ||
vb@577
    57
vb@580
    58
    template "state"
vb@577
    59
    ||
vb@577
    60
    case «@name»:
vb@578
    61
        switch (event) {
vb@578
    62
        `` apply "event", 2
vb@578
    63
        default:
vb@578
    64
            return invalid_event;
vb@578
    65
        }
vb@577
    66
        break;
vb@577
    67
vb@577
    68
    ||
vb@578
    69
vb@578
    70
    template "event"
vb@578
    71
    ||
vb@578
    72
    case «@name»:
vb@578
    73
    `` apply "action|transition";
vb@582
    74
    `` if "name(*[position()=last()]) != 'transition'" |> break;
vb@578
    75
    ||
vb@578
    76
vb@582
    77
    template "action" {
vb@582
    78
        indent(0);
vb@582
    79
        > «@name»(
vb@582
    80
        choose {
vb@582
    81
            when "parm" > «name(parm/*)»
vb@582
    82
            otherwise > NULL
vb@582
    83
        }
vb@582
    84
        > );\n
vb@582
    85
    }
vb@582
    86
vb@578
    87
    template "transition" | return «@target»;
vb@577
    88
}
vb@577
    89