/***************************************************************************** 函 数 名 : cmd_resolve_quest 功能描述 : 适配?字符,联想命令 输入参数 : struct cmd_vty *vty 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年11月17日 作 者 : weizengke 修改内容 : 新生成函数 1: 完全匹配输入时,只返回该命令的联想 2013-10-27 (未实现) 2:bug: display loopback disable loopback-detect >dis loop =======> show what *****************************************************************************/ void cmd_resolve_quest(struct cmd_vty *vty) { cmd_vector_t *v; struct para_desc *match[CMD_MAX_MATCH_SIZE]; // matched string int match_size = 0; int i = 0; int nomath_pos = -1; /* 1: 取pos 之前的buf 2: 需要覆盖当前光标后的buf */ /* BEGIN: Added by weizengke, 2013/11/17 bug for left and tab*/ memset(&(vty->buffer[vty->cur_pos]), 0 ,strlen(vty->buffer) - vty->cur_pos); vty->used_len = strlen(vty->buffer); /* END: Added by weizengke, 2013/11/17 */ v = str2vec(vty->buffer); if (v == NULL) { v = cmd_vector_init(1); cmd_vector_insert_cr(v); } else if (isspace((int)vty->buffer[vty->used_len - 1])) { cmd_vector_insert_cr(v); } cmd_complete_command(v, vty, match, &match_size, &nomath_pos); cmd_outstring("%s", CMD_ENTER); if (match_size) { for (i = 0; i < match_size; i++) { cmd_outstring(" %-25s%s\r\n", match[i]->para,match[i]->desc); } cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); } else { cmd_output_missmatch(vty, nomath_pos); cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); } cmd_vector_deinit(v, 0); }
/* Note: Added by weizengke, 2013/10 output current command-buf */ void cmd_outcurrent() { int i; if (NULL == vty) { return ; } cmd_outstring("%s", CMD_ENTER); cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); /* BEGIN: Added by weizengke, 2014/3/23 support delete word form cur_pos */ for (i = 0; i < strlen(vty->buffer) - vty->cur_pos; i++) { cmd_back_one(); } /* END: Added by weizengke, 2014/3/23 */ }
/***************************************************************************** 函 数 名 : cmd_resolve_del_lastword 功能描述 : 适配CTRL_W键,快速删除最后一个命令字 输入参数 : struct cmd_vty *vty 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年11月17日 作 者 : weizengke 修改内容 : 新生成函数 *****************************************************************************/ void cmd_resolve_del_lastword(struct cmd_vty *vty) { int i, size; // no more to delete if (vty->cur_pos <= 0) return; cmd_delete_word_ctrl_W_ex(vty); cmd_outstring("%s", CMD_ENTER); cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); /* BEGIN: Added by weizengke, 2014/3/23 support delete word form cur_pos*/ for (i = 0; i < strlen(vty->buffer) - vty->cur_pos; i++) { cmd_back_one(); } /* END: Added by weizengke, 2014/3/23 */ }
/***************************************************************************** 函 数 名 : cmd_resolve_enter 功能描述 : 适配回车执行命令行 输入参数 : struct cmd_vty *vty 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年11月17日 作 者 : weizengke 修改内容 : 新生成函数 bugs: 1: display loopback-detect brief display loopback brief <Jungle-config>dis loop brief Command 'dis loop brief ' anbigous follow: brief brief <Jungle-config> 2: display loopback-detect brief display loopback brief disable loopback-detect <Jungle-config>dis loopback Command 'dis loopback' anbigous follow: loopback loopback-detect <Jungle-config> *****************************************************************************/ void cmd_resolve_enter(struct cmd_vty *vty) { struct para_desc *match[CMD_MAX_MATCH_SIZE]; // matched string int match_size = 0; int match_type = CMD_NO_MATCH; cmd_vector_t *v; int i = 0; int nomath_pos = -1; //printf("enter(%d %d %s)\r\n", vty->used_len, vty->buf_len, vty->buffer); v = str2vec(vty->buffer); if (v == NULL) { cmd_outstring("%s", CMD_ENTER); cmd_outprompt(vty->prompt); return; } /* BEGIN: Added by weizengke, 2013/10/5 PN:for cmd end with <CR> */ cmd_vector_insert_cr(v); /* END: Added by weizengke, 2013/10/5 PN:None */ cmd_outstring("%s", CMD_ENTER); // do command match_type = cmd_execute_command(v, vty, match, &match_size, &nomath_pos); // add executed command into history cmd_vty_add_history(vty); if (match_type == CMD_NO_MATCH) { cmd_output_missmatch(vty, nomath_pos); } else if (match_type == CMD_ERR_ARGU) { cmd_outstring("Too Many Arguments"); cmd_outstring("%s", CMD_ENTER); } if (match_type == CMD_ERR_AMBIGOUS) { if (match_size) { cmd_outstring("Command '%s' anbigous follow:", vty->buffer); cmd_outstring("%s", CMD_ENTER); for (i = 0; i < match_size; i++) { if (ANOTHER_LINE(i)) cmd_outstring("%s", CMD_ENTER); cmd_outstring(" %-25s", match[i]->para); } cmd_outstring("%s", CMD_ENTER); /* del 10-29 cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); */ vty->cur_pos = vty->used_len = 0; memset(vty->buffer, 0, vty->buf_len); cmd_outprompt(vty->prompt); } } else { // ready for another command vty->cur_pos = vty->used_len = 0; memset(vty->buffer, 0, vty->buf_len); cmd_outprompt(vty->prompt); } }
/***************************************************************************** 函 数 名 : cmd_resolve_tab 功能描述 : 适配TAB键,命令补全 输入参数 : struct cmd_vty *vty 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年11月17日 作 者 : weizengke 修改内容 : 新生成函数 *****************************************************************************/ void cmd_resolve_tab(struct cmd_vty *vty) { int i; cmd_vector_t *v; struct para_desc *match[CMD_MAX_MATCH_SIZE] = {0}; // matched string int match_size = 0; int match_type = CMD_NO_MATCH; int isNeedMatch = 1; /* 非TAB场景(无空格),不需要匹配 */ char lcd_str[1024] = {0}; // if part match, then use this char *last_word = NULL; /* 1: 取pos 之前的buf 2: 需要覆盖当前光标后的buf */ /* BEGIN: Added by weizengke, 2013/11/17 bug for left and tab*/ memset(&(vty->buffer[vty->cur_pos]), 0 ,strlen(vty->buffer) - vty->cur_pos); vty->used_len = strlen(vty->buffer); /* END: Added by weizengke, 2013/11/17 */ if (g_InputMachine_prev == CMD_KEY_CODE_TAB) { cmd_delete_word(vty); cmd_insert_word(vty, g_tabbingString); } else { memset(g_tabString,0,sizeof(g_tabString)); g_tabStringLenth = 0; } v = str2vec(vty->buffer); if (v == NULL) { /* v = cmd_vector_init(1); cmd_vector_insert(v, '\0'); */ isNeedMatch = 0; } if (isspace((int)vty->buffer[vty->used_len - 1])) { isNeedMatch = 0; } if (1 == isNeedMatch && NULL != v) { match_type = cmd_match_command(v, vty, match, &match_size, lcd_str); last_word = (char*)cmd_vector_slot(v, cmd_vector_max(v) - 1); if (g_InputMachine_prev != CMD_KEY_CODE_TAB) { strcpy(g_tabbingString, last_word); } cmd_vector_deinit(v, 1); } cmd_outstring("%s", CMD_ENTER); switch (match_type) { case CMD_NO_MATCH: cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); break; case CMD_FULL_MATCH: cmd_delete_word(vty); if (NULL != match[0]) { cmd_insert_word(vty, match[0]->para); } /* BEGIN: Added by weizengke, 2013/10/14 for full match then next input*/ cmd_insert_word(vty, " "); /* END: Added by weizengke, 2013/10/14 */ cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); /* BEGIN: Added by weizengke, 2013/10/27 PN: fix the bug of CMD_FULL_MATCH and then continue TAB*/ memset(g_tabString,0,sizeof(g_tabString)); memset(g_tabbingString,0,sizeof(g_tabbingString)); g_tabStringLenth = 0; /* END: Added by weizengke, 2013/10/27 */ break; case CMD_PART_MATCH: /* delete at 2013-10-05, CMD_PART_MATCH will never reach, CMD_LIST_MATCH instead. case like this: disable , display >di TAB >dis ==> CMD_PART_MATCH */ cmd_delete_word(vty); cmd_insert_word(vty, lcd_str); cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); break; case CMD_LIST_MATCH: if (g_InputMachine_prev != CMD_KEY_CODE_TAB) { memset(g_tabString,0,sizeof(g_tabString)); strcpy(g_tabString, match[0]->para); g_tabStringLenth = strlen(g_tabString); /* cmd_outstring("%s", CMD_ENTER); */ } else { for (i = 0; i < match_size; i++) { if (0 == strcmp(g_tabString, match[i]->para)) { break; } } if (i == match_size) { debug_print_ex(CMD_DEBUG_TYPE_ERROR, "TAB for completing command. bug of tab continue. (g_tabString=%s)", g_tabString); } i++; if (i == match_size) { i = 0; } memset(g_tabString,0,sizeof(g_tabString)); strcpy(g_tabString, match[i]->para); g_tabStringLenth = strlen(g_tabString); } /*for (i = 0; i < match_size; i++) { if (ANOTHER_LINE(i)) cmd_outstring("%s", CMD_ENTER); cmd_outstring("%-25s", match[i]->para); } */ cmd_delete_word(vty); cmd_insert_word(vty, g_tabString); cmd_outprompt(vty->prompt); cmd_outstring("%s", vty->buffer); break; default: break; } }