sync/gen_statemachine.ysl2
author Edouard Tisserant
Thu, 12 May 2016 12:58:40 +0200
changeset 610 1e3d39516f43
parent 609 a22a400611ca
child 617 0caa732cf9a4
permissions -rw-r--r--
Sync : Moved decode/encode to separate target file(s)
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 {
Edouard@605
    10
vb@609
    11
    template "/protocol/fsm" {
vb@609
    12
        document "../src/sync_fsm.h", "text"
vb@609
    13
        ||
vb@609
    14
        #pragma once
vb@577
    15
vb@609
    16
        // state machine for «@name»
vb@577
    17
vb@609
    18
        #include "pEpEngine.h"
vb@608
    19
vb@609
    20
        // types
Edouard@605
    21
vb@609
    22
        typedef pEp_identity * Identity;
vb@609
    23
        typedef union _param { const Identity partner; const stringlist_t *keylist; } param_t;
vb@583
    24
vb@609
    25
        // error values
vb@577
    26
vb@609
    27
        typedef enum _fsm_error {
vb@609
    28
            invalid_state = -1,
vb@609
    29
            invalid_event = -2
vb@609
    30
        } fsm_error;
vb@583
    31
vb@609
    32
        // states
vb@578
    33
vb@609
    34
        typedef enum _«@name»_state {
vb@609
    35
        `` for "set:distinct(state/@name)" |> «.»`if "position()!=last()" > , `
vb@609
    36
        } «@name»_state;
vb@583
    37
vb@609
    38
        // events
vb@578
    39
vb@609
    40
        typedef enum _«@name»_event {
vb@609
    41
        `` for "set:distinct(state/event/@name)" |> «.»`if "position()!=last()" > , `
vb@609
    42
        } «@name»_event;
vb@583
    43
vb@609
    44
        // actions
vb@582
    45
vb@609
    46
        `` for "set:distinct(state/event//action/@name)" | void «.»(const Identity partner);
Edouard@605
    47
vb@609
    48
        // driver
Edouard@605
    49
vb@609
    50
        void fsm_«@name»_inject(PEP_SESSION session, «@name»_event event);
Edouard@605
    51
vb@609
    52
        ||
vb@609
    53
        ||
vb@609
    54
        #include "sync_fsm.h"
vb@609
    55
vb@609
    56
        // state machine for «@name»
vb@609
    57
vb@609
    58
        «@name»_state fsm_«@name»(
vb@609
    59
                «@name»_state state,
vb@609
    60
                «@name»_event event,
vb@609
    61
                const Identity partner
vb@609
    62
            )
vb@609
    63
        {
vb@609
    64
            switch (state) {
vb@609
    65
                `` apply "state"
vb@609
    66
                default:
vb@609
    67
                    return invalid_state;
vb@609
    68
            }
vb@609
    69
vb@609
    70
            return state;
vb@577
    71
        }
vb@582
    72
vb@609
    73
        ||
vb@577
    74
    }
vb@577
    75
vb@580
    76
    template "state"
vb@577
    77
    ||
vb@577
    78
    case «@name»:
vb@578
    79
        switch (event) {
vb@578
    80
        `` apply "event", 2
vb@578
    81
        default:
vb@578
    82
            return invalid_event;
vb@578
    83
        }
vb@577
    84
        break;
vb@577
    85
vb@577
    86
    ||
vb@578
    87
vb@578
    88
    template "event"
vb@578
    89
    ||
vb@578
    90
    case «@name»:
vb@578
    91
    `` apply "action|transition";
vb@582
    92
    `` if "name(*[position()=last()]) != 'transition'" |> break;
vb@578
    93
    ||
vb@578
    94
vb@582
    95
    template "action" {
vb@582
    96
        indent(0);
vb@582
    97
        > «@name»(
vb@582
    98
        choose {
vb@582
    99
            when "parm" > «name(parm/*)»
vb@582
   100
            otherwise > NULL
vb@582
   101
        }
vb@582
   102
        > );\n
vb@582
   103
    }
vb@582
   104
vb@578
   105
    template "transition" | return «@target»;
vb@577
   106
}
vb@577
   107