void XmlConfig::XmlConfigData::resolveVariables(std::string &val) const { size_t pos_begin = std::string::npos; while(true) { pos_begin = val.rfind("${", pos_begin); if (pos_begin == std::string::npos) { return; } size_t pos_end = val.find('}', pos_begin); std::string name = val.substr(pos_begin + 2, pos_end - pos_begin - 2); if (checkVariableName(name)) { val.replace(pos_begin, pos_end - pos_begin + 1, findVariable(name)); } else { throw std::runtime_error("incorrect variable name format: " + name); } } }
// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function Name: build // Purpose: // Inputs: // Output: // Notes: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // RPNExpression ExpressionBuilder::build() { for (map<string, CustomOperator *>::iterator iter = m_customOperators.begin(); iter != m_customOperators.end(); ++iter) { CustomOperator *pop = (*iter).second; for (int i = 0; i < (int)(pop -> symbol().length()); i++) { list<char>::iterator iter = find(m_validOperatorSymbols.begin(), m_validOperatorSymbols.end(), pop -> symbol()[i]); if (iter == m_validOperatorSymbols.end()) throw new UnparsableExpressionException("" + pop -> symbol() + " is not a valid symbol for an operator please choose from: !,#,ยง,$,&,;,:,~,<,>,|,="); } m_builtInOperators.insert(*iter); } for (map<string, double>::iterator iter = m_variables.begin(); iter != m_variables.end(); ++iter) { string varName = (*iter).first; checkVariableName(varName); if (m_customFunctions.find(varName) != m_customFunctions.end()) throw new UnparsableExpressionException("Variable '" + varName + "' cannot have the same name as a function"); } RPNConverter rpnConverter; RPNExpression rpnExpr = rpnConverter.toRPNExpression(m_expression, m_variables, m_customFunctions, m_builtInOperators); return rpnExpr; }