IResource *ResourceSet::GetOpResource(vm::OpCode op, IValueType &vt) { // Remap. switch (op) { case vm::OP_LT: case vm::OP_LTE: case vm::OP_GTE: op = vm::OP_GT; break; case vm::OP_NE: op = vm::OP_EQ; break; default: break; } // Use default type value as the key. IValueType key_vt; if (!(op == vm::OP_CONCAT || op == vm::OP_BIT_RANGE || op == vm::OP_LSHIFT || op == vm::OP_RSHIFT)) { key_vt = vt; } for (auto &res : resources_) { if (res.op == op && key_vt.GetWidth() == res.vt.GetWidth()) { return res.resource; } } ResourceEntry res; string rcn = GetResourceClassName(op); IResourceClass *rc = DesignUtil::FindResourceClass(tab_->GetModule()->GetDesign(), rcn); IResource *ires = new IResource(tab_, rc); tab_->resources_.push_back(ires); PopulateResourceDataType(op, vt, ires); res.op = op; res.vt = key_vt; return ires; }
// --[ Method ]--------------------------------------------------------------- // // - Class : CEffect // - prototype : bool Parse(CAdvancedParser* pParser) // // - Purpose : Parses an effect. The parser has only the text data of // the effect, not of the whole script. // // ----------------------------------------------------------------------------- bool CEffect::Parse(CAdvancedParser* pParser) { assert(pParser); assert(pParser->Ready()); // General info pParser->ResetPos(); if(!pParser->ReadKeyFloat("#Begin", '=', &m_fBegin, CParser::SEARCH_WHOLEDATA)) return false; if(!pParser->ReadKeyFloat("#End", '=', &m_fEnd, CParser::SEARCH_WHOLEDATA)) return false; if(!pParser->ReadKeyInt ("#Layer", '=', &m_nLayer, CParser::SEARCH_WHOLEDATA)) return false; // Resources int nError = 0; pParser->ResetPos(); while(-1 != pParser->Find("#Resource", CParser::SEARCH_FROMCURPOS)) { std::string strClass, strName, strValue; if(!pParser->ReadKeyString("#Name", '=', &strName, CParser::SEARCH_INCURLINE)) nError++; if(!pParser->ReadKeyString("#Class", '=', &strClass, CParser::SEARCH_INCURLINE)) nError++; if(!pParser->ReadKeyString("#Value", '=', &strValue, CParser::SEARCH_INCURLINE)) nError++; if(nError) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing resource."); return false; } int i = GetResourceIndex(strName); if(i == -1) { LOG.Write("\nERROR - CEffect::Parse(): Resource \"%s\" doesn't belong to this effect.", strName.data()); return false; } std::string strClassAux; GetResourceClassName(i, &strClassAux); if(strClassAux != strClass) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing resource \"%s\". Class=%s (expected %s)", strName.data(), strClass.data(), strClassAux.data()); return false; } if(!SetResourceValue(i, strValue)) { LOG.Write("\nERROR - CEffect::Parse(): Error setting resource \"%s\" value.", strName.data()); return false; } } // Variables pParser->ResetPos(); while(-1 != pParser->Find("#Var", CParser::SEARCH_FROMCURPOS)) { std::string strClass, strName; if(!pParser->ReadKeyString("#Name", '=', &strName, CParser::SEARCH_INCURLINE)) nError++; if(!pParser->ReadKeyString("#Class", '=', &strClass, CParser::SEARCH_INCURLINE)) nError++; if(nError) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var."); return false; } CVar* pVar = GetVar(strName); if(!pVar) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var. \"%s\" doesn't belong to this effect", strName.data()); return false; } if(pVar->GetClassName() != strClass) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var \"%s\". Class=%s (expected %s)", strName.data(), strClass.data(), pVar->GetClassName().data()); return false; } if(!pVar->Parse(pParser)) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing var \"%s\" (CVar::Parse() failed).", strName.data()); return false; } } // Commands pParser->ResetPos(); while(-1 != pParser->Find("#Command", CParser::SEARCH_FROMCURPOS)) { std::string strCommand; float fTime; if(!pParser->ReadStringBetweenChars('<', '>', &strCommand, CParser::SEARCH_INCURLINE, true)) nError++; if(!pParser->ReadKeyFloat ("#Time", '=', &fTime, CParser::SEARCH_INCURLINE)) nError++; if(nError) { LOG.Write("\nERROR - CEffect::Parse(): Error parsing command."); return false; } AddCommand(fTime, strCommand); } return true; }