7 std::swap(_path1, _path2);
27std::vector<std::string> Parser::parser_line(
const std::string& line) {
29 std::vector<std::string> ret;
31 if (c <= 20 || c ==
' ') {
48 for (
size_t i = 0; i < s.size(); ++i) {
49 if (s[i] ==
'\033' && i + 1 < s.size() && s[i + 1] ==
'[') {
51 while (i < s.size() && (s[i] <
'@' || s[i] >
'~')) {
62double Parser::retrive_similarity(
const std::string& s) {
70void Parser::parser_block_stream(
const std::string& path,
const std::vector<std::string>& tokens, std::set<Comparation>& comparations) {
71 if (tokens.size() < 2)
74 const std::string& path_comp = tokens[0];
76 if (!fs::is_regular_file(path_comp))
79 double similarity = retrive_similarity(tokens[1]);
81 if (similarity < similarity_cap)
85 comparations.insert(com);
94 while (fgets(chunk,
sizeof(chunk), pipe)) {
97 if (!line.empty() && line.back() ==
'\n') {
100 auto tokens = parser_line(line);
101 if (tokens.size() > 2) {
102 for (
auto token : tokens) {
103 if (fs::is_regular_file(token)) {
112 parser_block_stream(path, tokens, comparations);
117 fout << comparations.size() <<
'\n';
118 for (
const auto& com : comparations) {
119 fout << com.path1 <<
' ' << com.path2 <<
' ';
120 fout << std::fixed << std::setprecision(2) << com.similarity <<
'\n';
125 : fout(output_file), similarity_cap(similarity_cap) {
128 throw std::runtime_error(
"Failed to open output file");
void exec_from_stream(FILE *pipe)
Main parsing execution method using stream.
Parser(const fs::path &output_file, double similarity_cap)
Constructs parser with configuration.
void removeANSI_inplace(std::string &s)
Code duplication results parser.
Structure representing a code comparison result.
bool operator<(const Comparation &com) const
Comparison operator for sorting.
double similarity
Similarity score between the files (0-100)
Comparation()
Default constructor.
std::string path1
Path to first code file being compared.
std::string path2
Path to second code file being compared.
bool operator==(const Comparation &com) const
Equality comparison operator.