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
17c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#ifndef ANDROID_RS_API_GENERATOR_UTILITIES_H
18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#define ANDROID_RS_API_GENERATOR_UTILITIES_H
19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <fstream>
21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <set>
22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <string>
23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Capitalizes and removes underscores.  E.g. converts "native_log" to NativeLog.
25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstd::string capitalize(const std::string& source);
26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Trim trailing and leading spaces from a string.
28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletvoid trimSpaces(std::string* s);
29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Replaces in string s all occurences of match with rep.
31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstd::string stringReplace(std::string s, std::string match, std::string rep);
32c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
33c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Removes the character from present. Returns true if the string contained the character.
34c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletbool charRemoved(char c, std::string* s);
35c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Removes HTML references from the string.
37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstd::string stripHtml(const std::string& html);
38c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
39c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Returns a string that's an hexadecimal constant of the hash of the string.
40c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstd::string hashString(const std::string& s);
41c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
42c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Adds a string to a set.  Return true if it was already in.
43c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletbool testAndSet(const std::string& flag, std::set<std::string>* set);
44c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
45c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Returns a double that should be able to be converted to an integer of size
46c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * numberOfIntegerBits.
47c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */
48c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdouble maxDoubleForInteger(int numberOfIntegerBits, int mantissaSize);
49c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
5036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet/* Creates an " __attribute__((...))" tag.  If userAttribute starts with '=', we don't
5136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet * use the additionalAttribute.  An empty string will be returned if there are no attributes.
5236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet */
5336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouilletstd::string makeAttributeTag(const std::string& userAttribute,
5412398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni                             const std::string& additionalAttribute, unsigned int deprecatedApiLevel,
5536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet                             const std::string& deprecatedMessage);
5636e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet
57c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* This class is used to generate one source file.  There will be one instance
58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * for each generated file.
59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */
60c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass GeneratedFile : public std::ofstream {
61c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate:
62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    std::string mIndent;  // The correct spacing at the beginning of each line.
63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    const int TAB_SIZE = 4;
64c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic:
66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Opens the stream.  Reports an error if it can't.
6762e099314bb1831035083a50616024ffa6253bdeJean-Luc Brouillet    bool start(const std::string& directory, const std::string& name);
68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Write copyright notice & auto-generated warning in Java/C style comments.
70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    void writeNotices();
71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    void increaseIndent();               // Increases the new line indentation by 4.
73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    void decreaseIndent();               // Decreases the new line indentation by 4.
74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    void comment(const std::string& s);  // Outputs a multiline comment.
75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Starts a control block.  This works both for Java and C++.
77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    void startBlock() {
78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *this << " {\n";
79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        increaseIndent();
80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    // Ends a control block.
83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    void endBlock(bool addSemicolon = false) {
84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        decreaseIndent();
85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        indent() << "}" << (addSemicolon ? ";" : "") << "\n";
86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    /* Indents the line.  By returning *this, we can use like this:
89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet     *  mOut.ident() << "a = b;\n";
90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet     */
91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    std::ofstream& indent() {
92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *this << mIndent;
93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return *this;
94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    std::ofstream& indentPlus() {
97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        *this << mIndent << std::string(2 * TAB_SIZE, ' ');
98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet        return *this;
99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    }
100c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet};
101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern const char AUTO_GENERATED_WARNING[];
103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif  // ANDROID_RS_API_GENERATOR_UTILITIES_H
105