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; }
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 ); }