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

📄 fsm.c

📁 国外网站上的一些精典的C程序
💻 C
字号:
/* =======================================================================    FSM.c           Finite State machines.                    Version 0.22x, 93-08-05. _____              This version is Public Domain. /_|__|             A.Reitsma, Delft, Nederland./  | \  --------------------------------------------------------------- */#include <stdlib.h>#include "ll_defs.h"#include "fsm.h"/* tmp definitions until error module is finished */#define MEMORY      -1#define Error(x)    return x/*  --- Local definitions and data ------------------------------------ */struct state_info{    struct FSMstate_entry * table ;    int entries ;};static int state ;      /* the machine's state or it's maximum in setup */static struct state_info * info ;  /* derived info in a handier format  *//*  --- Setup and action functions ------------------------------------ */int FSMsetup( struct FSMstate_entry * StateEntry ){    struct FSMstate_entry * Entry = StateEntry ;    struct state_info * data ;    /*  Find 'highest' state number. Negative number is end of list.        Gaps allowed. Must be sorted on state number in current version.        Prepared for non-sorted version though.    */    state = 0 ;    do    {        if( state < Entry->state )            state = Entry->state ;    }while( (++Entry)->state >= 0 );    /*  Create info 'array'    */    if( NULL == (info = MALLOC( state+1, struct state_info )))        Error( MEMORY );    /*  Setup info 'array': split into sub-lists with size info.        First entry:    */    data = info ;    data->table = StateEntry ;    data->entries = 1 ;    /*  ... and the second and following entries:    */    while( (++StateEntry)->state >= 0 )    {        if( data->table->state == StateEntry->state )            data->entries ++ ;          /* same state */        else        {                               /* new state  */            data = info + StateEntry->state ;            data->table = StateEntry ;            data->entries = 1 ;        }    }    state = 0 ; /* initial state for state machine */    return 0 ;}int FSMaction( int Cond ){    int count ;    struct FSMstate_entry * Table = info[ state ].table ;    /*  Find matching condition in second or higher entry in table.    */    for( count = 1 ; count < info[ state ].entries ; count ++ )    {        Table ++;        if( Cond == Table->cond )        {            state = Table->next ;      /* match found: adjust state,    */                                       /* and execute non-NULL funtion. */            if( NULL != Table->action )                return Table->action( Cond );            else                return 0 ;        }    }    /*  No matching condition found: use first entry as default action.    */    Table = info[ state ].table ;    state = Table->next ;    return Table->action( Cond );}/* === FSM.c ========================================================== */

⌨️ 快捷键说明

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