⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cli_interpret.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
            return CT_INTP_RETURNED_FOR_HELP;
        }
    }

    else if(!IS_COMPLETE(ulStatus) && !IS_ENV_SILENT(pWS->ulStatus)
            && !IS_NOFORM(pWS->ulStatus))
    {
        if(IS_WAIT_OBJ(ulStatus))
        {
            IO_Print(CLI_INTP_CMD_INCOMPLETE);
            IO_OutString(pWS->szCmdString);
            IO_Print(CLI_INTP_NEED_COMWORD);
            IO_OutString(pointer.expP.pObj->szName);
            return G_FAILURE;
        }

        if(IS_WAIT_PARAM(ulStatus) && (CI_BrotherParameterOptional(&pointer.expP.pParam) != G_SUCCESS))
        {
            IO_Print(CLI_INTP_CMD_INCOMPLETE);
            IO_OutString(pWS->szCmdString);
            IO_Print(CLI_INTP_NEED_PARAM);
            IO_OutString(pointer.expP.pParam->szName);
            return G_FAILURE;
        }
        if(IS_WAIT_VALUE(ulStatus) && (CI_BrotherValueOptional(&pointer.expP.pValue) != G_SUCCESS))
        {
            IO_Print(CLI_INTP_CMD_INCOMPLETE);
            IO_OutString(pWS->szCmdString);
            IO_Print(CLI_INTP_NEED_VALUE);
            IO_OutString(pointer.expP.pValue->szName);
            return G_FAILURE;
        }
    }
    else if(!IS_MATCHSUCC(ulStatus) && !IS_ENV_SILENT(pWS->ulStatus)
            && !IS_NOFORM(pWS->ulStatus) && EOS_StrLen(szToken))
    {
        if(IS_WAIT_PARAM(ulStatus))
        {
            IO_Print(CLI_INTP_INVALID_PARAM);
            IO_OutString(szToken);
        }
        else if(IS_WAIT_VALUE(ulStatus))
        {
            IO_Print(CLI_INTP_INVALID_VALUE);
            IO_OutString(szToken);
        }
        else
        {
            IO_Print(CLI_INTP_INNEED_PARAM);
            IO_OutString(szToken);
        }
        return G_FAILURE;
    }

    /* Check user right level & Execute */
    ulUserRightLevel = CI_GetUserRightLevel(pWS);
    if( CI_UserPermitted(ulUserRightLevel, pointer.curP.pObj, ulStatus)
         == G_SUCCESS )
    {
        if((EOS_StrLen(pWS->szCmdString) + EOS_StrLen(&(pointer.szPatch[0])))
            < CT_MAX_CMDBUF - 1)
        {
            if ( !IS_ENV_RUNCFG(pWS->ulStatus) )
                EOS_StrCat( pWS->szCmdString, &pointer.szPatch[0]);
        }

        if((!IS_ENV_ENTER(pWS->ulStatus)) && (IS_MATCHSUCC(ulStatus)))
        {
            if(((pointer.curP.pObj->noAction.pFunction == G_NULL)
                &&(pointer.curP.pObj->action.pFunction == G_NULL)
                &&(pointer.curP.pObj->action.modeConv == CT_MC_NULL))
                ||(!EOS_StriCmp(szToken,"no"))
                ||(!IS_COMPLETE(ulStatus)))

                EOS_StrCat( pWS->szCmdString, " ");
            else if(IS_COMPLETE(ulStatus))
            {
                EOS_StrCat( pWS->szCmdString, " ");
            }
        }

        /* Execute the Command Function */
        if(!IS_ENV_SILENT(pWS->ulStatus))
        {
            /* 解释成功的命令执行 */
            ulRet = CI_TakeAction(pointer.curP.pObj, ulStatus, pWS);

            if (ulRet != G_SUCCESS)
            {
                if(!IS_ENV_SILENT(pWS->ulStatus) && ulRet == G_FAILURE)
                    IO_Print(CLI_INTP_CMD_FAILED);
                return ulRet;
            }
            else
            {
                m_ulLogTag = 1;
            }
        }
    }
    else
    {
        if(!IS_ENV_SILENT(pWS->ulStatus))
            IO_OutString("\r\n Access denied.") ;
        return G_FAILURE;
    }

    return G_SUCCESS;

}

