void cmd_resolve_backspace(struct cmd_vty *vty) { int i, size; // no more to delete if (vty->cur_pos <= 0) return; size = vty->used_len - vty->cur_pos; CMD_DBGASSERT(size >= 0, "cmd_resolve_backspace"); // delete char vty->cur_pos--; vty->used_len--; cmd_back_one(); // print left chars memcpy(&vty->buffer[vty->cur_pos], &vty->buffer[vty->cur_pos + 1], size); vty->buffer[vty->used_len] = '\0'; for (i = 0; i < size; i ++) cmd_put_one(vty->buffer[vty->cur_pos + i]); cmd_put_one(' '); for (i = 0; i < size + 1; i++) cmd_back_one(); }
void cmd_resolve_insert(struct cmd_vty *vty) { int i, size; // no more to insert if (vty->used_len >= vty->buf_len) return; size = vty->used_len - vty->cur_pos; debug_print_ex(CMD_DEBUG_TYPE_INFO,"\r\nused_len=%d, pos=%d\r\n",vty->used_len, vty->cur_pos); CMD_DBGASSERT(size >= 0, "cmd_resolve_insert"); memcpy(&vty->buffer[vty->cur_pos + 1], &vty->buffer[vty->cur_pos], size); vty->buffer[vty->cur_pos] = vty->c; #if 0 /* BEGIN: del by weizengke, 2013/11/17 */ /* BEGIN: Added by weizengke, 2013/10/4 PN:bug for continue tab */ vty->buffer[vty->cur_pos + 1] = '\0'; /* END: Added by weizengke, 2013/10/4 PN:None */ /* END: del by weizengke, 2013/11/17 */ #endif // print left chars, then back size for (i = 0; i < size + 1; i++) cmd_put_one(vty->buffer[vty->cur_pos + i]); for (i = 0; i < size; i++) cmd_back_one(); vty->cur_pos++; vty->used_len++; }
/***************************************************************************** 函 数 名 : cmd_resolve_delete 功能描述 : 适配Delete键,向前删除字符 输入参数 : struct cmd_vty *vty 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年11月17日 作 者 : weizengke 修改内容 : 新生成函数 *****************************************************************************/ void cmd_resolve_delete(struct cmd_vty *vty) { int i, size; // no more to delete if (vty->cur_pos >= vty->used_len) return; /* del the current char*/ printf(" \b"); size = vty->used_len - vty->cur_pos; CMD_DBGASSERT(size >= 0, "cmd_resolve_delete"); memcpy(&vty->buffer[vty->cur_pos], &vty->buffer[vty->cur_pos + 1], size); vty->buffer[vty->used_len - 1] = '\0'; /* output the right chars */ for (i = 0; i < size; i ++) cmd_put_one(vty->buffer[vty->cur_pos + i]); vty->used_len--; /* back the cur_pos */ for (i = 0; i < size; i++) cmd_back_one(); }
void cmd_resolve_right(struct cmd_vty *vty) { // already at rightmost, cannot move more if (vty->cur_pos >= vty->used_len) return; // move right one step cmd_put_one(vty->buffer[vty->cur_pos]); vty->cur_pos++; }
/* Note: Added by weizengke, 2013/10 clear current line by cur-pos */ void cmd_clear_line(struct cmd_vty *vty) { int size = vty->used_len - vty->cur_pos; CMD_DBGASSERT(size >= 0, "cmd_clear_line"); while (size--) { cmd_put_one(' '); } while (vty->used_len) { vty->used_len--; cmd_back_one(); cmd_put_one(' '); cmd_back_one(); } memset(vty->buffer, 0, HISTORY_MAX_SIZE); }
/* ------------------ 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; }