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