예제 #1
0
static int  shortCurcuit(ExprToken *&pTok)
{
    if (!pTok)
        return 0;
    pTok = pTok->next();
    int type = pTok->getType();
    switch (type)
    {
    case ExprToken::EXP_STRING:
    case ExprToken::EXP_FMT:
    case ExprToken::EXP_REGEX:
        break;
    case ExprToken::EXP_AND:
    case ExprToken::EXP_OR:
        shortCurcuit(pTok);
    //Fall through
    case ExprToken::EXP_NOT:
        shortCurcuit(pTok);
        break;
    case ExprToken::EXP_EQ:
    case ExprToken::EXP_NE:
    case ExprToken::EXP_LE:
    case ExprToken::EXP_LESS:
    case ExprToken::EXP_GE:
    case ExprToken::EXP_GREAT:
        pTok = pTok->next();
        if (pTok)
            pTok = pTok->next();
        break;
    }
    return 1;
}
예제 #2
0
int SSIEngine::evalOperator( HttpSession *pSession, ExprToken * &pTok )
{
    char *  p1 = NULL;
    int     len;
    int     ret;
    if ( !pTok )
        return 0;
    int type = pTok->getType();
    ExprToken * pCur = pTok;
    pTok = pTok->next();
    switch( type )
    {
    case ExprToken::EXP_STRING:
        return ( pCur->getStr()->len() > 0 );
    case ExprToken::EXP_FMT:
    {
        char achBuf1[40960];
        p1 = achBuf1;
        len = 40960;
        RequestVars::buildString( pCur->getFormat(), pSession, p1, len, 0,
             pSession->getReq()->getSSIRuntime()->getRegexResult() );
        return len > 0;
    }
    case ExprToken::EXP_REGEX:
        return 0;
    case ExprToken::EXP_NOT:
        if ( pTok )
        {
            return !evalOperator( pSession, pTok );
        }
        else
            return 1;
    default:
        break;
    }

    if (( type == ExprToken::EXP_AND )||
        ( type == ExprToken::EXP_OR ))
    {
        ret = evalOperator( pSession, pTok );
        if ((( ret )&&( pTok->getType() == ExprToken::EXP_OR ))||
            (( !ret )&&( pTok->getType() == ExprToken::EXP_AND )))
        {
            if ( pTok )
            {
                shortCurcuit( pTok );
            }
            return ret;
        }
        ret = evalOperator( pSession, pTok );
        return ret;
    }
    if ( !pTok )
        return 0;
    return compString( pSession, type, pTok );
}