I am writing this program to try and get some practice at C++ and correct and proper styling.
This code is meant to take user input from a pip and then run it through the program. The user enters a pattern and that pattern is turned into regex which is compared against the input, such that it could look like this:
cat input.txt |./app "pattern %{0} end of pattern"
I was wondering if I could get some pointers as to what I am doing wrong here (what is not best practice and anything else you may see as being incorrect).
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include "build/pcrecpp.h"
void ReadFile(std::vector<string> &lines_in_file);
bool ValidateArguments(int arguments);
std::string RegexConverter(std::string &user_specified_pattern);
void SplitInputLine(std::string &user_specified_pattern, std::vector<string> &users_pattern_split);
void TokenValidator(std::vector<string>& users_pattern_split, std::string& users_converted_pattern);
std::string TokenToRegex(std::string word_in_user_specified_pattern);
bool FindMatchingLines(std::vector<string> lines_in_file, std::string user_specified_pattern);
int main(int argc, char *argv[]) {
if (!ValidateArguments(argc)) return 1;
std::string user_specified_pattern = argv[1];
std::vector<string> lines_in_file; // 2 diminsional vector containing [lines][words]
ReadFile(lines_in_file);
std::string users_converted_pattern = RegexConverter(user_specified_pattern);
FindMatchingLines(lines_in_file, users_converted_pattern);
return 0;
}
void ReadFile(std::vector<string> &lines_in_file) {
std::stringstream input_file;
input_file << std::cin.rdbuf();
std::string text_from_input;
while (std::getline(input_file, text_from_input, '\n')) {
lines_in_file.push_back(text_from_input);
}
}
bool ValidateArguments(int arguments) {
if ( arguments != 2 ) {
std::cerr << "Usage - ./alertlogic_test \"Patern\" \n";
return false;
}
return true;
}
std::string RegexConverter(std::string &user_specified_pattern) {
std::vector<string> users_pattern_split;
std::string users_converted_pattern;
SplitInputLine(user_specified_pattern, users_pattern_split);
TokenValidator(users_pattern_split, users_converted_pattern);
return users_converted_pattern;
}
void SplitInputLine(std::string &user_specified_pattern, std::vector<string> &users_pattern_split) {
char sep = ' ';
for (size_t p = 0, q = 0; p != user_specified_pattern.npos; p = q)
users_pattern_split.push_back(user_specified_pattern.substr(p+(p != 0),
(q = user_specified_pattern.find(sep, p+1))-p-(p != 0)));
}
void TokenValidator(std::vector<string> &users_pattern_split, std::string &users_converted_pattern) {
pcrecpp::RE re("%{(.)*}");
users_converted_pattern.append("("); // worked tomorrow. look
for (int i = 0; i < users_pattern_split.size(); i++) {
if (re.PartialMatch(users_pattern_split[i])) {
users_converted_pattern.append(TokenToRegex(users_pattern_split[i]) + " ");
} else {
users_converted_pattern.append(users_pattern_split[i] + " ");
}
}
users_converted_pattern.erase(users_converted_pattern.find_last_not_of(" \n\r\t")+1);
users_converted_pattern.append(")"); // llook at thi tomorrow
// std::cout << new_user_specified_pattern << "\n";
}
std::string TokenToRegex(std::string word_in_user_specified_pattern) {
std::string converted_word;
switch (word_in_user_specified_pattern.length()) {
case 4:
converted_word = "(.*)"; // %{n}
break;
case 5:
converted_word = "(.*)"; // %{nG}
break;
case 6:
converted_word = std::string("{.}*{")+word_in_user_specified_pattern[4]+"}";
break;
default:
std::cerr << "ERROR UNKNOWN TOKEN!\n";
exit(3);
}
return converted_word;
}
bool FindMatchingLines(std::vector<string> lines_in_file, std::string user_specified_pattern) {
std::string phrase;
pcrecpp::RE re(user_specified_pattern);
bool is_there_a_match = false;
for (int i = 0; i < lines_in_file.size(); ++i) {
if (re.PartialMatch(lines_in_file[i], &phrase)) {
std::cout << "\nA matching phrase \"" << phrase << "\" found at line " << i+1 << "\n" <<
lines_in_file[i] << "\n";
is_there_a_match = true;
}
}
if (is_there_a_match == false) {
std::cout << "no match found\n";
return false;
}
return true;
}