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

📄 cli_cmdreg.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
        if(m_sCliSysModes[ulMode].ulMode == ulMode)
        {
            m_sCliSysModes[ulMode].pObject = pObject;
            if(ulParamCount > 0)
            {
                m_sCliSysModes[ulMode].ulParamCount = ulParamCount;
            }

            if(ulMode > 0)
            {
                pObject1 = pObject->pParent;
                while( !CT_OBJ_CHANGE_MODE(pObject1) && (pObject1 != G_NULL) )
                {
                    pObject1 = pObject1->pParent;
                }
                ulParentMode = CI_GetNewMode(pObject1) ;
                m_sCliSysModes[ulMode].ulHierarchy = m_sCliSysModes[ulParentMode].ulHierarchy + 1 ;
            }
            ulRet = G_SUCCESS;
        }
    }

    if ((ulRet == G_SUCCESS) && (ulMode != CTM_GENL) && (ulMode != CTM_GLOBAL))
    {
        ulRet += CT_CmdAutoRegistEx(CMD_CM "..",
                                   (_U8)ulMode,
                                   CT_AL_QUERY,
                                   pFunc,
                                   CT_MC_EXIT,
                                   NULL_MODE,
                                   CMDHELP_GLB_CM,
                                   CMDHELP_GLB_CM_PARENT,
                                   CLI_ML_NULL);
        ulRet += CT_CmdAutoRegistEx(CMD_CM "root",
                                   (_U8)ulMode,
                                   CT_AL_QUERY,
                                   pFunc,
                                   CT_MC_END,
                                   NULL_MODE,
                                   CMDHELP_GLB_CM,
                                   CMDHELP_GLB_CM_ROOT,
                                   CLI_ML_NULL);

    }

    return ulRet;

}

_U32 CT_RegObject(CT_OBJECT_P pParent, CT_OBJECT_P pObject)
{
    CT_OBJECT_P pObj,pObj1,pObject1;
    _U32 ulMode;

    if((pParent == G_NULL) || (pObject == G_NULL))
    {
        return G_FAILURE;
    }

    pObj = pParent->pSubObject;
    if(pObj == G_NULL)
    {
        pParent->pSubObject = pObject;
        pObject->pParent = pParent;
        pParent->ulObjectCount++;
        if((pObject->ulNoFlag))
        {
            ulMode = pObject->action.ulMode;
            while((pObject) && (pObject->action.ulMode == ulMode))
            {
                pObject->ulNoFlag = 1;
                pObject = pObject->pParent;
            }
        }
    }
    else
    {
        pObj1 = pObj;

        while(pObj != G_NULL)
        {
            if(CT_IS_SAME_OBJECT(pObj,pObject))
            {
                /* 不允许一个模式下的同名对象有不同的帮助信息 */
                if (pObj->action.ulHelpID != pObject->action.ulHelpID
                 && (pObj->action.ulHelpID != CLI_ML_NULL)
                 && (pObject->action.ulHelpID != CLI_ML_NULL))
                {
                    DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                        "\r\n CLI: 同名对象的帮助ID不同:%s (%s), %s (%s)",
                        pObj->szName, pObj->pSubObject->szName, pObject->szName, pObject->pSubObject->szName);

                    return G_FAILURE;
                }

                /* 注册相同命令时,取低权限 */
                if(pObj->action.rightLevel > pObject->action.rightLevel)
                {
                    pObj->action.rightLevel = pObject->action.rightLevel;
                }

                pParent = pObj;
                pObject1 = pObject;
                /* Set pObject->pSubObject as the header    */
                pObject = pObject1->pSubObject;
                if(pObject == G_NULL)
                {
                    return G_FAILURE;
                }

                /* release the pObject1 */
                if (CT_FreeObject(pObject1) != G_SUCCESS)
                {
                    return G_FAILURE;
                }

                pObject1 = G_NULL;

                pObject->pParent = G_NULL;
                pObj = pObj->pSubObject;

                if((G_NULL == pObj))
                {
                    while(pObject)
                    {
                        pObject1 = pObject->pSubObject;
                        if (CT_FreeObject(pObject) != G_SUCCESS)
                        {
                            return G_FAILURE;
                        }
                        pObject = pObject1;
                    }
                    return G_FAILURE;
                }
                continue;
            }
            else if(CI_IS_BIG_OBJECT(pObj,pObject))
            {
                pObj1 = pObj->pPrevious;
                if(pObj1 == G_NULL)
                {
                    pParent->pSubObject = pObject;
                    pObject->pNext = pObj;
                    pObj->pPrevious = pObject;
                    pObject->pParent = pParent;
                    pParent->ulObjectCount++;
                    if((G_NULL != pObject) && (pObject->ulNoFlag))
                    {
                        ulMode = pObject->action.ulMode;
                        while((pObject) && (pObject->action.ulMode == ulMode))
                        {
                            pObject->ulNoFlag = 1;
                            pObject = pObject->pParent;
                        }
                    }
                    return G_SUCCESS;
                }
                else
                {
                    pObj1->pNext = pObject;
                    pObject->pParent = pParent;
                    pObject->pPrevious = pObj1;
                    pObject->pNext = pObj;
                    pObj->pPrevious = pObject;
                    pParent->ulObjectCount++;
                    if((G_NULL != pObject) && (pObject->ulNoFlag))
                    {
                        ulMode = pObject->action.ulMode;
                        while((pObject) && (pObject->action.ulMode == ulMode))
                        {
                            pObject->ulNoFlag = 1;
                            pObject = pObject->pParent;
                        }
                    }

                    return G_SUCCESS;
                }
            }
            pObj1 = pObj;
            pObj = pObj->pNext;
        }

        pObj1->pNext = pObject;
        if(pObject != G_NULL)
        {
            pObject->pPrevious = pObj1;
            pObject->pParent = pParent;
        }

        pParent->ulObjectCount++;
        if((G_NULL != pObject) && (pObject->ulNoFlag))
        {
            ulMode = pObject->action.ulMode;
            while((pObject) && (pObject->action.ulMode == ulMode))
            {
                pObject->ulNoFlag = 1;
                pObject = pObject->pParent;
            }
        }
    }

    return G_SUCCESS;
}

