bool isIsomorphic(string s, string t) { vector<int> a,b; str2vec(s,a); str2vec(t,b); for(int i=0;i<s.length();i++) { if(a[i]!=b[i]) { return false; } } return true; }
/***************************************************************************** 函 数 名 : 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); }
int f_put (char **vec) { int append; #ifdef BRIDGE int result; char *dst; #else int sglobbed; char *bp, *dst, **gp, **src; char *freedst = NULL, buffer[BUFSIZ]; #endif append = strcmp (*vec, "append") == 0; if (*++vec == NULL) { #ifdef BRIDGE return NOTOK; #else if (getftamline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1) return OK; dst = NULL; #endif } else { #ifdef BRIDGE dst = *vec; #else char **ap; for (ap = vec; *ap; ap++) continue; if (--ap != vec) dst = *ap, *ap = NULL; else dst = NULL; #endif } #ifndef BRIDGE if (!(src = xglob (vec, 0))) return OK; sglobbed = xglobbed; if (dst == NULL) { if (getftamline ("destination: ", buffer) == NOTOK) { blkfree (src); return OK; } switch (str2vec (buffer, vec)) { case 0: break; case 1: dst = *vec; break; default: advise (NULLCP, "too many destinations"); goto out; } } if (dst && !(dst = freedst = xglob1val (dst, 0))) goto out; if (src[1] == NULL) { if (interrupted) goto out; if (dst == NULL) { switch (realstore) { case RFS_UNIX: if (dst = rindex (*src, '/')) dst++; if (dst == NULL || *dst == NULL) dst = *src; break; default: dst = *src; break; } dst = str2file (dst); ask_it: ; if (query) switch (ask ("%s %s %s", append ? "append" : "put", *src, dst)) { case NOTOK: goto out; case OK: default: break; case DONE: goto out; } } else switch (realstore) { case RFS_UNIX: if (isdir (dst, NULLCP, 1) == NOTOK) break; #ifdef apollo if (*dst == '/') sprintf (bp = buffer, "%s", dst); else #endif sprintf (bp = buffer, "%s/", dst); bp += strlen (bp); if (dst = rindex (*src, '/')) dst++; if (dst == NULL || *dst == NULL) dst = *src; strcpy (bp, dst); dst = buffer; goto ask_it; default: break; } dst = str2file (dst); put (*src, dst, append); goto out; } switch (realstore) { case RFS_UNKNOWN: advise (NULLCP, "%s", rs_unknown); goto out; case RFS_UNIX: if (dst) #ifdef apollo if (*(bp = str2file (dst)) == '/') { strcpy (buffer, bp); bp = buffer; } else #endif sprintf (bp = buffer, "%s/", str2file (dst)); else if (rcwd) sprintf (bp = buffer, "%s", str2file ("")); else strcpy (bp = buffer, "./"); bp += strlen (bp); break; default: advise (NULLCP, "%s", rs_support); goto out; } if (isdir (str2file (buffer), NULLCP, 0) == NOTOK) goto out; for (gp = src; *gp && !interrupted; gp++) { switch (realstore) { case RFS_UNIX: if (dst = rindex (*gp, '/')) dst++; if (dst == NULL || *dst == NULL) dst = *gp; break; default: dst = *gp; break; } strcpy (bp, dst); dst = str2file (buffer); if (sglobbed) { if (query) switch (ask ("%s %s %s", append ? "append" : "put", *gp, dst)) { case NOTOK: continue; case OK: default: break; case DONE: goto out; } else advise (NULLCP, "%s %s %s", append ? "append" : "put", *gp, dst); } put (*gp, dst, append); if (ftamfd == NOTOK) break; } out: ; blkfree (src); if (freedst) free (freedst); return OK; #else result = put (dst, append); return result; #endif }
/***************************************************************************** 函 数 名 : 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; } }