1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program Tester Core 3 * ---------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief String template class. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "tcuStringTemplate.hpp" 25 #include "tcuDefs.hpp" 26 27 #include <sstream> 28 29 using std::string; 30 using std::map; 31 using std::ostringstream; 32 33 namespace tcu 34 { 35 36 StringTemplate::StringTemplate (void) 37 { 38 } 39 40 StringTemplate::StringTemplate (const std::string& str) 41 { 42 setString(str); 43 } 44 45 StringTemplate::~StringTemplate (void) 46 { 47 } 48 49 void StringTemplate::setString (const std::string& str) 50 { 51 m_template = str; 52 } 53 54 string StringTemplate::specialize (const map<string, string>& params) const 55 { 56 ostringstream res; 57 58 size_t curNdx = 0; 59 for (;;) 60 { 61 size_t paramNdx = m_template.find("${", curNdx); 62 if (paramNdx != string::npos) 63 { 64 // Append in-between stuff. 65 res << m_template.substr(curNdx, paramNdx - curNdx); 66 67 // Find end-of-param. 68 size_t paramEndNdx = m_template.find("}", paramNdx); 69 if (paramEndNdx == string::npos) 70 TCU_THROW(InternalError, "No '}' found in template parameter"); 71 72 // Parse parameter contents. 73 string paramStr = m_template.substr(paramNdx+2, paramEndNdx-2-paramNdx); 74 bool paramSingleLine = false; 75 bool paramOptional = false; 76 string paramName; 77 size_t colonNdx = paramStr.find(":"); 78 if (colonNdx != string::npos) 79 { 80 paramName = paramStr.substr(0, colonNdx); 81 string flagsStr = paramStr.substr(colonNdx+1); 82 if (flagsStr == "single-line") 83 { 84 paramSingleLine = true; 85 } 86 else if (flagsStr == "opt") 87 { 88 paramOptional = true; 89 } 90 else 91 { 92 TCU_THROW(InternalError, (string("Unrecognized flag") + paramStr).c_str()); 93 } 94 } 95 else 96 paramName = paramStr; 97 98 // Fill in parameter value. 99 if (params.find(paramName) != params.end()) 100 { 101 const string& val = (*params.find(paramName)).second; 102 if (paramSingleLine) 103 { 104 string tmp = val; 105 for (size_t ndx = tmp.find("\n"); ndx != string::npos; ndx = tmp.find("\n")) 106 tmp = tmp.replace(ndx, 1, " "); 107 res << tmp; 108 } 109 else 110 res << val; 111 } 112 else if (!paramOptional) 113 TCU_THROW(InternalError, (string("Value for parameter '") + paramName + "' not found in map").c_str()); 114 115 // Skip over template. 116 curNdx = paramEndNdx + 1; 117 } 118 else 119 { 120 if (curNdx < m_template.length()) 121 res << &m_template[curNdx]; 122 123 break; 124 } 125 } 126 127 return res.str(); 128 } 129 130 } // tcu 131