_U32 CT_RegObjToMode(_U32 ulMode, CT_OBJECT_P pObject)
{
    CT_OBJECT_P pObj,pObj1;
    CT_MODE_T *pMode;
    _U32 i;

    if(pObject == G_NULL)
    {
        return G_FAILURE;
    }

    if(ulMode < MAX_MODE_NUM)
    {
        /* 检验全局模式与其它模式是否会出现同名对象的情况 */
        /* 如果出现同名对象, 则将该对象注册到全局模式     */
        if (ulMode != CTM_GLOBAL && m_sCliSysModes[CTM_GLOBAL].pObject != G_NULL)
        {
            pObj = m_sCliSysModes[CTM_GLOBAL].pObject->pSubObject;
            while (pObj != G_NULL)
            {
                if (CT_IS_SAME_OBJECT(pObj,pObject))
                {
                    pObject->action.ulMode = CTM_GLOBAL;
                    ulMode = CTM_GLOBAL;
                    break;
                }
                pObj = pObj->pNext;
            }
        }
        else
        {
            for (i = 0; i <  MAX_MODE_NUM; i++)
            {
                if (i == CTM_GLOBAL || m_sCliSysModes[i].pObject == G_NULL)
                    continue;
                pObj = m_sCliSysModes[i].pObject->pSubObject;

                while (pObj != G_NULL)
                {
                    if (CT_IS_SAME_OBJECT(pObj,pObject))
                    {
                        pObj->pParent->ulObjectCount--;
                        pObj->pNext->pPrevious = pObj->pPrevious;
                        pObj->pPrevious->pNext = pObj->pNext;
                        pObj->action.ulMode = CTM_GLOBAL;

                        if (G_SUCCESS != CT_RegObject(m_sCliSysModes[CTM_GLOBAL].pObject,pObj))
                        {
                            return G_FAILURE;
                        }

                        ulMode = CTM_GLOBAL;
                        break;
                    }
                    pObj = pObj->pNext;
                }
            }
        }
        /* 检验完毕 */

        if(m_sCliSysModes[ulMode].ulMode == ulMode)
        {
            pObj = m_sCliSysModes[ulMode].pObject;
            if(pObj == G_NULL)
            {
                /* No Object Pointer of the mode */
                return G_FAILURE;
            }

            /* Check the right level and set it to correct value */
            pObj1 = pObject;
            while(pObj1 != G_NULL)
            {
                if((pObj1->action.rightLevel == CT_AL_NULL) ||
                   (pObj1->action.rightLevel < m_sCliSysModes[ulMode].rightLevel) )
                {
                    pObj1->action.rightLevel = m_sCliSysModes[ulMode].rightLevel;
                }
                if((pObj1->noAction.rightLevel == CT_AL_NULL) ||
                   (pObj1->noAction.rightLevel < m_sCliSysModes[ulMode].rightLevel) )
                {
                    pObj1->noAction.rightLevel = m_sCliSysModes[ulMode].rightLevel;
                }
                pObj1 = pObj1->pSubObject;
            }

            if(!EOS_StriCmp(pObject->szName, "exit") || (!EOS_StriCmp(pObject->szName, "end")))
            {
                pMode = CI_GetMode(ulMode);
                if(G_NULL != pMode)
                {
                    pMode = CI_GetMode(pMode->ulParent);
                    if(G_NULL != pMode)
                        pObject->action.rightLevel = pMode->rightLevel;
                }
            }

            return CT_RegObject(pObj,pObject);

        }
    }

    return G_FAILURE;

}

