25vector<string> Parser::parser_line(
const string& line) {
29 if (c <= 20 || c ==
' ') {
43bool Parser::is_an_file(
const std::string& s) {
44 return !s.empty() && s[0] ==
'/';
50 for (
size_t i = 0; i < s.size(); ++i) {
51 if (s[i] ==
'\033' && i + 1 < s.size() && s[i + 1] ==
'[') {
53 while (i < s.size() && (s[i] <
'@' || s[i] >
'~')) {
64double Parser::retrive_similarity(
const std::string& s) {
72void Parser::parser_block_stream(
const std::string& path,
const std::vector<std::string>& tokens, set<Comparation>& comparations) {
73 if (tokens.size() < 2)
76 const std::string& path_comp = tokens[0];
78 if (!is_an_file(path_comp))
81 double similarity = retrive_similarity(tokens[1]);
83 if (similarity < similarity_cap)
87 comparations.insert(com);
96 while (fgets(chunk,
sizeof(chunk), pipe)) {
99 if (!line.empty() && line.back() ==
'\n') {
102 auto tokens = parser_line(line);
103 if (tokens.size() > 2) {
104 for (
auto token : tokens) {
105 if (is_an_file(token)) {
114 parser_block_stream(path, tokens, comparations);
119 fout << comparations.size() <<
'\n';
120 for (
const auto& com : comparations) {
121 fout << com.path1 <<
' ' << com.path2 <<
' ';
122 fout << fixed << setprecision(2) << com.similarity <<
'\n';
127 : fout(output_file), similarity_cap(similarity_cap) {
130 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.
string path1
Path to first code file being compared.
bool operator==(const Comparation &com) const
Equality comparison operator.
string path2
Path to second code file being compared.