📄 cli_term.c
字号:
/* 调用函数 :CLI_MoveToCurrentPos ( ) */
/* 被调函数 : */
/*==================================================================*/
_VOID CLI_DealWithBackSpace ( PTerm_Data_S pTermStruct )
{
_U32 ulTmp ;
if ( pTermStruct == G_NULL )
{
MT_ERRLOG(0);
return ;
}
/*--------------------------------------------------------------*/
/* 光标前无字符可删除,则告警 */
/*--------------------------------------------------------------*/
if ( pTermStruct->iCurrentPos == 0
|| (pTermStruct->szInputCmd[0] != 0 && pTermStruct->iCurrentPos <= (_S32)strlen(pTermStruct->szInputCmd)))
{
CLI_Bell ( pTermStruct ) ;
return;
}
/* 如果终端类型不是vt100时的处理 */
if ( EOS_StrCmp ( pTermStruct->TelnetParam.TermType, "VT100" )
&& EOS_StrCmp ( pTermStruct->TelnetParam.TermType, "vt100" ) )
{
pTermStruct->iCurrentPos -- ;
CLI_MoveToCurrentPos ( pTermStruct, (_U32)pTermStruct->iCurrentPos + 1 ) ;
ulTmp = (_U32)pTermStruct->iCurrentPos ;
/* 处理编辑缓冲区删除光标前的一字符,并刷新发送缓冲区 */
do
{
if ( pTermStruct->szEditBuf[ ulTmp + 1 ] )
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
= pTermStruct->szEditBuf[ ulTmp + 1 ] ;
else
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
= ' ' ;
pTermStruct->szEditBuf[ ulTmp ]
= pTermStruct->szEditBuf[ ulTmp + 1 ] ;
ulTmp ++ ;
} while ( pTermStruct->szEditBuf[ ulTmp - 1 ] ) ;
pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;
/* 重新显示当前光标后的字符后,刷新光标位置 */
CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) + 1 ) ;
return ;
}
/* 终端类型是vt100的处理 */
else
{
pTermStruct->iCurrentPos -- ;
CLI_MoveToCurrentPos ( pTermStruct, (_U32)pTermStruct->iCurrentPos + 1 ) ;
ulTmp = (_U32)pTermStruct->iCurrentPos ;
/* 处理编辑缓冲区删除光标前的一字符,并刷新发送缓冲区 */
do
{
if ( pTermStruct->szEditBuf[ ulTmp + 1 ] )
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
= pTermStruct->szEditBuf[ ulTmp + 1 ] ;
else
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
= ' ' ;
pTermStruct->szEditBuf[ ulTmp ]
= pTermStruct->szEditBuf[ ulTmp + 1 ] ;
ulTmp ++ ;
} while ( pTermStruct->szEditBuf[ ulTmp - 1 ] ) ;
pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;
/*------------------------------------------------------*/
/* 重新显示当前光标后的字符后,刷新光标位置 */
/*------------------------------------------------------*/
CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) + 1 ) ;
}
return ;
}
/*==================================================================*/
/* 函数名 :CLI_DealWithDelete */
/* 函数功能 :对Delete键的处理 */
/* 输入参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 输出参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 返回值 :无 */
/* 调用函数 :CLI_MoveToCurrentPos ( ) */
/* 被调函数 : */
/*==================================================================*/
_VOID CLI_DealWithDelete ( PTerm_Data_S pTermStruct )
{
_U32 ulTmp ;
if ( pTermStruct == G_NULL )
{
MT_ERRLOG(0);
return ;
}
/* 光标后有字符可以删除 */
if ( pTermStruct->szEditBuf[ pTermStruct->iCurrentPos ] )
{
ulTmp = (_U32)pTermStruct->iCurrentPos ;
/* 处理编辑缓冲区删除光标后的一字符,并刷新发送缓冲区 */
do
{
if ( pTermStruct->szEditBuf[ ulTmp + 1 ] )
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
= pTermStruct->szEditBuf[ ulTmp + 1 ] ;
else
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ]
= ' ' ;
pTermStruct->szEditBuf[ ulTmp ]
= pTermStruct->szEditBuf[ ulTmp + 1 ] ;
ulTmp ++ ;
} while ( pTermStruct->szEditBuf[ ulTmp - 1 ] ) ;
pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;
CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) + 1 ) ;
}
/* 光标后无字符可以删除,则警告 */
else
CLI_Bell ( pTermStruct ) ;
return ;
}
/*==================================================================*/
/* 函数名 :CLI_PrevCmdDisp */
/* 函数功能 :DOSKEY功能的上一条命令自动获取 */
/* 输入参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 输出参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 返回值 :无 */
/* 调用函数 :CLI_MoveToCurrentPos ( ) */
/* 被调函数 : */
/*==================================================================*/
_VOID CLI_PrevCmdDisp ( PTerm_Data_S pTermStruct )
{
_U32 ulTmp ;
if ( pTermStruct == G_NULL )
{
MT_ERRLOG(0);
return ;
}
/* 该操作需要历史缓冲中存在命令 */
if ( pTermStruct->iHistoryPos > 0 )
{
/* 将光标左移到屏幕显示的第一列上 */
if ( pTermStruct->iCurrentPos )
{
ulTmp = (_U32)pTermStruct->iCurrentPos ;
pTermStruct->iCurrentPos = 0 ;
CLI_MoveToCurrentPos ( pTermStruct, ulTmp ) ;
}
/* 清除用户的当前输入 */
if ( EOS_StrLen ( pTermStruct->szEditBuf ) )
{
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
ulTmp = 0 ;
while ( pTermStruct->szEditBuf[ ulTmp ++ ] )
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ] = ' ' ;
pTermStruct->szSendBuf [ pTermStruct->iSendLen ] = '\0' ;
CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) ) ;
}
/* 用当前命令前的历史命令刷新编辑缓冲区 */
EOS_StrCpy ( pTermStruct->szEditBuf,
pTermStruct->szHistory[ pTermStruct->iHistoryPos - 1 ] ) ;
pTermStruct->iHistoryPos -- ;
/* 重新显示新的命令 */
EOS_StrCat ( pTermStruct->szSendBuf, pTermStruct->szEditBuf ) ;
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
/* 刷新当前的光标位置 */
pTermStruct->iCurrentPos = (_S32)EOS_StrLen ( pTermStruct->szEditBuf ) ;
}
/* 当前命令之前无历史命令,鸣警 */
else
CLI_Bell ( pTermStruct ) ;
return ;
}
/*==================================================================*/
/* 函数名 :CLI_NextCmdDisp */
/* 函数功能 :DOSKEY功能的下一条命令自动获取 */
/* 输入参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 输出参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 返回值 :无 */
/* 调用函数 :CLI_MoveToCurrentPos ( ) */
/* 被调函数 : */
/*==================================================================*/
_VOID CLI_NextCmdDisp ( PTerm_Data_S pTermStruct )
{
_U32 ulTmp ;
if ( pTermStruct == G_NULL )
{
MT_ERRLOG(0);
return ;
}
/* 该操作需要历史缓冲中存在命令 */
if ( pTermStruct->iHistoryPos + 1 < HISTORY_SIZE
&& pTermStruct->szHistory[ pTermStruct->iHistoryPos + 1 ][0] )
{
/* 将光标左移到屏幕显示的第一列上 */
if ( pTermStruct->iCurrentPos )
{
ulTmp = (_U32)pTermStruct->iCurrentPos ;
pTermStruct->iCurrentPos = 0 ;
CLI_MoveToCurrentPos ( pTermStruct, ulTmp ) ;
}
/* 清除用户的当前输入 */
if ( EOS_StrLen ( pTermStruct->szEditBuf ) )
{
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
ulTmp = 0 ;
while ( pTermStruct->szEditBuf[ ulTmp ++ ] )
pTermStruct->szSendBuf[ pTermStruct->iSendLen ++ ] = ' ' ;
pTermStruct->szSendBuf [ pTermStruct->iSendLen ] = '\0' ;
CLI_MoveToCurrentPos ( pTermStruct, EOS_StrLen ( pTermStruct->szEditBuf ) ) ;
}
/* 用当前命令后的历史命令刷新编辑缓冲区 */
EOS_StrCpy (pTermStruct->szEditBuf,
pTermStruct->szHistory[ pTermStruct->iHistoryPos + 1 ] ) ;
pTermStruct->iHistoryPos ++ ;
/* 重新显示新的命令 */
if ( EOS_StrLen ( pTermStruct->szEditBuf ) )
{
EOS_StrCat ( pTermStruct->szSendBuf, pTermStruct->szEditBuf ) ;
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
}
/* 刷新当前的光标位置 */
pTermStruct->iCurrentPos = (_S32)EOS_StrLen ( pTermStruct->szEditBuf ) ;
}
/* 当前命令之后无历史命令,鸣警 */
else
CLI_Bell ( pTermStruct ) ;
return ;
}
/*==================================================================*/
/* 函数名 :CLI_MoveToCurrentPos */
/* 函数功能 :将光标移到当前位置 */
/* 输入参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* _U32 iPos 光标移动的起始位置 */
/* 输出参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 返回值 :无 */
/* 调用函数 :无 */
/* 被调函数 : */
/*==================================================================*/
_VOID CLI_MoveToCurrentPos ( PTerm_Data_S pTermStruct, _U32 iPos )
{
_S32 iTmp ;
_S8 szTmp[4] ;
_U32 ulInputCmdLen = EOS_StrLen(pTermStruct->szInputCmd);
if ( pTermStruct == G_NULL )
{
MT_ERRLOG(0);
return;
}
/* 将光标上下移动 */
iTmp = ((_S32)iPos + pTermStruct->iPromptLen - (_S32)ulInputCmdLen) / 80
- (pTermStruct->iCurrentPos + pTermStruct->iPromptLen -(_S32)ulInputCmdLen) / 80 ;
/* 将光标向上移动 */
if ( iTmp > 0)
{
EOS_StrCat( pTermStruct->szSendBuf, "\x1b[" ) ;
EOS_Sprintf ( szTmp, "%d", iTmp ) ;
EOS_StrCat(pTermStruct->szSendBuf, szTmp ) ;
EOS_StrCat(pTermStruct->szSendBuf, "A" ) ;
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
}
/* 将光标向下移动 */
else if ( iTmp < 0 )
{
EOS_StrCat ( pTermStruct->szSendBuf, "\x1b[" ) ;
EOS_Sprintf ( szTmp, "%d", 0 - iTmp ) ;
EOS_StrCat ( pTermStruct->szSendBuf, szTmp ) ;
EOS_StrCat ( pTermStruct->szSendBuf, "B" ) ;
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
}
/* 将光标左右移动 */
iTmp = ( (_S32)iPos + pTermStruct->iPromptLen - (_S32)ulInputCmdLen) % 80
- ( pTermStruct->iCurrentPos + pTermStruct->iPromptLen - (_S32)ulInputCmdLen ) % 80 ;
/* 将光标向左移动 */
if ( iTmp > 0 )
{
EOS_StrCat ( pTermStruct->szSendBuf, "\x1b[" ) ;
EOS_Sprintf ( szTmp, "%d", iTmp ) ;
EOS_StrCat ( pTermStruct->szSendBuf, szTmp ) ;
EOS_StrCat ( pTermStruct->szSendBuf, "D" ) ;
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
}
/* 将光标向右移动 */
else if ( iTmp < 0 )
{
EOS_StrCat ( pTermStruct->szSendBuf, "\x1b[" ) ;
EOS_Sprintf ( szTmp, "%d", 0 - iTmp ) ;
EOS_StrCat ( pTermStruct->szSendBuf, szTmp ) ;
EOS_StrCat ( pTermStruct->szSendBuf, "C" ) ;
pTermStruct->iSendLen = (_S32)EOS_StrLen ( pTermStruct->szSendBuf ) ;
}
return ;
}
/*==================================================================*/
/* 函数名 :CLI_Bell */
/* 函数功能 :如果接收到的字符不能处理,则警告 */
/* 输入参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 输出参数 :PTerm_Data_S pTermStruct 任务数据指针 */
/* 返回值 :无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -