sync/gen_statemachine.ysl2
author Volker Birk <vb@pep-project.org>
Fri, 01 Jul 2016 08:51:17 +0200
changeset 782 663f1d2c2f19
parent 743 e4b613ebac2f
child 807 a33a5f760372
permissions -rw-r--r--
fixing for Windoze
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@711
    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@743
    33
            invalid_state = -2,
vb@743
    34
            invalid_event = -3
vb@609
    35
        } fsm_error;
vb@583
    36
vb@609
    37
        // states
vb@578
    38
vb@609
    39
        typedef enum _«@name»_state {
vb@743
    40
            «@name»_state_NONE = -1,
vb@623
    41
        `` for "func:distinctName(state)" |> «@name»`if "position()!=last()" > , `
vb@609
    42
        } «@name»_state;
vb@583
    43
vb@609
    44
        // events
vb@578
    45
vb@609
    46
        typedef enum _«@name»_event {
vb@743
    47
            «@name»_event_NONE = -1,
vb@711
    48
        ||
vb@711
    49
        for "func:distinctName(state/event[not(not(/protocol/fsm/tag/@name=@name))])" {
vb@711
    50
            const "name", "@name";
vb@711
    51
            |> «$name» = «/protocol/fsm/tag[@name=$name]/@id»,
vb@711
    52
        }
vb@711
    53
        for "func:distinctName(state/event[not(/protocol/fsm/tag/@name=@name)])"
vb@711
    54
            |> «@name»`if "position()!=last()" > , `
vb@711
    55
        ||
vb@609
    56
        } «@name»_event;
vb@583
    57
vb@609
    58
        // actions
vb@582
    59
vb@690
    60
        `` const "name", "@name"
vb@690
    61
        `` for "func:distinctName(//action)" | PEP_STATUS «@name»(PEP_SESSION session, «$name»_state state, const Identity partner);
Edouard@605
    62
vb@626
    63
        // state machine
vb@626
    64
vb@626
    65
        «@name»_state fsm_«@name»(
vb@627
    66
                PEP_SESSION session,
vb@626
    67
                «@name»_state state,
vb@626
    68
                «@name»_event event,
vb@690
    69
                const Identity partner,
vb@690
    70
                «@name»_state state_partner
vb@626
    71
            );
vb@626
    72
vb@609
    73
        // driver
Edouard@605
    74
vb@782
    75
        DYNAMIC_API PEP_STATUS fsm_«@name»_inject(
vb@690
    76
                PEP_SESSION session,
vb@690
    77
                «@name»_event event,
vb@690
    78
                Identity partner,
vb@690
    79
                «@name»_state state_partner
vb@690
    80
            );
Edouard@605
    81
vb@654
    82
        #ifdef __cplusplus
vb@654
    83
        }
vb@654
    84
        #endif
vb@654
    85
vb@609
    86
        ||
vb@711
    87
        }
vb@690
    88
        document "../src/sync_driver.c", "text"
vb@690
    89
        ||
vb@690
    90
        // Driver for «@name» state machine
vb@690
    91
vb@690
    92
        #include <assert.h>
vb@690
    93
        #include "pEp_internal.h"
vb@690
    94
vb@690
    95
vb@743
    96
        DYNAMIC_API PEP_STATUS fsm_«@name»_inject(
vb@690
    97
                PEP_SESSION session,
vb@690
    98
                «@name»_event event,
vb@690
    99
                Identity partner,
vb@690
   100
                «@name»_state state_partner
vb@690
   101
            )
vb@690
   102
        {
vb@690
   103
            PEP_STATUS status = PEP_STATUS_OK;
vb@690
   104
vb@690
   105
            session->sync_state = fsm_«@name»(session, session->sync_state,
vb@690
   106
                    event, partner, state_partner);
vb@690
   107
vb@690
   108
            return status;
vb@690
   109
        }
vb@690
   110
vb@690
   111
        ||
vb@609
   112
        ||
vb@609
   113
        #include "sync_fsm.h"
vb@609
   114
vb@609
   115
        // state machine for «@name»
vb@609
   116
vb@609
   117
        «@name»_state fsm_«@name»(
vb@627
   118
                PEP_SESSION session,
vb@609
   119
                «@name»_state state,
vb@609
   120
                «@name»_event event,
vb@690
   121
                const Identity partner,
vb@690
   122
                «@name»_state state_partner
vb@609
   123
            )
vb@609
   124
        {
vb@609
   125
            switch (state) {
vb@609
   126
                `` apply "state"
vb@609
   127
                default:
vb@743
   128
                    return («@name»_state) invalid_state;
vb@609
   129
            }
vb@609
   130
vb@609
   131
            return state;
vb@577
   132
        }
vb@582
   133
vb@609
   134
        ||
vb@577
   135
    }
vb@577
   136
vb@580
   137
    template "state"
vb@577
   138
    ||
vb@577
   139
    case «@name»:
vb@578
   140
        switch (event) {
vb@578
   141
        `` apply "event", 2
vb@578
   142
        default:
vb@743
   143
            return («../@name»_state) invalid_event;
vb@578
   144
        }
vb@577
   145
        break;
vb@577
   146
vb@577
   147
    ||
vb@578
   148
vb@578
   149
    template "event"
vb@578
   150
    ||
vb@578
   151
    case «@name»:
vb@578
   152
    `` apply "action|transition";
vb@582
   153
    `` if "name(*[position()=last()]) != 'transition'" |> break;
vb@578
   154
    ||
vb@578
   155
vb@582
   156
    template "action" {
vb@582
   157
        indent(0);
vb@690
   158
        > «@name»(session, state, 
vb@582
   159
        choose {
vb@582
   160
            when "parm" > «name(parm/*)»
vb@582
   161
            otherwise > NULL
vb@582
   162
        }
vb@582
   163
        > );\n
vb@582
   164
    }
vb@582
   165
vb@578
   166
    template "transition" | return «@target»;
vb@577
   167
}
vb@577
   168