#pragma once #include "CodegenConfig.hpp" #include "CodegenDecl.hpp" #include "CodegenOutput.hpp" #include #include #include // I give up, hopefully nothing overflows this buffer // TODO handle buffer sizing properly #define INPLACE_FMT(varName, format, ...) \ char varName[2048]; \ snprintf(varName, sizeof(varName), format, __VA_ARGS__); #define APPEND_LIT(out, str) \ out += str #define APPEND_FMT(out, format, ...) \ { \ char buffer[65536]; \ snprintf(buffer, sizeof(buffer), format, __VA_ARGS__); \ out += buffer; \ } #define WRITE_LIT(file, str) \ fwrite(str, sizeof(char), sizeof(str) - 1, file) // NOTE: snprintf() returns the size written (given an infinite buffer) not including \0 #define WRITE_FMT(file, format, ...) \ { \ char buffer[65536]; \ int size = snprintf(buffer, sizeof(buffer), format, __VA_ARGS__); \ fwrite(buffer, sizeof(char), std::min(size, sizeof(buffer)), file); \ } #define APPEND_LIT_LN(out, str) APPEND_LIT(out, (str "\n")) #define APPEND_FMT_LN(out, format, ...) APPEND_FMT(out, (format "\n"), __VA_ARGS__) #define WRITE_LIT_LN(out, str) WRITE_LIT(out, (str "\n")) #define WRITE_FMT_LN(out, format, ...) WRITE_FMT(out, (format "\n"), __VA_ARGS__) namespace Utils { bool WriteOutputFile(const CodegenOutput& output, const char* path); std::string JoinNames(DeclNamespace* ns, std::string_view prefix, std::string_view suffix, std::string_view delimiter); std::string MakeFullName(std::string_view name, DeclNamespace* ns = nullptr); std::string MakeMangledName(std::string_view name, DeclNamespace* ns = nullptr); std::vector SplitIdentifier(std::string_view name); std::string MakePascalCase(std::string_view name); void ProduceGeneratedHeader(const char* headerFilename, CodegenOutput& header, const char* sourceFilename, CodegenOutput& source); } // namespace Utils