// -*- c++ -*- // Distributed under the BSD 2-Clause License. // See accompanying file LICENSE for details. #include "util.h" #include #include #include #include std::string to_lower(const std::string& str) { std::string out{str}; std::transform(out.begin(), out.end(), out.begin(), ::tolower); return out; } std::string readFile(const std::string& fileName) { std::ifstream ifs(fileName.c_str(), std::ios::in | std::ios::binary | std::ios::ate); std::ifstream::pos_type fileSize = ifs.tellg(); ifs.seekg(0, std::ios::beg); std::vector bytes(fileSize); ifs.read(bytes.data(), fileSize); return std::string(bytes.data(), fileSize); } std::vector readDeps(const std::string& depFile) { if(!std::filesystem::exists(depFile)) { return {}; } auto str = readFile(depFile); std::vector output; std::string tmp; bool start{false}; bool in_whitespace{false}; for(const auto& c : str) { if(c == '\\' || c == '\n') { continue; } if(c == ':') { start = true; continue; } if(!start) { continue; } if(c == ' ' || c == '\t') { if(in_whitespace) { continue; } if(!tmp.empty()) { output.push_back(tmp); } tmp.clear(); in_whitespace = true; } else { in_whitespace = false; tmp += c; } } if(!tmp.empty()) { output.push_back(tmp); } return output; } ctor::language languageFromExtension(const std::filesystem::path& file) { auto ext = file.extension().string(); // First a few case sensitive comparisons if(ext == ".c") { return ctor::language::c; } if(ext == ".C") { return ctor::language::cpp; } // The rest are compared in lowercase ext = to_lower(ext); if(ext == ".cc" || ext == ".cpp" || ext == ".c++" || ext == ".cp" || ext == ".cxx") { return ctor::language::cpp; } if(ext == ".s" || ext == ".asm") { return ctor::language::assembler; } std::cerr << "Could not deduce language from " << file.string() << "\n"; exit(1); return {}; } namespace { bool isClean(char c) { return c != '.' && c != '/'; } } std::string cleanUp(const std::string& path) { std::string cleaned; for(const auto& c : path) { if(isClean(c)) { cleaned += c; } else { cleaned += '_'; } } return cleaned; } ctor::target_type target_type_from_extension(const std::filesystem::path& file) { auto ext = to_lower(file.extension().string()); // Loosely based on: // https://en.wikipedia.org/wiki/List_of_file_formats#Object_code,_executable_files,_shared_and_dynamically_linked_libraries if(ext == ".a" || ext == ".lib") { return ctor::target_type::static_library; } if(ext == ".so" || ext == ".dll" || ext == ".dylib") { return ctor::target_type::dynamic_library; } if(ext == ".o" || ext == ".obj") { return ctor::target_type::object; } if(ext == "" || ext == ".exe" || ext == ".com" || ext == ".bin" || ext == ".run" || ext == ".out") { return ctor::target_type::executable; } return ctor::target_type::unknown; }