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

📄 cli_interpret.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
                        else if ( EOS_StriCmp( szToken, "" ) != 0 )
                        {
                            EOS_Sprintf(szToken, "%d", uVal);
                        }
                    }
                }
                break;
        /* Value of Hex Integer Type */
        case CT_DATA_VHK    :
        case CT_DATA_VH     :
                bValueMatched = ((_U32)_isxdecstr(szToken) == G_SUCCESS) ;
                if( G_TRUE == bValueMatched )
                {
                    if(CT_VALUE_USER_CHECK(pexpP->pValue))
                    {
                        bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                    }
                    else if((pexpP->pValue->valueType.ucAttrib & CT_VALPROP_CHECK))
                    {
                        if((_U32)_VerifyAndCvtDwordH(szToken,
                            (_U32)pexpP->pValue->s32IntFilter[0],
                            (_U32)pexpP->pValue->s32IntFilter[1],
                            &uVal) != G_SUCCESS)
                        {
                            /* Match failed */
                            bValueMatched = G_FALSE;
                            ulMlInfo = CLI_HEX_OVERFLOW;
                        }
                    }
                }
                break;

        /* Value of String Type */
        case CT_DATA_VS     :
                if(CT_VALUE_USER_CHECK(pexpP->pValue))
                {
                    bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else
                {
                    if(EOS_StrLen(szToken) == 0)
                        break;

                    bValueMatched = G_TRUE;
                    if((pexpP->pValue->valueType.ucAttrib & CT_VALPROP_CHECK))
                    {
                        if( (pexpP->pValue->valueType.ucDataLen > 0)
                            && (EOS_StrLen(szToken) > pexpP->pValue->valueType.ucDataLen) )
                        {
                            bValueMatched = G_FALSE;
                            ulMlInfo = CLI_STRING_TOO_LONG;
                            break;
                        }
                        for (i = 0; szToken[i] != '\0'; i++)
                        {
                            if ((szToken[i] == '&' )
                             || (szToken[i] == '#' )
                             || (szToken[i] == '`' ))
                            {
                                bValueMatched = G_FALSE;
                                ulMlInfo = CLI_STRING_INVALID;
                                break;
                            }
                        }
                    }

                }
                break;
        /* Keyword Value Type */
        case CT_DATA_K      :
                if(CT_VALUE_USER_CHECK(pexpP->pValue))
                {
                    bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else
                {
                    bValueMatched = ((_U32)_isempty(szToken)!=G_SUCCESS) ;
                    if( G_TRUE == bValueMatched )
                    {
                        pKeyword = pexpP->pValue->keywords.pKeyword;
                        if(CI_MatchKeywords(szToken,pKeyword,pPointer) == G_SUCCESS)
                        {
                            if(pPointer->ucMatchFlag == CTMF_FULL)
                                break ;
                        }
                        else
                        {
                            bValueMatched = G_FALSE;
                            ulMlInfo = CLI_INVALID_KEY;
                        }
                    }
                }
                break;

        /* Host IP Address Type */
        case CT_DATA_IPK     :
        case CT_DATA_IP      :
                if(CT_VALUE_USER_CHECK(pexpP->pValue))
                {
                    bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else if((pexpP->pValue->valueType.ucAttrib & CT_VALPROP_CHECK))
                {
                    if(_VerifyGeneralIPAddress(szToken) != G_SUCCESS)
                    {
                        /* Match failed */
                        bValueMatched = G_FALSE;
                        ulMlInfo = CLI_INVALID_IP;
                    }
                    else bValueMatched = G_TRUE;
                }

                break;

        /* MAC Address Type */
        case CT_DATA_MACK     :
        case CT_DATA_MAC      :
                if(CT_VALUE_USER_CHECK(pexpP->pValue))
                {
                    bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else if((pexpP->pValue->valueType.ucAttrib & CT_VALPROP_CHECK))
                {
                    if(_VerifyMACAddress(szToken) != G_SUCCESS)
                    {
                        /* Match failed */
                        bValueMatched = G_FALSE;
                        ulMlInfo = CLI_INVALID_MAC;
                    }
                    else bValueMatched = G_TRUE;

                }
                break;
        /* MASK Address Type */
        case CT_DATA_MASK      :
                if(CT_VALUE_USER_CHECK(pexpP->pValue))
                {
                    bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else if((pexpP->pValue->valueType.ucAttrib & CT_VALPROP_CHECK))
                {
                    if(_VerifyMASKAddress(szToken) != G_SUCCESS)
                    {
                        /* Match failed */
                        bValueMatched = G_FALSE;
                        ulMlInfo = CLI_INVALID_MASK;
                    }
                    else bValueMatched = G_TRUE;

                }

                break;

        /* DATE Type */
        case CT_DATA_DATE   :
                if(CT_VALUE_USER_CHECK(pexpP->pValue))
                {
                    bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else if((pexpP->pValue->valueType.ucAttrib & CT_VALPROP_CHECK))
                {
                    if(_VerifyDate(szToken) != G_SUCCESS)
                    {
                        /* Match failed */
                        bValueMatched = G_FALSE;
                        ulMlInfo = CLI_INVALID_DATE;
                    }
                    else bValueMatched = G_TRUE;

                }
                break;

        /* TIME Type */
        case CT_DATA_TIME   :
                if(CT_VALUE_USER_CHECK(pexpP->pValue))
                {
                    bValueMatched = (pexpP->pValue->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else if((pexpP->pValue->valueType.ucAttrib & CT_VALPROP_CHECK))
                {
                    if(_VerifyTime(szToken) != G_SUCCESS)
                    {
                        /* Match failed */
                        bValueMatched = G_FALSE;
                        ulMlInfo = CLI_INVALID_TIME;
                    }
                    else bValueMatched = G_TRUE;

                }
                break;

        default :
                if(CT_ValidateUserType(pexpP->pValue->valueType.ucDataType) == G_SUCCESS)
                {
                    bValueMatched =
                        (CT_GetUserType(pexpP->pValue->valueType.ucDataType)->pCheckFunc(szToken,G_NULL,pPointer->pWS) == G_SUCCESS);
                }
                else
                {
                    MT_ERRLOG(ucDataType);
                    IO_OutString(" [VALUE=^") ;
                    IO_OutString( szToken );
                    IO_OutString("]");
                    return G_FAILURE;
                }
    } /* end of switch block */

    if (bValueMatched != G_TRUE
     && (ucDataType == CT_DATA_VIK || ucDataType == CT_DATA_VUK || ucDataType == CT_DATA_VHK
      || ucDataType == CT_DATA_IPK || ucDataType == CT_DATA_MACK))
    {
        bValueMatched = ((_U32)_isempty(szToken) != G_SUCCESS) ;
        if( G_TRUE == bValueMatched )
        {
            pKeyword = pexpP->pValue->keywords.pKeyword;
            if(CI_MatchKeywords(szToken,pKeyword,pPointer) != G_SUCCESS)
            {
                bValueMatched = G_FALSE;
            }
        }
    }

    if( bValueMatched == G_TRUE )
    {
        if( IS_VIRTUAL_P( *pulStatus ) )
        {
            CLR_VIRTUAL_P( *pulStatus );
        }

        COPY_POINTER_TO_CUR( pPointer );
        if(CT_VALUE_IS_MUTEX(pexpP->pValue))
            SET_MUTEXVALUE(*pulStatus);
        if( (CI_SaveParameter( szToken, pexpP->pValue->szName,
                    ulIndex, pPointer->pWS ) != G_SUCCESS )
           && (!IS_ENV_SILENT(*pulStatus)))
        {

            IO_Print(CLI_PARAM_CANNOT_SAVE, szToken, ulIndex);
            return G_FAILURE;
        }

        if (szTmpToken[0][0] != 0)
            EOS_StrCpy(szToken, szTmpToken[0]) ;
    }
    else  /* not matched */
    {
        if( !IS_INTERACTIVE(*pulStatus) )
        {
            if((!IS_ENV_SILENT(*pulStatus)))
            {
                if (ulMlInfo != CLI_ML_NULL)
                    IO_Print(ulMlInfo);
                return G_FAILURE;
            }
        } /* if !IS_INTERACTIVE */
        else
        {
            if (*szToken != 0)
            {
                if(!IS_ENV_SILENT(*pulStatus))
                {
                    if (ulMlInfo != CLI_ML_NULL)
                        IO_Print(ulMlInfo);
                }
                return G_FAILURE;
            }

            if( (CT_VALUE_IS_OPTIONAL(pexpP->pValue)
                || IS_VIRTUAL_P(*pulStatus))||((CT_VALUE_IS_MUTEX(pexpP->pValue))
                 && (pexpP->pValue->pNext != G_NULL)
                 && CT_VALUE_IS_MUTEX(pexpP->pValue->pNext)))
            {
                SET_SKIP_FLAG(*pulStatus);
                COPY_POINTER_TO_CUR( pPointer );
                return G_SUCCESS;
            }
            else if(!IS_ENV_SILENT(*pulStatus))
            {
                if (ulMlInfo != CLI_ML_NULL)
                    IO_Print(ulMlInfo);
                return G_FAILURE;
            }
        } /* else IS_INTERACTIVE */
        return G_FAILURE;
    } /* if-block for fValueMatched*/

    SET_MATCHSUCC(*pulStatus);
    return G_SUCCESS;

} /* End of Function CI_CheckElementValue() */


/*********************************************************************/
/* 函数名称 : CI_CheckElementParameter()                             */
/* 函数功能 : 检验命令字的合法性                                     */
/* 输入参数 : szToken   当前的命令字                                 */
/*            pPointer  命令解释核心结构                             */
/*            pulStatus 命令解释状态                                 */
/* 输出参数 : pulStatus 命令解释状态                                 */
/* 返回     : 成功、失败                                             */
/* 上层函数 : CI_CheckElement                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CI_CheckElement(_S8 *szToken, CI_POINTER_P pPointer, _U32 *pulStatus)
{
    _U32 rc;     /* return code */
    _U32 ulSts;

    CLR_SKIP_FLAG(*pulStatus);
    ulSts = *pulStatus;

    CLR_MATCHSUCC(*pulStatus);
    if(IS_WAIT_NULL(ulSts))
    {
        IO_OutString("\r\n Command Interpreter status error(waiting null element)! (Program Error)") ;
        MT_ERRLOG(*pulStatus);
        rc = 1;
    }
    else if(IS_WAIT_OBJ(ulSts))
    {
        rc = CI_CheckElementObject(szToken, pPointer, pulStatus );
    }
    else if(IS_WAIT_PARAM(ulSts))
    {
        rc = CI_CheckElementParameter(szToken, pPointer, pulStatus );
    }
    else if(IS_WAIT_VALUE(ulSts))
    {
        rc = CI_CheckElementValue(szToken, pPointer, pulStatus );
    }
    else
    {
        MT_ERRLOG(*pulStatus);
        return G_FAILURE;
    }

    return rc;

} /* End of Function CI_CheckElement() */
/*※※※※※※※※※※※※※※*/
/* 【3】命令的可执行性分析    */
/*※※※※※※※※※※※※※※*/
/*********************************************************************/
/* 函数名称 : CI_UserPermitted()                                     */
/* 函数功能 : 检验执行该命令的用户权限                               */
/* 输入参数 : ulLevel   用户级别                                     */
/*            pObject   所检验的对象                                 */
/*            ulStatus  命令解释的状态                               */
/* 输出参数 : 无                                                     */
/* 返回     : 成功、失败                                             */
/* 上层函数 : CI_IntpKernelProc                                      */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CI_User

⌨️ 快捷键说明

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