亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cli_cmdreg.c

?? 命令行在嵌入式系統的實現
?? C
?? 第 1 頁 / 共 5 頁
字號:
    }

    return G_SUCCESS;

}

_U32 CT_RegParamToLink(CT_PARAMGROUP_P pParamLink,
                                CT_PARAMETER_P pNewParam)
{
    CT_PARAMETER_P pParam,pParam1;

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

    pParam = pParamLink->pParam;
    if(pParam == G_NULL)
    {
        pParamLink->pParam = pNewParam;
        pParamLink->ulNumber++;
    }
    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;
        }
        /* All parameters in link have null-parent-pointers */
        pParam1->pNext = pNewParam;
        pNewParam->pPrevious = pParam1;
        pParamLink->ulNumber++;
    }

    return G_SUCCESS;

}

/*********************************************************************/
/* 函數名稱 : CLI_GlobalCmdLink()                                    */
/* 函數功能 : 全局模式的命令鏈接                                     */
/* 輸入參數 : 無                                                     */
/* 輸出參數 : 無                                                     */
/* 返回     : 成功、失敗                                             */
/* 上層函數 : CLI_ProcessInit                                        */
/* 創建者   :                                                        */
/* 修改記錄 :                                                        */
/*********************************************************************/
_U32 CLI_GlobalCmdLink(_VOID)
{
    _U32 ulMode;
    CT_OBJECT_P pObject, pGlbObj;

    if (m_sCliSysModes[CTM_GLOBAL].pObject == G_NULL
     || m_sCliSysModes[CTM_GLOBAL].pObject->pSubObject == G_NULL)
    {
        /* ??? LingJian_Tailor : Change form G_FAILURE to G_SUCCESS */
        return G_SUCCESS;
    }

    pGlbObj = m_sCliSysModes[CTM_GLOBAL].pObject->pSubObject;

    for (ulMode = 0; ulMode < MAX_MODE_NUM; ulMode++)
    {
        if (ulMode == CTM_GLOBAL || m_sCliSysModes[ulMode].pObject == G_NULL )
            continue;
        pObject = m_sCliSysModes[ulMode].pObject->pSubObject;
        if (pObject == G_NULL)
            continue;

        while (pObject->pNext != G_NULL)
            pObject = pObject->pNext;
        pObject->pNext = pGlbObj;
    }
    return G_SUCCESS;
}

//*********************************************************
// 自動注冊開始 {{{{

/* 子功能全局變量聲明 */
static _U8 m_ucPosIndex = 1;   /* 變量的絕對位置索引 */

/*lint -e715 */
_U32 CT_CmdAutoRegist
              (const _S8 *szCmd,              //命令格式化串
               _U8  ucMode,                   //命令所屬模式
               CLI_OPERAT_LEVEL_T   ucLevel,  //命令使用等級
               CLI_CALLBACK_EXEC_FUN pFunc,   //命令執行函數
               _U8  ucModeChange,             //模式轉換屬性(非模式轉換命令填CT_MC_NULL)
               _U8  ucNewMode,                //新模式的ID  (僅當上一參數為CT_MC_NEW時有意義 )
               _U32 ulHelp1,                  //第一個對象的幫助信息
               _U32 ulHelp2,                  //第二個對象的幫助信息
               _U32 ulHelp3)
{
    (_VOID)ucMode;
    return G_SUCCESS;
}
/*lint -restore */


