void cmd_read(struct cmd_vty *vty) { int key_type; g_InputMachine_prev = CMD_KEY_CODE_NOTCARE; g_InputMachine_now = CMD_KEY_CODE_NOTCARE; while ((vty->c = cmd_getch()) != EOF) { /* step 1: get input key type */ key_type = cmd_resolve(vty->c); g_InputMachine_now = key_type; if (key_type <= CMD_KEY_CODE_NONE || key_type > CMD_KEY_CODE_NOTCARE) { debug_print_ex(CMD_DEBUG_TYPE_ERROR, "Unidentify Key Type, c = %c, key_type = %d\n", vty->c, key_type); continue; } /* step 2: take actions according to input key */ key_resolver[key_type].key_func(vty); g_InputMachine_prev = g_InputMachine_now; if (g_InputMachine_now != CMD_KEY_CODE_TAB) { memset(g_tabString,0,sizeof(g_tabString)); memset(g_tabbingString,0,sizeof(g_tabbingString)); g_tabStringLenth = 0; } } }
/* ------------------ Interface Function ----------------- */ int cmd_resolve(char c) { int key_type = CMD_KEY_CODE_NOTCARE; // default is not special key switch (c) { case CMD_KEY_ARROW1: c = cmd_getch(); #ifdef _LINUX_ if (c == CMD_KEY_ARROW2) { c = cmd_getch(); #endif switch (c) { case CMD_KEY_UP: key_type = CMD_KEY_CODE_UP; break; case CMD_KEY_DOWN: key_type = CMD_KEY_CODE_DOWN; break; case CMD_KEY_RIGHT: key_type = CMD_KEY_CODE_RIGHT; break; case CMD_KEY_LEFT: key_type = CMD_KEY_CODE_LEFT; break; case CMD_KEY_DELETE: key_type = CMD_KEY_CODE_DELETE; break; /* BEGIN: Added by weizengke, 2014/4/6 support page up & down*/ case CMD_KEY_PGUP: { ::SendMessage(g_hWnd,WM_VSCROLL,MAKEWPARAM(SB_PAGEUP, 0),NULL); /* int nVertSP = GetScrollPos(g_hWnd, SB_VERT); SetScrollPos(g_hWnd, SB_VERT, nVertSP, 1); */ key_type = CMD_KEY_CODE_FILTER; } break; case CMD_KEY_PHDN: { ::SendMessage(g_hWnd,WM_VSCROLL,MAKEWPARAM(SB_PAGEDOWN, 0),NULL); key_type = CMD_KEY_CODE_FILTER; } break; /* END: Added by weizengke, 2014/4/6 */ default: key_type = CMD_KEY_CODE_FILTER; break; } #ifdef _LINUX_ } #endif break; #ifndef _LINUX_ /* windwos */ case CMD_KEY_ARROW2: c = cmd_getch(); switch (c) { case CMD_KEY_UP: key_type = CMD_KEY_CODE_UP; break; case CMD_KEY_DOWN: key_type = CMD_KEY_CODE_DOWN; break; case CMD_KEY_RIGHT: key_type = CMD_KEY_CODE_RIGHT; break; case CMD_KEY_LEFT: key_type = CMD_KEY_CODE_LEFT; break; default: key_type = CMD_KEY_CODE_FILTER; break; } break; #endif case CMD_KEY_BACKSPACE: /* */ key_type = CMD_KEY_CODE_BACKSPACE; break; case CMD_KEY_SPACE: case CMD_KEY_CTRL_H: /* Linux 下空格后回车无法tab补全与'?'联想 待修复*/ break; case CMD_KEY_CTRL_W: /* del the last elem */ key_type = CMD_KEY_CODE_DEL_LASTWORD; break; case '\t': key_type = CMD_KEY_CODE_TAB; break; case '\r': case '\n': key_type = CMD_KEY_CODE_ENTER; break; case '?': /* BEGIN: Added by weizengke, 2013/10/4 PN:need print '?' */ cmd_put_one('?'); /* END: Added by weizengke, 2013/10/4 PN:need print '?' */ key_type = CMD_KEY_CODE_QUEST; break; default: /* BEGIN: Added by weizengke, 2014/4/6 filter CTRL+a ~ z */ if (c >= 0x1 && c <= 0x1d) { key_type = CMD_KEY_CODE_FILTER; } /* END: Added by weizengke, 2014/4/6 */ break; } return key_type; }