// -*- c++ -*- // Distributed under the BSD 2-Clause License. // See accompanying file LICENSE for details. #include "util.h" #include #include 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; } Language languageFromExtension(const std::filesystem::path& file) { auto ext = file.extension().string(); if(ext == ".c") { return Language::C; } if(ext == ".C" || ext == ".cc" || ext == ".cpp" || ext == ".CPP" || ext == ".c++" || ext == ".cp" || ext == ".cxx") { return Language::Cpp; } if(ext == ".s" || ext == ".S" || ext == ".asm") { return Language::Asm; } std::cerr << "Could not deduce language from " << file.string() << "\n"; exit(1); return {}; }