From f5f56e1a1c4d9e9496fcb9d81131066a964ccd23 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 14:15:43 +0200 Subject: Adding upstream version 2.4.1. Signed-off-by: Daniel Baumann --- src/lib/testutils/io_utils.cc | 117 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/lib/testutils/io_utils.cc (limited to 'src/lib/testutils/io_utils.cc') diff --git a/src/lib/testutils/io_utils.cc b/src/lib/testutils/io_utils.cc new file mode 100644 index 0000000..4b08f16 --- /dev/null +++ b/src/lib/testutils/io_utils.cc @@ -0,0 +1,117 @@ +// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include + +#include +#include +#include +#include +#include +#include + +namespace isc { +namespace test { + +bool fileExists(const std::string& file_path) { + struct stat statbuf; + return(stat(file_path.c_str(), &statbuf) == 0); +} + +std::string readFile(const std::string& file_path) { + std::ifstream ifs; + ifs.open(file_path.c_str(), std::ifstream::in); + if (!ifs.good()) { + return (std::string()); + } + std::string buf; + std::ostringstream output; + while (!ifs.eof() && ifs.good()) { + ifs >> buf; + output << buf; + } + ifs.close(); + + return (output.str()); +} + +std::string decommentJSONfile(const std::string& input_file) { + + using namespace std; + + ifstream f(input_file); + if (!f.is_open()) { + isc_throw(isc::BadValue, "can't open input file for reading: " + input_file); + } + + string outfile; + size_t last_slash = input_file.find_last_of("/"); + if (last_slash != string::npos) { + outfile = input_file.substr(last_slash + 1); + } else { + outfile = input_file; + } + outfile += "-decommented"; + + ofstream out(outfile); + if (!out.is_open()) { + isc_throw(isc::BadValue, "can't open output file for writing: " + input_file); + } + + bool in_comment = false; + string line; + while (std::getline(f, line)) { + // First, let's get rid of the # comments + size_t hash_pos = line.find("#"); + if (hash_pos != string::npos) { + line = line.substr(0, hash_pos); + } + + // Second, let's get rid of the // comments + // at the beginning or after a control character. + size_t dblslash_pos = line.find("//"); + if ((dblslash_pos != string::npos) && + ((dblslash_pos == 0) || + ((unsigned) line[dblslash_pos - 1] <= 32))) { + line = line.substr(0, dblslash_pos); + } + + // Now the tricky part: c comments. + size_t begin_pos = line.find("/*"); + size_t end_pos = line.find("*/"); + if (in_comment && end_pos == string::npos) { + // we continue through multiline comment + line = ""; + } else { + + if (begin_pos != string::npos) { + in_comment = true; + if (end_pos != string::npos) { + // single line comment. Let's get rid of the content in between + line = line.replace(begin_pos, end_pos + 2, end_pos + 2 - begin_pos, ' '); + in_comment = false; + } else { + line = line.substr(0, begin_pos); + } + } else { + if (in_comment && end_pos != string::npos) { + line = line.replace(0, end_pos +2 , end_pos + 2, ' '); + in_comment = false; + } + } + } + + // Finally, write the line to the output file. + out << line << endl; + } + f.close(); + out.close(); + + return (outfile); +} + +}; // end of isc::test namespace +}; // end of isc namespace -- cgit v1.2.3