Arkanjo 0.1
A tool for find code duplicated functions in codebases
Loading...
Searching...
No Matches
parser.cpp
Go to the documentation of this file.
1#include "parser.hpp"
2
3
4Comparation::Comparation(string _path1, string _path2, double _sim){
5 if(_path1 > _path2) swap(_path1,_path2);
6 path1 = _path1;
7 path2 = _path2;
8 similarity = _sim;
9}
10
11bool Comparation::operator<(const Comparation &com) const{
12 if(similarity != com.similarity){
13 return similarity > com.similarity;
14 }
15 if(path1 == com.path1){
16 return path2 < com.path2;
17 }
18 return path1 < com.path1;
19}
20
21bool Comparation::operator==(const Comparation &com) const{
22 return path1 == com.path1 && path2 == com.path2;
23}
24
25vector<string> Parser::parser_line(string line){
26 string at = "";
27 vector<string> ret;
28 for(auto c : line){
29 if(c <= 20 || c == ' '){ //an space on non-printable char
30 if(!at.empty())
31 ret.push_back(at);
32 at = "";
33 }else{
34 at += c;
35 }
36 }
37 if(!at.empty())
38 ret.push_back(at);
39
40 return ret;
41}
42
43bool Parser::is_an_file(string s){
44 return !s.empty() && s[0] == '/';
45}
46
47string Parser::remove_formatation_from_similarity(string s){
48 for(int i = 0; i < 4; i++){
49 s.pop_back();
50 }
51 reverse(s.begin(),s.end());
52 while(s.back() != 'm'){
53 s.pop_back();
54 }
55 s.pop_back();
56 reverse(s.begin(),s.end());
57 return s;
58}
59
60double Parser::retrive_similarity(string s){
61 s = remove_formatation_from_similarity(s);
62 char *cs = s.data();
63 float similarity = stod(s);
64 return similarity;
65}
66
67void Parser::parser_block(string path, set<Comparation> &comparations){
68 string line;
69 while(getline(fin,line)){
70 vector<string> tokens = parser_line(line);
71 if(tokens.empty()){
72 break;
73 }
74 if( int32_t(tokens.size()) != 2 || !is_an_file(tokens[0])){
75 continue;
76 }
77 string path_compared = tokens[0];
78
79 double similarity = retrive_similarity(tokens[1]);
80 Comparation com(path,path_compared,similarity);
81 if(similarity >= similarity_cap_)
82 comparations.insert(com);
83 }
84}
85
86void Parser::exec(){
87 string line;
88 set<Comparation> comparations;
89
90 while(getline(fin,line)){
91 vector<string> tokens = parser_line(line);
92 if(tokens.empty()) continue;
93
94 string path;
95 for(auto token : tokens){
96 if(is_an_file(token)){
97 path = token;
98 break;
99 }
100 }
101 //Removing some formatation that shows on terminal
102 for(int i = 0; i < 4; i++) path.pop_back();
103 parser_block(path,comparations);
104 }
105 fout << comparations.size() << '\n';
106 for(auto com : comparations){
107 fout << com.path1 << ' ' << com.path2 << ' ';
108 fout << fixed << setprecision(2) << com.similarity << '\n';
109 }
110}
111
112Parser::Parser(string input_file, string output_file, double similarity_cap){
113 fin = ifstream(input_file);
114 fout = ofstream(output_file);
115 similarity_cap_ = similarity_cap;
116
117 exec();
118
119 fin.close();
120 fout.close();
121}
Parser(string input_file, string output_file, double similarity_cap)
Constructs parser with configuration.
Definition parser.cpp:112
return ret
Definition sum.c:3
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression, cppcoreguidelines-noexcept-swap, performance-noexcept-swap) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition json.hpp:25398
Code duplication results parser.
Structure representing a code comparison result.
Definition parser.hpp:30
bool operator<(const Comparation &com) const
Comparison operator for sorting.
Definition parser.cpp:11
double similarity
Similarity score between the files (0-100)
Definition parser.hpp:33
Comparation()
Default constructor.
Definition parser.hpp:38
string path1
Path to first code file being compared.
Definition parser.hpp:31
bool operator==(const Comparation &com) const
Equality comparison operator.
Definition parser.cpp:21
string path2
Path to second code file being compared.
Definition parser.hpp:32