_U32 CT_RegCmdHelp(CT_OBJECT_P pObject, _U32 ulHelpInfoID)
{
    if(pObject == G_NULL)
    {
        return G_FAILURE;
    }

    pObject->action.ulHelpID = ulHelpInfoID;
    return G_SUCCESS;
}

_U32 CT_RegParamlink(CT_OBJECT_P pObject, _U32 ulFlag,
                         CT_PARAMGROUP_P pParamLink)
{
    if((pObject == G_NULL) || (pParamLink == G_NULL))
    {
        return G_FAILURE;
    }

    /* ulFlag == CT_RP_FLAG_NORMAL : normal action */
    if(ulFlag == CT_RP_FLAG_NORMAL)
    {
        if(pObject->action.pParamLink != G_NULL)
        {
            /* Paramlink already exist */
            return G_FAILURE;
        }
        else
        {
            pObject->action.pParamLink = pParamLink;
            return G_SUCCESS;
        }
    }
    /* ulFlag != 0 : no form action */
    else
    {
        if(pObject->noAction.pParamLink != G_NULL)
        {
            return G_FAILURE;
        }
        else
        {
            pObject->noAction.pParamLink = pParamLink;
            return G_SUCCESS;
        }
    }

}

_U32 CT_RegValueToParam(CT_PARAMETER_P pParam,
                                CT_VALUE_P pValue)
{
    CT_VALUE_P pV,pV1;

    if((pParam == G_NULL) || (pValue == G_NULL))
    {
        return G_FAILURE;
    }

    pV = pParam->valueList.pValue;
    if(pV == G_NULL)
    {
        pParam->valueList.pValue = pValue;
        pParam->valueList.ulNumber++;
    }
    else
    {
        pV1 = pV;
        while(pV != G_NULL)
        {
            pV1 = pV;
            pV = pV->pNext;
        }
        pV1->pNext = pValue;
        pValue->pPrevious = pV1;
    }

    return G_SUCCESS;

}

_U32 CT_RegParamAsHeir(CT_PARAMETER_P pOldParam,
                     CT_PARAMETER_P pNewParam)
{
    CT_PARAMETER_P pParam,pParam1;

    if((pOldParam == G_NULL) || (pNewParam == G_NULL))
    {
        return G_FAILURE;
    }

    pParam = pOldParam->subParam;
    if(pParam == G_NULL)
    {
        pOldParam->subParam = pNewParam;
        pNewParam->pParent = pOldParam;
    }
    else
    {
        pParam1 = pParam;

        while(pParam != G_NULL)
        {
            if(CT_PARAM_NEED_NAME(pParam) && CT_PARAM_NEED_NAME(pNewParam))
            {
                if(CT_IS_SAME_PARAM(pParam,pNewParam))
                {
                    return G_FAILURE;
                }
            }
            pParam1 = pParam;
            pParam = pParam->pNext;
        }
        /* 此处pc-lint有告警,确认不会有问题 */
        pParam1->pNext = pNewParam;
        pNewParam->pPrevious = pParam1;
        pNewParam->pParent = pOldParam;

⌨️ 快捷键说明

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