sync/gen_statemachine.ysl2
author Volker Birk <vb@pep-project.org>
Wed, 18 May 2016 12:54:22 +0200
changeset 654 0aa96447e38f
parent 627 ef1fdfde8ced
child 690 3ae86b68fdfe
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@623
    10
    include ./functions.ysl2
Edouard@605
    11
vb@609
    12
    template "/protocol/fsm" {
vb@609
    13
        document "../src/sync_fsm.h", "text"
vb@609
    14
        ||
vb@609
    15
        #pragma once
vb@577
    16
vb@609
    17
        // state machine for «@name»
vb@577
    18
vb@609
    19
        #include "pEpEngine.h"
vb@654
    20
        
vb@654
    21
        #ifdef __cplusplus
vb@654
    22
        extern "C" {
vb@654
    23
        #endif
vb@608
    24
vb@609
    25
        // types
Edouard@605
    26
vb@609
    27
        typedef pEp_identity * Identity;
vb@609
    28
        typedef union _param { const Identity partner; const stringlist_t *keylist; } param_t;
vb@583
    29
vb@609
    30
        // error values
vb@577
    31
vb@609
    32
        typedef enum _fsm_error {
vb@609
    33
            invalid_state = -1,
vb@609
    34
            invalid_event = -2
vb@609
    35
        } fsm_error;
vb@583
    36
vb@609
    37
        // states
vb@578
    38
vb@609
    39
        typedef enum _«@name»_state {
vb@623
    40
        `` for "func:distinctName(state)" |> «@name»`if "position()!=last()" > , `
vb@609
    41
        } «@name»_state;
vb@583
    42
vb@609
    43
        // events
vb@578
    44
vb@609
    45
        typedef enum _«@name»_event {
vb@623
    46
        `` for "func:distinctName(state/event)" |> «@name»`if "position()!=last()" > , `
vb@609
    47
        } «@name»_event;
vb@583
    48
vb@609
    49
        // actions
vb@582
    50
vb@627
    51
        `` for "func:distinctName(//action)" | PEP_STATUS «@name»(PEP_SESSION session, const Identity partner);
Edouard@605
    52
vb@626
    53
        // state machine
vb@626
    54
vb@626
    55
        «@name»_state fsm_«@name»(
vb@627
    56
                PEP_SESSION session,
vb@626
    57
                «@name»_state state,
vb@626
    58
                «@name»_event event,
vb@626
    59
                const Identity partner
vb@626
    60
            );
vb@626
    61
vb@609
    62
        // driver
Edouard@605
    63
vb@623
    64
        PEP_STATUS fsm_«@name»_inject(PEP_SESSION session, «@name»_event event);
Edouard@605
    65
vb@654
    66
        #ifdef __cplusplus
vb@654
    67
        }
vb@654
    68
        #endif
vb@654
    69
vb@609
    70
        ||
vb@609
    71
        ||
vb@609
    72
        #include "sync_fsm.h"
vb@609
    73
vb@609
    74
        // state machine for «@name»
vb@609
    75
vb@609
    76
        «@name»_state fsm_«@name»(
vb@627
    77
                PEP_SESSION session,
vb@609
    78
                «@name»_state state,
vb@609
    79
                «@name»_event event,
vb@609
    80
                const Identity partner
vb@609
    81
            )
vb@609
    82
        {
vb@609
    83
            switch (state) {
vb@609
    84
                `` apply "state"
vb@609
    85
                default:
vb@609
    86
                    return invalid_state;
vb@609
    87
            }
vb@609
    88
vb@609
    89
            return state;
vb@577
    90
        }
vb@582
    91
vb@609
    92
        ||
vb@577
    93
    }
vb@577
    94
vb@580
    95
    template "state"
vb@577
    96
    ||
vb@577
    97
    case «@name»:
vb@578
    98
        switch (event) {
vb@578
    99
        `` apply "event", 2
vb@578
   100
        default:
vb@578
   101
            return invalid_event;
vb@578
   102
        }
vb@577
   103
        break;
vb@577
   104
vb@577
   105
    ||
vb@578
   106
vb@578
   107
    template "event"
vb@578
   108
    ||
vb@578
   109
    case «@name»:
vb@578
   110
    `` apply "action|transition";
vb@582
   111
    `` if "name(*[position()=last()]) != 'transition'" |> break;
vb@578
   112
    ||
vb@578
   113
vb@582
   114
    template "action" {
vb@582
   115
        indent(0);
vb@627
   116
        > «@name»(session, 
vb@582
   117
        choose {
vb@582
   118
            when "parm" > «name(parm/*)»
vb@582
   119
            otherwise > NULL
vb@582
   120
        }
vb@582
   121
        > );\n
vb@582
   122
    }
vb@582
   123
vb@578
   124
    template "transition" | return «@target»;
vb@577
   125
}
vb@577
   126