/*********************************************************************/
/* 函数名称 : CT_GetUserType()                                       */
/* 函数功能 : 获取用户自定义类型                                     */
/* 返回     : 用户自定义的类型结构                                   */
/*********************************************************************/
CT_USERTYPE_T * CT_GetUserType(_U32 ulType)
{
    return &m_sCliUserType[ulType - CT_DATA_USER];
}

_U32 CT_ValidateUserType(_U32 ulType)
{
    if((ulType >= CT_DATA_USER) && (ulType < CT_DATA_BOTTOM))
    {
        if((m_sCliUserType[ulType-CT_DATA_USER].ucTypeID == ulType)
            && (m_sCliUserType[ulType-CT_DATA_USER].pCheckFunc != G_NULL))
        {
            return G_SUCCESS;
        }
    }

    return G_FAILURE;

}
/*※※※※※※※※※※※※※※*/
/* 【1】命令字的获取          */
/*※※※※※※※※※※※※※※*/
/*********************************************************************/
/* 函数名称 : CI_GetCmdToken                                         */
/* 函数功能 : 以字符串形式获取下一个命令字                           */
/* 输入参数 : szCmdString 命令缓冲中的命令串                         */
/*            ulStatus    命令解释状态                               */
/*            pPointer    命令解释核心结构                           */
/* 输出参数 : szToken     所获取的命令字                             */
/* 返回     : 成功、失败                                             */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CI_GetCmdToken( _S8 **szCmdString, _S8 *szToken,
                 _U32 *ulStatus, CI_POINTER_P pPointer)
{

    /* Check whether interactive operation needs? */
    if(IS_INTERACTIVE(*ulStatus))
    {
        /* 如果当前匹配参量可跳过并且用户已经输入了命令字,则直接返回 */
        if( IS_SKIP_FLAG(*ulStatus) && szToken[0])
        {
            return G_SUCCESS;
        }

        /* Note : A token of empty string is permitted. */
        return CI_GetCmdTokenFromUser( szToken, *ulStatus, pPointer );
    }
    else
    {
        if( IS_SKIP_FLAG(*ulStatus) )
        {
            return G_SUCCESS;
        }
        return CI_GetCmdTokenFromBuffer( szCmdString, szToken, ulStatus );
    }

} /* End of Function CI_GetCmdToken() */

/*********************************************************************/
/* 函数名称 : CI_GetInteractiveObject()                                 */
/* 函数功能 : 给出交互状态下的对象提示                               */
/* 输入参数 : pPointer  命令解释核心结构                             */
/*            ulStatus  命令解释状态                                 */
/* 输出参数 : szSelect  所给出的对象名                               */
/* 返回     :                                                        */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_S8 *CI_GetInteractiveObject(CI_POINTER_P pPointer, _U32 ulStatus, _S8 *szSelect)
{
    CT_OBJECT_P pObject;
    _U32 ulLen,ulNameLen;

    pObject = pPointer->expP.pObj;
    EOS_StrCpy(szSelect,"<");
    ulLen = EOS_StrLen(szSelect);
    ulNameLen = 0;

    /* Get a object name string */
    while(pObject != G_NULL)
    {
        if(CT_IS_CURRENT_KNOWN_OBJ(pObject, pPointer->pWS)
          &&((IS_NOFORM(ulStatus) && (pObject->ulNoFlag))||(!IS_NOFORM(ulStatus))))
        {
            if(ulNameLen != 0)
            {
                EOS_StrCpy(szSelect+ulLen,",");
                ulLen++;
            }
            ulNameLen = EOS_StrLen(pObject->szName);
            if(( ulNameLen + ulLen + 1) <= 500) /* 字符串长度不能超过500,加1为防止越界 */
            {
                EOS_StrCpy(szSelect+ulLen,pObject->szName);
                ulLen += ulNameLen;
            }
            else
            {
                EOS_StrCpy(szSelect+ulLen,"...");
                ulLen += 3;
                break;
            }
        }/* end of if-block */
        pObject = pObject->pNext;

    } /* end of while() */

    EOS_StrCpy(szSelect+ulLen,">");

    return szSelect;
} /* End of function CI_GetInteractiveObject() */


