1c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* 2c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Copyright (C) 2015 The Android Open Source Project 3c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 4c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License"); 5c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * you may not use this file except in compliance with the License. 6c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * You may obtain a copy of the License at 7c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 8c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * http://www.apache.org/licenses/LICENSE-2.0 9c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 10c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software 11c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS, 12c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * See the License for the specific language governing permissions and 14c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * limitations under the License. 15c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 16c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 1736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet#include <algorithm> 18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <iostream> 19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <sstream> 20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Utilities.h" 22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletusing namespace std; 24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletconst char LEGAL_NOTICE[] = 26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "/*\n" 278293efede2a4d72f0752d5ac567e75e95f2f6b22Miao Wang " * Copyright (C) 2016 The Android Open Source Project\n" 28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " *\n" 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * you may not use this file except in compliance with the License.\n" 31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * You may obtain a copy of the License at\n" 32c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " *\n" 33c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * http://www.apache.org/licenses/LICENSE-2.0\n" 34c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " *\n" 35c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * Unless required by applicable law or agreed to in writing, software\n" 36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 38c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * See the License for the specific language governing permissions and\n" 39c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " * limitations under the License.\n" 40c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet " */\n\n"; 41c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 42c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletconst char AUTO_GENERATED_WARNING[] = 434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet "Don't edit this file! It is auto-generated by frameworks/rs/api/generate.sh."; 44c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 45c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstring capitalize(const string& source) { 46c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int length = source.length(); 47c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string result; 48c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool capitalize = true; 49c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (int s = 0; s < length; s++) { 50c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (source[s] == '_') { 51c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet capitalize = true; 52c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else if (capitalize) { 53c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet result += toupper(source[s]); 54c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet capitalize = false; 55c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 56c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet result += source[s]; 57c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return result; 60c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 61c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletvoid trimSpaces(string* s) { 63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const size_t end = s->find_last_not_of(" "); 64c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (end == string::npos) { 65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // All spaces 66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s->erase(); 67c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s->erase(end + 1); 70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const size_t start = s->find_first_not_of(" "); 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (start > 0) { 73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s->erase(0, start); 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstring stringReplace(string s, string match, string rep) { 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet while (1) { 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // This is not efficient but we don't care, as this program runs very rarely. 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t p = s.find(match); 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (p == string::npos) break; 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s.erase(p, match.size()); 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s.insert(p, rep); 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return s; 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletbool charRemoved(char c, string* s) { 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t p = s->find(c); 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (p != string::npos) { 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s->erase(p, 1); 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstring stripHtml(const string& html) { 994a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string in = stringReplace(html, "<li>", "- "); 1004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string out; 1014a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (size_t start = 0; start < in.size(); start++) { 1024a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet size_t lt = in.find('<', start); 103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (lt == string::npos) { 1044a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet out += in.substr(start); 105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 1074a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet out += in.substr(start, lt - start); 1084a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (isalpha(in[lt + 1]) || in[lt + 1] == '/') { 109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // It's an HTML tag. Search for the end. 1104a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet start = in.find('>', lt + 1); 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (start == string::npos) { 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 1154a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet out += '<'; 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 1184a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet out = stringReplace(out, ">", ">"); 1194a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet out = stringReplace(out, "<", "<"); 1204a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet out = stringReplace(out, " ", " "); 1216386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet out = stringReplace(out, "&", "&"); 1224a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet return out; 123c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstring hashString(const string& s) { 126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet long hash = 0; 127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (size_t i = 0; i < s.length(); i++) { 128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet hash = hash * 43 + s[i]; 129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stringstream stream; 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << "0x" << std::hex << hash << "l"; 132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return stream.str(); 133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletbool testAndSet(const string& flag, set<string>* set) { 136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (set->find(flag) == set->end()) { 137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet set->insert(flag); 138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 142c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdouble maxDoubleForInteger(int numberOfIntegerBits, int mantissaSize) { 144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Double has only 52 bits of precision (53 implied). So for longs, we want 145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * to create smaller values to avoid a round up. Same for floats and halfs. 146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int lowZeroBits = max(0, numberOfIntegerBits - mantissaSize); 14855614d2987a4c69fad2c3c5b18ed4dd738c8fc8bPirama Arumuga Nainar uint64_t l = (0xffffffffffffffff >> (64 - numberOfIntegerBits + lowZeroBits)) 14955614d2987a4c69fad2c3c5b18ed4dd738c8fc8bPirama Arumuga Nainar << lowZeroBits; 150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return (double)l; 151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 15336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet// Add the value to the stream, prefixed with a ", " if needed. 15436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouilletstatic void addCommaSeparated(const string& value, ostringstream* stream, bool* needComma) { 15536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet if (value.empty()) { 15636e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet return; 15736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 15836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet if (*needComma) { 15936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet *stream << ", "; 16036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 16136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet *stream << value; 16236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet *needComma = true; 16336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet} 16436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet 16536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouilletstring makeAttributeTag(const string& userAttribute, const string& additionalAttribute, 16612398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni unsigned int deprecatedApiLevel, const string& deprecatedMessage) { 16736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet ostringstream stream; 16836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet bool needComma = false; 16936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet if (userAttribute[0] == '=') { 17036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet /* If starts with an equal, we don't automatically add additionalAttribute. 17136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet * This is because of the error we made defining rsUnpackColor8888(). 17236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet */ 17336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet addCommaSeparated(userAttribute.substr(1), &stream, &needComma); 17436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } else { 17536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet addCommaSeparated(userAttribute, &stream, &needComma); 17636e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet addCommaSeparated(additionalAttribute, &stream, &needComma); 17736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 17836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet if (deprecatedApiLevel > 0) { 17936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet stream << "\n#if (defined(RS_VERSION) && (RS_VERSION >= " << deprecatedApiLevel << "))\n"; 18036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet addCommaSeparated("deprecated", &stream, &needComma); 18136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet if (!deprecatedMessage.empty()) { 18236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet // Remove any @ that's used for generating documentation cross references. 18336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet string s = deprecatedMessage; 18436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet s.erase(std::remove(s.begin(), s.end(), '@'), s.end()); 18536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet stream << "(\"" << s << "\")"; 18636e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 18736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet stream << "\n#endif\n"; 18836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 18936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet if (stream.tellp() == 0) { 19036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet return ""; 19136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 19236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet return " __attribute__((" + stream.str() + "))"; 19336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet} 19436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Opens the stream. Reports an error if it can't. 19662e099314bb1831035083a50616024ffa6253bdeJean-Luc Brouilletbool GeneratedFile::start(const string& directory, const string& name) { 19762e099314bb1831035083a50616024ffa6253bdeJean-Luc Brouillet const string path = directory + "/" + name; 19862e099314bb1831035083a50616024ffa6253bdeJean-Luc Brouillet open(path.c_str(), ios::out | ios::trunc); 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!is_open()) { 20062e099314bb1831035083a50616024ffa6253bdeJean-Luc Brouillet cerr << "Error. Can't open the output file: " << path << "\n"; 201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletvoid GeneratedFile::writeNotices() { 207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *this << LEGAL_NOTICE; 208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *this << "// " << AUTO_GENERATED_WARNING << "\n\n"; 209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletvoid GeneratedFile::increaseIndent() { 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mIndent.append(string(TAB_SIZE, ' ')); 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletvoid GeneratedFile::decreaseIndent() { 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mIndent.erase(0, TAB_SIZE); 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 218