⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsm-trans.tpl

📁 MSYS在windows下模拟了一个类unix的终端
💻 TPL
字号:
[= AutoGen5 Template  -*- Mode: Text -*-#  AutoGen copyright 1992-2002 Bruce Korb=][=DEFINE state-table  =]  { [=  (shellf "state=%s" (string-upcase! (get "state"))) =][=  FOR event "\n    "  =][=    IF (first-for?)   =][=       (set! fmt (shellf "eval echo \\\"\\$FSM_TRANS_${state}_%s,\\\""                 (string-upcase! (get "event"))  ))       (sprintf "%-47s /* %s state */" fmt (get "state")) =][=    ELSE     =][=       (shellf "eval echo \\\"\\$FSM_TRANS_${state}_%s%s\\\""                 (string-upcase! (get "event"))                 (if (not (last-for?)) "," "")) =][=    ENDIF    =][=  ENDFOR     =] }[=ENDDEF       =][=# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=DEFINE  enumerate-transitions   =]/* *  Enumeration of the valid transition types *  Some transition types may be common to several transitions. */typedef enum {[=(string-upcase! (shellf "sed '$s/,$//;s/^/    %s_TR_/' .fsm.xlist" PFX))=]} te_[=(. pfx)=]_trans;#define [=(. PFX)=]_TRANSITION_CT  [=   `tct="\`wc -l < .fsm.xlist\`"   echo $tct`=]/* *  the state transition handling map *  This table maps the state enumeration + the event enumeration to *  the new state and the transition enumeration code (in that order). *  It is indexed by first the current state and then the event code. */typedef struct transition t_transition;struct transition {    te_[=(. pfx)=]_state  next_state;    te_[=(. pfx)=]_trans  transition;};[=  IF (exist? "use_ifdef")=]#ifndef DEFINE_FSMextern const t_transition [=(. pfx)=]_trans_table[ [=(. PFX)=]_STATE_CT ][ [=(. PFX)=]_EVENT_CT ];extern int[=(. pfx)=]_invalid_transition( te_[=(. pfx)=]_state st, te_[=  (. pfx)=]_event evt );#else[=  ELSE=]static [=  ENDIF=]const t_transition[=(. pfx)=]_trans_table[ [=(. PFX)=]_STATE_CT ][ [=(. PFX)=]_EVENT_CT ] = {[=  state-table    state = init =][=  FOR state      =],[=  state-table  =][=  ENDFOR         =]};[=  IF (exist? "use_ifdef") =][=  emit-invalid-msg =]#endif /* DEFINE_FSM */[=  ENDIF      =][=ENDDEF       =][=# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=DEFINE callback-transitions=]/* *  This is the prototype for the callback routines.  They are to *  return the next state.  Normally, that should be the value of *  the "maybe_next" argument. */typedef te_[=(. pfx)=]_state ([=(. pfx)=]_callback_t)([=    emit-cookie-args =]    te_[=(. pfx)=]_state initial,    te_[=(. pfx)=]_state maybe_next,    te_[=(. pfx)=]_event trans_evt );static [=(. pfx)=]_callback_t[=(shellf "sed '$s/,$/;/;s/^/    %s_do_/' .fsm.xlist" pfx)=]/* *  This declares all the state transition handling routines */typedef struct transition t_transition;struct transition {[=    (set! fmt (sprintf "\n    %%-%ds %%s;"                (+ (string-length pfx) 14) ))    (sprintf (string-append fmt fmt)             (string-append "te_" pfx "_state") "next_state"             (string-append pfx "_callback_t*") "trans_proc") =]};/* *  This table maps the state enumeration + the event enumeration to *  the new state and the transition enumeration code (in that order). *  It is indexed by first the current state and then the event code. */static const t_transition[=(. pfx)=]_trans_table[ [=(. PFX)=]_STATE_CT ][ [=(. PFX)=]_EVENT_CT ] = {[=  state-table    state = init =][=  FOR state      =],[=    state-table  =][=  ENDFOR         =]};[=ENDDEF       =][=# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=DEFINE machine-step  =][=  (if (=* (get "method") "case")      (begin (define trans-name "trans")             (define trans-field "transition")             (define trans-valu (string-append PFX "_TR_INVALID"))  )      (begin (define trans-name "pT   ")             (define trans-field "trans_proc")             (define trans-valu (string-append pfx "_do_invalid"))  ))=]    if (trans_evt >= [=(. PFX)=]_EV_INVALID) {        nxtSt = [=(. PFX)=]_ST_INVALID;        [=(. trans-name)=] = [=(. trans-valu)=];    } else {        const t_transition* pTT = [=(. pfx)=]_trans_table[ [=(. pfx)                                  =]_state ] + trans_evt;        nxtSt = firstNext = pTT->next_state;        [=(. trans-name)=] = pTT->[=(. trans-field)=];    }#ifdef DEBUG    printf( "in state %s(%d) step %s(%d) to %s(%d)\n",            [=(. PFX)=]_STATE_NAME( [=(. pfx)=]_state ), [=(. pfx)=]_state,            [=(. PFX)=]_EVT_NAME( trans_evt ), trans_evt,            [=(. PFX)=]_STATE_NAME( nxtSt ), nxtSt );#endif[=  IF (=* (get "method") "case")  =][=    run-switch    =][=  ELSE            =][=    run-callback  =][=  ENDIF=]#ifdef DEBUG    if (nxtSt != firstNext)        printf( "transition code changed destination state to %s(%d)\n",                [=(. PFX)=]_STATE_NAME( nxtSt ), nxtSt );#endif[=  IF (not (=* (get "type") "reent")) =]    [=(. pfx)=]_state = nxtSt;[=  ENDIF  =][=ENDDEF  machine-step     =][=# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=DEFINE fsm-proc-variables  =]    te_[=(. pfx)=]_state nxtSt, firstNext;[=    IF (=* (get "method") "call")  =]    [=(. pfx)=]_callback_t* pT;[=    ELSE  =]    te_[=(. pfx)=]_trans trans;[=    ENDIF =][=ENDDEF       =][=# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=DEFINE make-loop-proc  =]/* *  Run the FSM.  Will return [=(. PFX)=]_ST_DONE or [=(. PFX)=]_ST_INVALID */[=mode=]te_[=(. pfx)=]_state[=(. pfx)=]_run_fsm([=  IF (exist? "cookie") =][=    FOR cookie "," =]    [=cookie=][=    ENDFOR=][=  ELSE=] void[=ENDIF=] )[=ENDDEF make-loop-proc  =][=DEFINE looping-machine  =][= make-loop-proc mode = "" =]{    te_[=(. pfx)=]_state [=(. pfx)=]_state = [=(. PFX)=]_ST_INIT;    te_[=(. pfx)=]_event trans_evt;[=    fsm-proc-variables  =]    while ([=(. pfx)=]_state < [=(. PFX)=]_ST_INVALID) {[=(extract fsm-source "        /* %s == FIND TRANSITION == %s */" ""           "        trans_evt = GET_NEXT_TRANS();" )=][=  (out-push-new ".fsm.cktbl")=][=    machine-step =][=    (out-pop)    (shell "sed 's/^ /     /;s/                /            /' .fsm.cktbl") =]    }    return [=(. pfx)=]_state;}[=ENDDEF       =][=# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # =][=DEFINE make-step-proc  =]/* *  Step the FSM.  Returns the resulting state.  If the current state is *  [=(. PFX)=]_ST_DONE or [=(. PFX)=]_ST_INVALID, it resets to *  [=(. PFX)=]_ST_INIT and returns [=(. PFX)=]_ST_INIT. */[=mode=]te_[=(. pfx)=]_state[=(. pfx)=]_step([=  IF (=* (get "type") "reent") =]    te_[= (. pfx) =]_state [= (. pfx) =]_state,[=  ENDIF  =]    te_[= (. pfx) =]_event trans_evt[=  FOR cookie =],    [=cookie=][=  ENDFOR=] )[=ENDDEF make-step-proc  =][=DEFINE stepping-machine  =][= make-step-proc mode = "" =]{[=    fsm-proc-variables  =]    if ((unsigned)[=(. pfx)=]_state >= [=(. PFX)=]_ST_INVALID) {[=  IF (=* (get "type") "step") =]        [=(. pfx)=]_state = [=(. PFX)=]_ST_INIT;[=  ENDIF  =]        return [=(. PFX)=]_ST_INIT;    }[=  machine-step =][=(extract fsm-source "    /* %s == FINISH STEP == %s */")=]    return nxtSt;}[=ENDDEF       =]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -