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