4 #include "misc/utils.h"
9 enum mode_type { COUNT, DISPLAY, CONTEXT };
14 std::cout << "Usage: rlcsa_grep [-c] pattern base_name" << std::endl;
15 std::cout << " -c print the number of matching lines" << std::endl;
16 std::cout << " -NUM display NUM characters of leading and trailing context instead of" << std::endl;
17 std::cout << " the entire line" << std::endl;
21 int main(int argc, char** argv)
23 int base_arg = 2, pattern_arg = 1;
24 mode_type mode = DISPLAY;
27 if(argc < base_arg + 1)
35 base_arg++; pattern_arg++;
36 if(std::string("-c").compare(argv[1]) == 0)
43 context = atoi(&(argv[1][1]));
45 if(argc < base_arg + 1)
52 RLCSA rlcsa(argv[base_arg], false);
58 usint len = std::string(argv[pattern_arg]).length();
59 pair_type result_range = rlcsa.count(argv[pattern_arg]);
60 usint occurrences = length(result_range);
65 std::cout << 0 << std::endl;
71 usint* results = rlcsa.locate(result_range);
74 rlcsa.getSequenceForPosition(results, occurrences);
76 std::sort(results, results + occurrences);
79 for(usint i = 1; i < occurrences; i++)
81 if(results[i] != results[last_row])
83 last_row++; results[last_row] = results[i];
90 std::cout << (last_row + 1) << std::endl;
92 else if(mode == DISPLAY)
94 for(usint i = 0; i <= last_row; i++)
96 uchar* row = rlcsa.display(results[i]);
97 std::cout.write((char*)row, length(rlcsa.getSequenceRange(results[i])));
98 std::cout << std::endl;
102 else if(mode == CONTEXT)
104 usint result_length = 0;
105 for(usint i = 0; i < occurrences; i++)
107 uchar* text = rlcsa.display(results[i], len, context, result_length);
108 std::cout.write((char*)text, result_length);
109 std::cout << std::endl;