/*------------------------------------------------------------------------- * drawElements Quality Program Tester Core * ---------------------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief String template class. *//*--------------------------------------------------------------------*/ #include "tcuStringTemplate.hpp" #include "tcuDefs.hpp" #include <sstream> using std::string; using std::map; using std::ostringstream; namespace tcu { StringTemplate::StringTemplate (void) { } StringTemplate::StringTemplate (const std::string& str) { setString(str); } StringTemplate::~StringTemplate (void) { } void StringTemplate::setString (const std::string& str) { m_template = str; } string StringTemplate::specialize (const map<string, string>& params) const { ostringstream res; size_t curNdx = 0; for (;;) { size_t paramNdx = m_template.find("${", curNdx); if (paramNdx != string::npos) { // Append in-between stuff. res << m_template.substr(curNdx, paramNdx - curNdx); // Find end-of-param. size_t paramEndNdx = m_template.find("}", paramNdx); if (paramEndNdx == string::npos) TCU_THROW(InternalError, "No '}' found in template parameter"); // Parse parameter contents. string paramStr = m_template.substr(paramNdx+2, paramEndNdx-2-paramNdx); bool paramSingleLine = false; bool paramOptional = false; string paramName; size_t colonNdx = paramStr.find(":"); if (colonNdx != string::npos) { paramName = paramStr.substr(0, colonNdx); string flagsStr = paramStr.substr(colonNdx+1); if (flagsStr == "single-line") { paramSingleLine = true; } else if (flagsStr == "opt") { paramOptional = true; } else { TCU_THROW(InternalError, (string("Unrecognized flag") + paramStr).c_str()); } } else paramName = paramStr; // Fill in parameter value. if (params.find(paramName) != params.end()) { const string& val = (*params.find(paramName)).second; if (paramSingleLine) { string tmp = val; for (size_t ndx = tmp.find("\n"); ndx != string::npos; ndx = tmp.find("\n")) tmp = tmp.replace(ndx, 1, " "); res << tmp; } else res << val; } else if (!paramOptional) TCU_THROW(InternalError, (string("Value for parameter '") + paramName + "' not found in map").c_str()); // Skip over template. curNdx = paramEndNdx + 1; } else { if (curNdx < m_template.length()) res << &m_template[curNdx]; break; } } return res.str(); } } // tcu