/* * Fetch a collection from the target VM. */ static unqlite_col * unqliteVmFetchCollection( unqlite_vm *pVm, /* Target VM */ SyString *pName /* Lookup name */ ) { unqlite_col *pCol; sxu32 nHash; if( pVm->iCol < 1 ){ /* Don't bother hashing */ return 0; } nHash = SyBinHash((const void *)pName->zString,pName->nByte); /* Perform the lookup */ pCol = pVm->apCol[nHash & ( pVm->iColSize - 1)]; for(;;){ if( pCol == 0 ){ break; } if( nHash == pCol->nHash && SyStringCmp(pName,&pCol->sName,SyMemcmp) == 0 ){ /* Collection found */ return pCol; } /* Point to the next entry */ pCol = pCol->pNextCol; } /* No such collection */ return 0; }
/* * Check if the given token is a potential operator or not. * This function is called by the lexer each time it extract a token that may * look like an operator. * Return a structure [i.e: jx9_expr_op instnace ] that describe the operator on success. * Otherwise NULL. * Note that the function take care of handling ambiguity [i.e: whether we are dealing with * a binary minus or unary minus.] */ JX9_PRIVATE const jx9_expr_op * jx9ExprExtractOperator(SyString *pStr, SyToken *pLast) { sxu32 n = 0; sxi32 rc; /* Do a linear lookup on the operators table */ for(;;){ if( n >= SX_ARRAYSIZE(aOpTable) ){ break; } rc = SyStringCmp(pStr, &aOpTable[n].sOp, SyMemcmp); if( rc == 0 ){ if( aOpTable[n].sOp.nByte != sizeof(char) || (aOpTable[n].iOp != EXPR_OP_UMINUS && aOpTable[n].iOp != EXPR_OP_UPLUS) || pLast == 0 ){ if( aOpTable[n].iOp == EXPR_OP_SUBSCRIPT && (pLast == 0 || (pLast->nType & (JX9_TK_ID|JX9_TK_CSB/*]*/|JX9_TK_RPAREN/*)*/)) == 0) ){ /* JSON Array not subscripting, return NULL */ return 0; } /* There is no ambiguity here, simply return the first operator seen */ return &aOpTable[n]; } /* Handle ambiguity */ if( pLast->nType & (JX9_TK_LPAREN/*'('*/|JX9_TK_OCB/*'{'*/|JX9_TK_OSB/*'['*/|JX9_TK_COLON/*:*/|JX9_TK_COMMA/*, '*/) ){ /* Unary opertors have prcedence here over binary operators */ return &aOpTable[n]; } if( pLast->nType & JX9_TK_OP ){ const jx9_expr_op *pOp = (const jx9_expr_op *)pLast->pUserData; /* Ticket 1433-31: Handle the '++', '--' operators case */ if( pOp->iOp != EXPR_OP_INCR && pOp->iOp != EXPR_OP_DECR ){ /* Unary opertors have prcedence here over binary operators */ return &aOpTable[n]; } } } ++n; /* Next operator in the table */ } /* No such operator */ return 0; }