/*********************************************************************/
/* 函数名称 : CI_GetInteractiveObject()                                 */
/* 函数功能 : 给出交互状态下的参数提示                               */
/* 输入参数 : pPointer  命令解释核心结构                             */
/* 输出参数 : szSelect  所给出的参数名                               */
/* 返回     :                                                        */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_S8 *CI_GetInteractiveParameter(CI_POINTER_P pPointer, _S8 *szSelect)
{
    CT_PARAMETER_P pParam;
    _U32 ulLen,ulNameLen;
    _BOOL bOptional;
    _U32 ulMtIndex;

    ulLen = 0;
    pParam = pPointer->expP.pParam;
    if(CT_PARAM_IS_OPTIONAL(pParam))
    {
        EOS_StrCpy(szSelect,"[");
        bOptional = G_TRUE;
    }
    else
    {
        EOS_StrCpy(szSelect,"<");
        bOptional = G_FALSE;
    }

    ulLen ++;
    ulNameLen = 0;

    if(CT_PARAM_IS_MUTEX(pParam))
    {
        ulMtIndex = pParam->ulAbsoluteIndex;

        while(pParam != G_NULL
           && CT_PARAM_IS_MUTEX(pParam)
           && pParam->ulAbsoluteIndex == ulMtIndex)
        {

            if(ulNameLen != 0)
            {
                EOS_StrCpy(szSelect+ulLen,",");
                ulLen++;
            }
            ulNameLen = EOS_StrLen(pParam->szName);
            if(( ulNameLen + ulLen + 1) <= 500)
            {
                EOS_StrCpy(szSelect+ulLen,pParam->szName);
                ulLen += ulNameLen;
            }
            else
            {
                EOS_StrCpy(szSelect+ulLen,"...");
                ulLen += 3;
                break;
            }
            pParam = pParam->pNext;
        } /* end of while-block */
    }
    else
    {
        /* Not mutex */
        EOS_StrCpy(szSelect+ulLen,pParam->szName);
        ulLen += EOS_StrLen(pParam->szName);
    }

    if(bOptional == G_TRUE)
    {
        EOS_StrCpy(szSelect+ulLen,"]");
    }
    else
    {
        EOS_StrCpy(szSelect+ulLen,">");
    }

    return szSelect;

} /* End of function CI_GetInteractiveParameter() */

/*********************************************************************/
/* 函数名称 : CI_GetInteractiveObject()                                 */
/* 函数功能 : 给出交互状态下的参数值提示                             */
/* 输入参数 : pPointer  命令解释核心结构                             */
/* 输出参数 : szSelect  所给出的参数值                               */
/* 返回     :                                                        */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_S8 *CI_GetInteractiveValue(CI_POINTER_P pPointer, _S8 *szSelect)
{
    CT_VALUE_P pValue;
    CT_SERIAL_WORD_P pKeyword = G_NULL;
    _U32 ulLen,ulElement;
    _S8 s8Tmp[CT_MAX_PARAMLEN + 3];

    ulLen = 0;
    pValue = pPointer->expP.pValue;

    /* Add value name to string */
    if(CT_VALUE_IS_OPTIONAL(pValue))
    {
        EOS_StrCpy(szSelect,"[");
        EOS_StrCat(szSelect,pValue->szName);
        EOS_StrCat(szSelect,"]");
    }
    else
    {
        EOS_StrCpy(szSelect,"<");
        EOS_StrCat(szSelect,pValue->szName);
        EOS_StrCat(szSelect,">");
    }

    if( CT_VALUE_USER_CHECK(pValue) )
    {
        ulLen = EOS_StrLen(szSelect);
        pValue->pCheckFunc(G_NULL,szSelect+ulLen,pPointer->pWS);
        return szSelect;
    }

    if( CT_ValidateUserType((_U32)pValue->valueType.ucDataType) == G_SUCCESS)
    {
        ulLen = EOS_StrLen(szSelect);
        CT_GetUserType((_U32)pValue->valueType.ucDataType)->pCheckFunc(G_NULL,szSelect+ulLen,pPointer->pWS);
        return szSelect;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -