Exemple #1
0
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();

}
Exemple #2
0
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++;

}
Exemple #3
0
/*****************************************************************************
 函 数 名  : 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();


}
Exemple #4
0
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++;
}
Exemple #5
0
/* 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);
}
Exemple #6
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;
}