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, "&gt;", ">");
1194a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    out = stringReplace(out, "&lt;", "<");
1204a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet    out = stringReplace(out, "&nbsp;", " ");
1216386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet    out = stringReplace(out, "&amp;", "&");
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