summaryrefslogtreecommitdiff
path: root/misc/coverage-helper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'misc/coverage-helper.cpp')
-rw-r--r--misc/coverage-helper.cpp142
1 files changed, 0 insertions, 142 deletions
diff --git a/misc/coverage-helper.cpp b/misc/coverage-helper.cpp
deleted file mode 100644
index a31e927f..00000000
--- a/misc/coverage-helper.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-#include <algorithm>
-#include <array>
-#include <cassert>
-#include <fstream>
-#include <iostream>
-#include <memory>
-#include <numeric>
-#include <regex>
-#include <string>
-#include <vector>
-
-std::string escape_arg(const std::string& arg) {
- if (arg.empty() == false &&
- arg.find_first_of(" \t\n\v\"") == arg.npos) {
- return arg;
- }
-
- std::string escaped;
- escaped.push_back('"');
- for (auto it = arg.begin(); ; ++it) {
- int num_backslashes = 0;
-
- while (it != arg.end() && *it == '\\') {
- ++it;
- ++num_backslashes;
- }
-
- if (it == arg.end()) {
- escaped.append(num_backslashes * 2, '\\');
- break;
- } else if (*it == '"') {
- escaped.append((num_backslashes + 1) * 2, '\\');
- escaped.push_back('"');
- escaped.push_back(*it);
- } else {
- escaped.append(num_backslashes, '\\');
- escaped.push_back(*it);
- }
- }
- escaped.push_back('"');
-
- return escaped;
-}
-
-
-void create_empty_file(std::string const& path) {
- std::ofstream ofs(path);
- ofs << '\n';
-}
-
-const std::string separator = "--sep--";
-const std::string logfile_prefix = "--log-file=";
-
-bool starts_with(std::string const& str, std::string const& pref) {
- return str.find(pref) == 0;
-}
-
-int parse_log_file_arg(std::string const& arg) {
- assert(starts_with(arg, logfile_prefix) && "Attempting to parse incorrect arg!");
- auto fname = arg.substr(logfile_prefix.size());
- create_empty_file(fname);
- std::regex regex("MemoryChecker\\.(\\d+)\\.log", std::regex::icase);
- std::smatch match;
- if (std::regex_search(fname, match, regex)) {
- return std::stoi(match[1]);
- } else {
- throw std::domain_error("Couldn't find desired expression in string: " + fname);
- }
-}
-
-std::string catch_path(std::string path) {
- auto start = path.find("catch");
- // try capitalized instead
- if (start == std::string::npos) {
- start = path.find("Catch");
- }
- if (start == std::string::npos) {
- throw std::domain_error("Couldn't find Catch's base path");
- }
- auto end = path.find_first_of("\\/", start);
- return path.substr(0, end);
-}
-
-std::string windowsify_path(std::string path) {
- for (auto& c : path) {
- if (c == '/') {
- c = '\\';
- }
- }
- return path;
-}
-
-int exec_cmd(std::string const& cmd, int log_num, std::string const& path) {
- std::array<char, 128> buffer;
-
- // cmd has already been escaped outside this function.
- auto real_cmd = "OpenCppCoverage --export_type binary:cov-report" + std::to_string(log_num)
- + ".bin --quiet " + "--sources " + escape_arg(path) + " --cover_children -- " + cmd;
- std::cout << "=== Marker ===: Cmd: " << real_cmd << '\n';
- auto pipe = _popen(real_cmd.c_str(), "r");
-
- if (!pipe) {
- throw std::runtime_error("popen() failed!");
- }
- while (!feof(pipe)) {
- if (fgets(buffer.data(), 128, pipe) != nullptr) {
- std::cout << buffer.data();
- }
- }
-
- auto ret = _pclose(pipe);
- if (ret == -1) {
- throw std::runtime_error("underlying error in pclose()");
- }
-
- return ret;
-}
-
-// argv should be:
-// [0]: our path
-// [1]: "--log-file=<path>"
-// [2]: "--sep--"
-// [3]+: the actual command
-
-int main(int argc, char** argv) {
- std::vector<std::string> args(argv, argv + argc);
- auto sep = std::find(begin(args), end(args), separator);
- assert(sep - begin(args) == 2 && "Structure differs from expected!");
-
- auto num = parse_log_file_arg(args[1]);
-
- auto cmdline = std::accumulate(++sep, end(args), std::string{}, [] (const std::string& lhs, const std::string& rhs) {
- return lhs + ' ' + escape_arg(rhs);
- });
-
- try {
- return exec_cmd(cmdline, num, windowsify_path(catch_path(args[0])));
- } catch (std::exception const& ex) {
- std::cerr << "Helper failed with: '" << ex.what() << "'\n";
- return 12;
- }
-}