/* mrr1stat.h -- file containing definitions of states used
 *  to drive the FSA that processes terminal characters.
 */

typedef struct StateStruct {
    unsigned char inchar;
    unsigned char action;
    struct StateStruct *nextstate;
} TypeState;

typedef struct KeyStruct {
    unsigned char keycode;
    char *outseq;
} TypeKey;

#define CL_ESC '\033'
#define CL_DIGIT  128
#define CL_PRINT  129

#define ACT_DO_NOTHING     1
#define ACT_START_NUM      2
#define ACT_ADD_UP         3
#define ACT_END_NUM        4
#define ACT_GO_TO          5
#define ACT_INIT_ESC       6
#define ACT_CR             7
#define ACT_LF             8
#define ACT_PRINT          9
#define ACT_CLEAR         10
#define ACT_RIGHT         11
#define ACT_LEFT          12
#define ACT_UP            13
#define ACT_DOWN          14
#define ACT_EREOL         15
#define ACT_GRAPHIC_REND  16

#define MAX_ESC_NUM    10

int EscNum[MAX_ESC_NUM];
int EscNumIndex;

extern TypeState TermSt_Begin[], TermSt_Esc[], TermSt_LeftBracket[];
extern TypeState TermSt_Digits[], TermSt_Semi[];

TypeState TermSt_Begin[] = {
    CL_ESC, ACT_INIT_ESC,   TermSt_Esc,
     '\r',  ACT_CR,         TermSt_Begin,
     '\n',  ACT_LF,         TermSt_Begin,
    '\10', ACT_LEFT,       TermSt_Begin,
       0,   ACT_PRINT,      TermSt_Begin
};

TypeState TermSt_Esc[] = {
    CL_ESC, ACT_DO_NOTHING, TermSt_Esc,
    '[',    ACT_DO_NOTHING, TermSt_LeftBracket,
    0,      ACT_DO_NOTHING, TermSt_Begin
};

TypeState TermSt_LeftBracket[] = {
    CL_DIGIT, ACT_START_NUM,   TermSt_Digits,
    'J',      ACT_CLEAR,       TermSt_Begin,
    'f',      ACT_GO_TO,       TermSt_Begin,
    'K',      ACT_EREOL,       TermSt_Begin,
    'C',      ACT_RIGHT,       TermSt_Begin,
    'A',      ACT_UP,          TermSt_Begin,
    'm',      ACT_GRAPHIC_REND,TermSt_Begin,
    0,        ACT_DO_NOTHING,  TermSt_Begin
};

TypeState TermSt_Digits[] = {
    CL_DIGIT, ACT_ADD_UP,      TermSt_Digits ,
    'H',      ACT_GO_TO,       TermSt_Begin,
    'f',      ACT_GO_TO,       TermSt_Begin,
    'J',      ACT_CLEAR,       TermSt_Begin,
    'm',      ACT_GRAPHIC_REND,TermSt_Begin,
    ';',      ACT_END_NUM,     TermSt_Semi,
    0,        ACT_DO_NOTHING,  TermSt_Begin
};

TypeState TermSt_Semi[]  =  {
    CL_DIGIT, ACT_START_NUM,   TermSt_Digits,
    0,        ACT_DO_NOTHING,  TermSt_Begin

};

TypeKey KeySeqs[] = {
    VK_F1 ,   "\0331",
    VK_F2 ,   "\0332",
    VK_F3 ,   "\0333",
    VK_F4 ,   "\0334",
    VK_F5 ,   "\0335",
    VK_F6 ,   "\0336",
    VK_F7 ,   "\0337",
    VK_F8 ,   "\0338",
    VK_F9 ,   "\0339",
    VK_F10,   "\0330",
    VK_F11,   "\033-",
    VK_F12,   "\033=",
    VK_LEFT , "\033OD",
    VK_UP   , "\033OA",
    VK_BACK , "\033OD",
    VK_RIGHT, "\033OC",
    VK_DOWN , "\033OB",
    VK_NEXT , "\033OM",
    VK_END,   "\n",
    VK_DELETE,"\x7f",
    VK_INSERT,"\033On",

    0, ""
};