/*-------------------------------------------------------------------*/
/* 函數名稱 : CT_CmdAutoRegist                                       */
/* 功    能 : 命令自動注冊函數接口                                   */
/* 輸入參數 : 參數說明見函數定義                                     */
/* 輸出參數 : 無                                                     */
/* 返回     : 注冊成功/失敗                                          */
/* 調用說明 : 調用者自己保證命令語法的正確性,詳細說明可以參見命令行  */
/*            說明文檔. 注冊否定形式的命令,須確定該命令的肯定形式已  */
/*            經注冊,如注冊no timeout命令之前應該已經注冊timeout命令 */
/* 典型示例 : CT_CmdAutoRegist("cmdtest user-test: <type(u1~3)>",    */
/*             CTM_DBG, CT_AL_OPERATOR,  CLI_CmdTest4, CT_MC_NULL,   */
/*             NULL_MODE, CLI_ML_NULL,  CLI_ML_NULL,  CLI_ML_NULL ); */
/*-------------------------------------------------------------------*/
_U32 CT_CmdAutoRegistWithLocfun
              (const _S8 *szCmd,              //命令格式化串
               _U8  ucMode,                   //命令所屬模式
               CLI_OPERAT_LEVEL_T   ucLevel,  //命令使用等級
               CLI_CALLBACK_EXEC_FUN pLocFunc,//命令定位函數
               CLI_CALLBACK_EXEC_FUN pFunc,   //命令執行函數
               _U8  ucModeChange,             //模式轉換屬性(非模式轉換命令填CT_MC_NULL)
               _U8  ucNewMode,                //新模式的ID  (僅當上一參數為CT_MC_NEW時有意義 )
               _U32 ulHelp1,                  //第一個對象的幫助信息
               _U32 ulHelp2,                  //第二個對象的幫助信息
               _U32 ulHelp3)
{
    _S8 szCmdString[CT_MAX_CMD_FORMAT + 1];  /* 命令的表達式可以超過命令的實際長度256,暫定上限為1000*/
    _S8 szToken[CT_MAX_CMDLEN];
    _S8 *pCurPos;
    _U32  ulRet, ulIndex = 0;
    _U32  ulHelpID[CT_MAX_OBJECT_NUM], ulCheckID = ML_NULL_STRING_SID;
    _U8   ucIsNoForm = 0;
    CT_OBJECT_P pObject[CT_MAX_OBJECT_NUM], pObj = G_NULL;
    CT_OBJECT_P pFirstObj = G_NULL;
    CT_MODE_T   *sMode;
    CT_PARAMGROUP_P *pParamLink = G_NULL;

    CLI_ASSURE_OR_FAIL(szCmd != G_NULL && EOS_StrLen(szCmd) > 0);

    /* DEBUG模式的命令只能在調試版本中存在 */
#if !CLI_DEBUG_ON
    if (ucMode == CTM_DBG)
        return G_SUCCESS;
#endif

    EOS_StrCpy(szCmdString, szCmd);
    (_VOID)_AffirmStrBeLower(szCmdString);

    /* 命令的注冊語法檢查 */
    if (CT_IsCmdValid(szCmdString) != G_SUCCESS)
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n CLI: 命令格式不正確:%s",szCmd);
        DBG_ASSERT(0);
        return G_FAILURE;
    }

    /* 其它參數合法性檢查 */
    if (ucMode >= MAX_MODE_NUM || ucNewMode >= MAX_MODE_NUM || ucLevel > CT_AL_DEBUG)
    {
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
            "\r\n CLI: 注冊命令存在不合法參數:mode-%d, new mode-%d, level-%d", ucMode, ucNewMode, ucLevel);
        DBG_ASSERT(0);
        return G_FAILURE;
    }

    ulHelpID[0] = ulHelp1;
    ulHelpID[1] = ulHelp2;
    ulHelpID[2] = ulHelp3;

    for (ulIndex = 0; ulIndex < 3; ulIndex++)
    {
        if (ulHelpID[ulIndex] != ML_NULL_STRING_SID)
            ulCheckID = ulHelpID[ulIndex];
    }

    #ifdef PC_LINT
    ulCheckID = ulCheckID;
    #endif

    if(!EOS_StrNCmp(szCmdString, "show ", 5))
        ucLevel = CT_AL_QUERY;

    pCurPos = szCmdString;
    ulIndex = 0;
    /* 如果是否定形式的命令,則命令樹中應該已經存在其肯定形式,
       因此不用再創建對象,而采取搜索對象的形式 */
    if (EOS_StrNCmp("no ", pCurPos, 3) == 0)
    {
        ucIsNoForm = 1;
        pCurPos   += 3;    //跳過"no "
        if ((sMode = CI_GetMode(ucMode)) == G_NULL)
        {
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n CLI: 該命令的肯定形式尚未注冊 : %s", szCmd);
            DBG_ASSERT(0);
            return G_FAILURE;
        }
        pObj = sMode->pObject;   /* 從模式對象開始搜索 */
    }

    /* 注冊對象 */
    while((ulRet = CT_GetObj(pCurPos, szToken)) != G_FAILURE)
    {
        if (ulRet == TOKEN_GET_ONLYSPACE)
        {
            pCurPos++;
            continue;
        }
        if (ulRet == TOKEN_GET_CMDNULL)
        {
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n CLI: 從:%s 中獲取命令字失敗 : %s", szCmd);
            DBG_ASSERT(0);
            return G_FAILURE;
        }

        pCurPos += EOS_StrLen(szToken);

        /* 注冊3個以上對象的命令不成功 */
        if (ulIndex > 2)
        {
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n  CLI: 關鍵命令字過多 : %s!", szCmd);
            DBG_ASSERT(0);
            return G_FAILURE;
        }

        if (EOS_StrLen(szToken) >= MAX_TOKEN_SIZE)
        {
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                    "\r\n  CLI: 超長命令字注冊 : %s!", szToken);
            DBG_ASSERT(0);
            return G_FAILURE;
        }

        /* 肯定形式的對象自動注冊 */
        if (ucIsNoForm == 0)
        {
            if (ulRet == TOKEN_GET_LASTOBJ)
            {
                /* 最后一個命令對象需要處理其操作方法: 回調函數或模式轉換 */
                switch (ucModeChange)
                {
                    case CT_MC_NULL:
                        /* 對于非模式轉換的命令需要保證帶回調函數 */
                        if (pFunc == G_NULL)
                        {
                            DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                                    "\r\n CLI: 命令(%s)\r\n      的對象(%s)沒有執行操作!", szCmd, szToken);
                            DBG_ASSERT(0);
                            return G_FAILURE;
                        }
                        pObject[ulIndex] = CT_CreateObject(szToken, ucMode, ucLevel,
                                        pFunc, G_FALSE, CT_MC_NULL, G_NULL);
                        pObject[ulIndex]->action.pLocFun = pLocFunc;
                        break;
                    /* 以下是對各種模式轉換類型的對象注冊 */
                    case CT_MC_END:
                        pObject[ulIndex] = CT_CreateObject(szToken, ucMode, ucLevel,
                                        pFunc, G_TRUE, CT_MC_END, G_NULL);
                        break;
                    case CT_MC_EXIT:
                        pObject[ulIndex] = CT_CreateObject(szToken, ucMode, ucLevel,
                                        pFunc, G_TRUE, CT_MC_EXIT, G_NULL);
                        break;
                    case CT_MC_NEW:
                        /* 如果是轉換到新模式,需要保證新模式的正確性 */
                        if (ucNewMode == NULL_MODE)
                        {
                            DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                                "\r\n CLI: 模式轉換命令注冊錯誤: 新模式ID: %d", ucNewMode);
                            DBG_ASSERT(0);
                            return G_FAILURE;
                        }

                        pObject[ulIndex] = CT_CreateObject(szToken, ucMode, ucLevel,
                                        pFunc, G_TRUE, CT_MC_NEW, G_NULL);

                        /* 如果是轉換到新模式,還需要將該對象注冊為新模式的模式對象*/
                        if (*pCurPos == ':' || *(pCurPos + 1) == ':')  /*這里需要改進*/
                            CT_RegModeObject(ucNewMode, pObject[ulIndex], 2);
                        else
                            CT_RegModeObject(ucNewMode, pObject[ulIndex], 0);
                        break;
                    default:
                        DBG_ASSERT(0);
                        return G_FAILURE;

                }
                pParamLink = &(pObject[ulIndex]->action.pParamLink);
            }
            else
            {
                pObject[ulIndex] = CT_CreateObject(szToken, ucMode, ucLevel,
                                G_NULL, G_FALSE, CT_MC_NULL, G_NULL);
            }
            if (pObject[ulIndex] == G_NULL)
            {
                DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n CLI: 對象創建失敗: %s", szCmd);
                DBG_ASSERT(0);
                return G_FAILURE;
            }

            if (ulIndex == 0)
            {
                pFirstObj = pObject[ulIndex];
            }
            else
            {
                CT_RegObject(pObject[ulIndex - 1], pObject[ulIndex]);
            }

            if (ucMode != CTM_DBG && ucMode != CTM_DIAG)
            {
                if (ulHelpID[ulIndex] == CLI_ML_NULL)
                {
                    DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                            "\r\n CLI: 命令(%s)\r\n      的對象(%s) 缺少幫助信息!", szCmd, szToken);
                    DBG_ASSERT(0);
                    return G_FAILURE;
                }
                if (((CI_IsObjectExecutable(pObject[ulIndex], HAVEACTIONS) == G_SUCCESS)
                  && (strstr(ML_DirectGetString(ML_CHS, ulHelpID[ulIndex]), HELP_FUN) == G_NULL))
                 || ((CI_IsObjectExecutable(pObject[ulIndex], HAVEACTIONS) != G_SUCCESS)
                  && (strstr(ML_DirectGetString(ML_CHS, ulHelpID[ulIndex]), HELP_FUN) != G_NULL)))
                {
                    if (EOS_StriCmp(szToken, "cm"))
                    {
                        DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                                "\r\n CLI: 命令(%s)\r\n      的對象(%s) 幫助信息格式不正確!", szCmd, szToken);
                        DBG_ASSERT(0);
                        return G_FAILURE;
                    }
                }
            }
            CT_RegCmdHelp(pObject[ulIndex], ulHelpID[ulIndex]);

        }

        /* 否定形式的命令注冊: 自動查找肯定形式的命令并修改其屬性 */
        /* 使之具有命令的否定形式                                 */
        else
        {
            if (ulRet == TOKEN_GET_LASTOBJ)
            {
                pObj = CT_GetSubObjByName(pObj, szToken);

                if (pObj == G_NULL)
                {
                    DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                        "\r\n CLI: 該命令的肯定形式尚未注冊 : %s", szCmd);
                    DBG_ASSERT(0);
                    return G_FAILURE;
                }

                pParamLink = &(pObj->noAction.pParamLink);
                /* 設置該對象的否定屬性 */
                pObj->noAction.ulMode     = pObj->action.ulMode;
                pObj->noAction.rightLevel = pObj->action.rightLevel;
                pObj->noAction.pFunction  = pFunc;
                pObj->ulNoFlag            = 1;
            }
            else
            {
                pObj = CT_GetSubObjByName(pObj, szToken);
                if (pObj == G_NULL)
                {
                    DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
                        "\r\n CLI: 該命令的肯定形式尚未注冊 : %s", szCmd);
                    DBG_ASSERT(0);
                    return G_FAILURE;
                }
                pObj->ulNoFlag = 1;
            }
        }

        ulIndex++;

        /* 如果已經是最后一個對象,則跳出循環 */
        if (ulRet == TOKEN_GET_LASTOBJ)
            break;
    }

    /* 注冊命令到模式必須要在所有對象創建完成之后進行, */
    /* 否則無法注冊具有相同對象的情況                  */
    if (ucIsNoForm == 0)
    {
        if (CT_RegObjToMode(ucMode, pFirstObj))
        {
            DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n CLI: 命令注冊失敗: %s", szCmd);
            DBG_ASSERT(0);
        }
    }
    while (*pCurPos == KEY_SPACE)
        pCurPos++;

    if (*pCurPos != ':')
    {
//        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n【MODE-%d】:%s", ucMode, szCmdString);
        return G_SUCCESS;
    }

    while (*(++pCurPos) == KEY_SPACE)
        ;

    /* 這種情況表示分隔符后面已經沒有參數鏈,直接返回 */
    if (*pCurPos == '\0')
    {
//        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n【MODE-%d】:%s", ucMode, szCmdString);
        return G_SUCCESS;
    }

    if (pParamLink == G_NULL)   /* 此判斷不會進來,消除pc-lint告警 */
    

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲在线观看av| 久久精品欧美一区二区三区麻豆| 奇米色一区二区| 中文字幕+乱码+中文字幕一区| 欧美日韩成人在线一区| 成人教育av在线| 韩国精品免费视频| 亚洲va在线va天堂| 《视频一区视频二区| 久久久亚洲高清| 欧美精品在线一区二区三区| 91在线视频免费91| 国产麻豆成人传媒免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲欧美乱综合| 国产精品网站导航| 国产性色一区二区| 久久久久国产精品麻豆ai换脸| 欧美日韩国产免费一区二区| 日本久久电影网| 丁香六月久久综合狠狠色| 精品一区二区三区免费视频| 午夜影院久久久| 一区二区三区成人| 最新不卡av在线| 久久久久久久网| 26uuu另类欧美| 日韩美女主播在线视频一区二区三区| 欧洲国产伦久久久久久久| av男人天堂一区| 波多野结衣中文字幕一区 | 全部av―极品视觉盛宴亚洲| 亚洲综合免费观看高清完整版在线| 国产亚洲欧美色| 欧美精品一区二区蜜臀亚洲| 欧美成人a∨高清免费观看| 日韩欧美一级二级三级久久久 | 国产精品久久免费看| 亚洲国产精品传媒在线观看| 国产色91在线| 中文字幕欧美一区| 《视频一区视频二区| 亚洲精品午夜久久久| 亚洲色图制服丝袜| 亚洲欧美色综合| 一区二区三区中文字幕精品精品 | 国产精品久久久久影院亚瑟 | 中文字幕av资源一区| 欧美韩日一区二区三区四区| 国产精品入口麻豆原神| 亚洲视频在线一区| 亚洲综合免费观看高清完整版在线| 亚洲精品乱码久久久久久日本蜜臀| 亚洲色图一区二区三区| 一区二区高清在线| 亚洲成人av电影| 青青青爽久久午夜综合久久午夜| 久久99精品久久久久婷婷| 狠狠色综合色综合网络| 粉嫩高潮美女一区二区三区| 99久久久无码国产精品| 91国产丝袜在线播放| 欧美精品第1页| 久久精品视频网| 一区二区三区 在线观看视频| 天堂一区二区在线| 国精品**一区二区三区在线蜜桃| 成人av影视在线观看| 在线一区二区观看| 日韩一二三区视频| 欧美激情在线免费观看| 亚洲电影中文字幕在线观看| 日本视频免费一区| 成人深夜在线观看| 欧美日产在线观看| 久久久久久99久久久精品网站| 亚洲女性喷水在线观看一区| 免费精品视频在线| 91美女片黄在线观看| 日韩一区二区三区四区| ●精品国产综合乱码久久久久| 午夜av区久久| 波多野结衣中文字幕一区二区三区 | 麻豆91小视频| 99久久久久免费精品国产| 欧美人体做爰大胆视频| 久久精品亚洲麻豆av一区二区| 亚洲一级在线观看| 国产成人av一区二区三区在线观看| 色综合久久九月婷婷色综合| 精品日产卡一卡二卡麻豆| 尤物视频一区二区| 国产二区国产一区在线观看| 欧美日韩成人一区| 亚洲色图20p| 国产一区二区三区免费观看| 欧美精品自拍偷拍| 亚洲欧美精品午睡沙发| 国产精品影视在线| 91精品午夜视频| 一区二区视频免费在线观看| 国产精品综合av一区二区国产馆| 色94色欧美sute亚洲线路一久| 精品国产91洋老外米糕| 亚洲成人精品影院| 91视频www| 欧美国产一区二区| 国内精品自线一区二区三区视频| 欧美午夜精品久久久久久孕妇| 国产精品污www在线观看| 激情偷乱视频一区二区三区| 欧美午夜理伦三级在线观看| 国产精品电影一区二区三区| 国产精品夜夜嗨| 欧美成人国产一区二区| 亚洲成av人在线观看| 91一区二区三区在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 久久99精品国产| 欧美电影免费观看高清完整版在线 | 日韩一区二区三区电影| 亚洲自拍偷拍av| 91麻豆国产自产在线观看| 国产精品视频一二三区| 粉嫩aⅴ一区二区三区四区五区| 久久伊人蜜桃av一区二区| 激情综合网av| 久久综合久久99| 国产真实精品久久二三区| 精品电影一区二区| 国产剧情av麻豆香蕉精品| 久久人人爽人人爽| 国产成人免费高清| 中文字幕第一区| 91丨porny丨国产| 亚洲男同性恋视频| 在线观看亚洲成人| 亚洲一区精品在线| 欧美日韩国产美女| 麻豆精品一二三| 久久久精品天堂| 成人一级视频在线观看| 中文字幕一区二区三区在线不卡| av影院午夜一区| 亚洲精品国产视频| 欧美日韩激情在线| 久久精品99久久久| 国产视频视频一区| 91在线视频官网| 亚洲国产aⅴ成人精品无吗| 欧美丰满少妇xxxbbb| 久久97超碰色| 中文字幕乱码亚洲精品一区| 色婷婷综合久久久久中文一区二区| 亚洲一区二区精品久久av| 日韩午夜中文字幕| 国产iv一区二区三区| 亚洲情趣在线观看| 欧美老人xxxx18| 国产一区二区伦理| 亚洲欧美区自拍先锋| 制服丝袜激情欧洲亚洲| 国产精品白丝jk黑袜喷水| 日本一区二区电影| 欧美日韩在线观看一区二区| 看电影不卡的网站| 国产精品灌醉下药二区| 欧美日本在线播放| 丰满放荡岳乱妇91ww| 亚洲一区av在线| 久久久亚洲精华液精华液精华液| 色婷婷一区二区| 国产在线视视频有精品| 国产精品传媒入口麻豆| 欧美精品久久久久久久久老牛影院 | 蜜臀精品久久久久久蜜臀| 久久久www成人免费无遮挡大片 | 日韩一区二区三区高清免费看看 | 日韩一区二区在线看片| 成人h动漫精品| 人人超碰91尤物精品国产| 国产精品大尺度| 日韩免费在线观看| 91视视频在线观看入口直接观看www | 日本一区二区三级电影在线观看 | 亚洲一区在线观看免费观看电影高清 | 久久一区二区视频| 欧美日韩一区二区不卡| 国产成人精品aa毛片| 日本麻豆一区二区三区视频| 亚洲天堂久久久久久久| 久久久久久夜精品精品免费| 精品视频在线看| 成人免费看黄yyy456| 另类中文字幕网| 亚洲影院久久精品| 国产精品国产三级国产aⅴ无密码| 日韩一二三四区| 欧美午夜电影一区| 国产白丝网站精品污在线入口|