github.com/google/syzkaller@v0.0.0-20240517125934-c0f1611a36d6/executor/_include/flatbuffers/code_generators.h (about) 1 /* 2 * Copyright 2014 Google Inc. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef FLATBUFFERS_CODE_GENERATORS_H_ 18 #define FLATBUFFERS_CODE_GENERATORS_H_ 19 20 #include <map> 21 #include <sstream> 22 23 #include "flatbuffers/idl.h" 24 25 namespace flatbuffers { 26 27 // Utility class to assist in generating code through use of text templates. 28 // 29 // Example code: 30 // CodeWriter code("\t"); 31 // code.SetValue("NAME", "Foo"); 32 // code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; 33 // code.SetValue("NAME", "Bar"); 34 // code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; 35 // std::cout << code.ToString() << std::endl; 36 // 37 // Output: 38 // void Foo() { printf("%s", "Foo"); } 39 // void Bar() { printf("%s", "Bar"); } 40 class CodeWriter { 41 public: 42 CodeWriter(std::string pad = std::string()) 43 : pad_(pad), cur_ident_lvl_(0), ignore_ident_(false) {} 44 45 // Clears the current "written" code. 46 void Clear() { 47 stream_.str(""); 48 stream_.clear(); 49 } 50 51 // Associates a key with a value. All subsequent calls to operator+=, where 52 // the specified key is contained in {{ and }} delimiters will be replaced by 53 // the given value. 54 void SetValue(const std::string &key, const std::string &value) { 55 value_map_[key] = value; 56 } 57 58 std::string GetValue(const std::string &key) const { 59 const auto it = value_map_.find(key); 60 return it == value_map_.end() ? "" : it->second; 61 } 62 63 // Appends the given text to the generated code as well as a newline 64 // character. Any text within {{ and }} delimiters is replaced by values 65 // previously stored in the CodeWriter by calling SetValue above. The newline 66 // will be suppressed if the text ends with the \\ character. 67 void operator+=(std::string text); 68 69 // Returns the current contents of the CodeWriter as a std::string. 70 std::string ToString() const { return stream_.str(); } 71 72 // Increase ident level for writing code 73 void IncrementIdentLevel() { cur_ident_lvl_++; } 74 // Decrease ident level for writing code 75 void DecrementIdentLevel() { 76 if (cur_ident_lvl_) cur_ident_lvl_--; 77 } 78 79 void SetPadding(const std::string &padding) { pad_ = padding; } 80 81 private: 82 std::map<std::string, std::string> value_map_; 83 std::stringstream stream_; 84 std::string pad_; 85 int cur_ident_lvl_; 86 bool ignore_ident_; 87 88 // Add ident padding (tab or space) based on ident level 89 void AppendIdent(std::stringstream &stream); 90 }; 91 92 class BaseGenerator { 93 public: 94 virtual bool generate() = 0; 95 96 static std::string NamespaceDir(const Parser &parser, const std::string &path, 97 const Namespace &ns, 98 const bool dasherize = false); 99 100 std::string GeneratedFileName(const std::string &path, 101 const std::string &file_name, 102 const IDLOptions &options) const; 103 104 protected: 105 BaseGenerator(const Parser &parser, const std::string &path, 106 const std::string &file_name, std::string qualifying_start, 107 std::string qualifying_separator, std::string default_extension) 108 : parser_(parser), 109 path_(path), 110 file_name_(file_name), 111 qualifying_start_(qualifying_start), 112 qualifying_separator_(qualifying_separator), 113 default_extension_(default_extension) {} 114 virtual ~BaseGenerator() {} 115 116 // No copy/assign. 117 BaseGenerator &operator=(const BaseGenerator &); 118 BaseGenerator(const BaseGenerator &); 119 120 std::string NamespaceDir(const Namespace &ns, 121 const bool dasherize = false) const; 122 123 static const char *FlatBuffersGeneratedWarning(); 124 125 static std::string FullNamespace(const char *separator, const Namespace &ns); 126 127 static std::string LastNamespacePart(const Namespace &ns); 128 129 // tracks the current namespace for early exit in WrapInNameSpace 130 // c++, java and csharp returns a different namespace from 131 // the following default (no early exit, always fully qualify), 132 // which works for js and php 133 virtual const Namespace *CurrentNameSpace() const { return nullptr; } 134 135 // Ensure that a type is prefixed with its namespace even within 136 // its own namespace to avoid conflict between generated method 137 // names and similarly named classes or structs 138 std::string WrapInNameSpace(const Namespace *ns, 139 const std::string &name) const; 140 141 std::string WrapInNameSpace(const Definition &def, 142 const std::string &suffix = "") const; 143 144 std::string GetNameSpace(const Definition &def) const; 145 146 const Parser &parser_; 147 const std::string &path_; 148 const std::string &file_name_; 149 const std::string qualifying_start_; 150 const std::string qualifying_separator_; 151 const std::string default_extension_; 152 }; 153 154 struct CommentConfig { 155 const char *first_line; 156 const char *content_line_prefix; 157 const char *last_line; 158 }; 159 160 extern void GenComment(const std::vector<std::string> &dc, 161 std::string *code_ptr, const CommentConfig *config, 162 const char *prefix = ""); 163 164 class FloatConstantGenerator { 165 public: 166 virtual ~FloatConstantGenerator() {} 167 std::string GenFloatConstant(const FieldDef &field) const; 168 169 private: 170 virtual std::string Value(double v, const std::string &src) const = 0; 171 virtual std::string Inf(double v) const = 0; 172 virtual std::string NaN(double v) const = 0; 173 174 virtual std::string Value(float v, const std::string &src) const = 0; 175 virtual std::string Inf(float v) const = 0; 176 virtual std::string NaN(float v) const = 0; 177 178 template<typename T> 179 std::string GenFloatConstantImpl(const FieldDef &field) const; 180 }; 181 182 class SimpleFloatConstantGenerator : public FloatConstantGenerator { 183 public: 184 SimpleFloatConstantGenerator(const char *nan_number, 185 const char *pos_inf_number, 186 const char *neg_inf_number); 187 188 private: 189 std::string Value(double v, 190 const std::string &src) const FLATBUFFERS_OVERRIDE; 191 std::string Inf(double v) const FLATBUFFERS_OVERRIDE; 192 std::string NaN(double v) const FLATBUFFERS_OVERRIDE; 193 194 std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; 195 std::string Inf(float v) const FLATBUFFERS_OVERRIDE; 196 std::string NaN(float v) const FLATBUFFERS_OVERRIDE; 197 198 const std::string nan_number_; 199 const std::string pos_inf_number_; 200 const std::string neg_inf_number_; 201 }; 202 203 // C++, C#, Java like generator. 204 class TypedFloatConstantGenerator : public FloatConstantGenerator { 205 public: 206 TypedFloatConstantGenerator(const char *double_prefix, 207 const char *single_prefix, const char *nan_number, 208 const char *pos_inf_number, 209 const char *neg_inf_number = ""); 210 211 private: 212 std::string Value(double v, 213 const std::string &src) const FLATBUFFERS_OVERRIDE; 214 std::string Inf(double v) const FLATBUFFERS_OVERRIDE; 215 216 std::string NaN(double v) const FLATBUFFERS_OVERRIDE; 217 218 std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; 219 std::string Inf(float v) const FLATBUFFERS_OVERRIDE; 220 std::string NaN(float v) const FLATBUFFERS_OVERRIDE; 221 222 std::string MakeNaN(const std::string &prefix) const; 223 std::string MakeInf(bool neg, const std::string &prefix) const; 224 225 const std::string double_prefix_; 226 const std::string single_prefix_; 227 const std::string nan_number_; 228 const std::string pos_inf_number_; 229 const std::string neg_inf_number_; 230 }; 231 232 } // namespace flatbuffers 233 234 #endif // FLATBUFFERS_CODE_GENERATORS_H_