#include #include #include using namespace std; // ===== GLOBAL VARS ===== // string cfgcmds[500][2]; // Array for command text and value text float cfgvals[500]; // Array for numerical cmd values char valeq[500]; // Array for equivalence between current and required values short sh_arraycounter = 0; // Counter bool trace = 1; // ===== END GLOBAL VARS ===== // // ===== FILE I/O ===== // // Write newcfg.cfg void writecfg(string sz_cfg) { ofstream newcfg; newcfg.open ("config.cfg", ios::trunc); newcfg << sz_cfg; newcfg.close(); } // Read input.txt for cfg rules string readinput() { string sz_input = ""; ifstream st_inp; st_inp.open("input.txt"); while (! st_inp.eof() ) { sz_input.push_back(st_inp.get()); } st_inp.close(); return sz_input; } // Read config.cfg string readcfg() { string sz_config = ""; ifstream st_cfg; st_cfg.open("config.cfg"); while (! st_cfg.eof() ) { sz_config.push_back(st_cfg.get()); } st_cfg.close(); return sz_config; } // Read README.txt string readme() { string sz_readme = ""; ifstream st_readme; st_readme.open("README.txt"); while (! st_readme.eof() ) { sz_readme.push_back(st_readme.get()); } st_readme.close(); return sz_readme; } // ===== END FILE I/O ===== // // ===== PARSING ===== // short is_con_ch_num(char ch) // Detect if char { bool b_number = 0; switch (ch) { case '1': b_number = 1; break; case '2': b_number = 1; break; case '3': b_number = 1; break; case '4': b_number = 1; break; case '5': b_number = 1; break; case '6': b_number = 1; break; case '7': b_number = 1; break; case '8': b_number = 1; break; case '9': b_number = 1; break; case '0': b_number = 1; break; case '.': b_number = 1; break; default: b_number = 0; } return b_number; } float sz_to_sh(string sz_value) { return atof(sz_value.c_str()); } void parse_cmds(string sz_input, bool b_parsetype) { short sh_inlength = sz_input.length(); bool b_invalline = 0; bool b_cmd = 0; bool b_cmddone = 0; bool b_val = 0; bool b_valdone = 0; bool b_echo = 0; for ( short a = 0; a < sh_inlength; a++ ) { //if (trace == 1) {cout << "char " << a << " \'" << sz_input[a] << "\' type " << int(sz_input[a]) << endl;} if ( ( ( sz_input[a] == 'e' && sz_input[a+1] == 'c' && sz_input [a+2] == 'h' && sz_input [a+3] == 'o' ) ||( sz_input[a] == 'b' && sz_input[a+1] == 'i' && sz_input [a+2] == 'n' && sz_input [a+3] == 'd' ) ||( sz_input[a] == 'a' && sz_input[a+1] == 'l' && sz_input [a+2] == 'i' && sz_input [a+3] == 'a' && sz_input [a+4] == 's' ) ||( sz_input[a] == '/' && sz_input[a+1] == '/' ) ) || sz_input[a] == '\n' ) { //if (trace == 1) {cout << "Invalid Text";} b_invalline = 1; } if ( b_invalline == 0 && sz_input[a] != ' ' && sz_input[a] != '\t' && sz_input[a] != char(-1) ) { if ( is_con_ch_num(sz_input[a]) == 0 && b_cmddone == 0 ) { //if (trace == 1) {cout << "";} b_cmd = 1; //if (trace == 1) {cout << sz_input[a] << " should go in " << sh_arraycounter;} cfgcmds[sh_arraycounter][1] += sz_input[a]; if ( sz_input[a+1] == ' ' || sz_input[a+1] == '\t' ) { //if (trace == 1) {cout << "";} b_cmddone = 1; } } if ( ( sz_input[a] == '=' || sz_input[a] == '>' || sz_input[a] == '<' ) && b_parsetype == 1 && b_cmddone == 1 && b_valdone == 0 ) { cout << "EQ FOUND AT " << sz_input[a]; valeq[sh_arraycounter] += sz_input[a]; } if ( is_con_ch_num(sz_input[a]) == 1 && b_valdone == 0 ) { //if (trace == 1) {cout << "";} b_val = 1; //if (trace == 1) {cout << sz_input[a] << " should go in " << sh_arraycounter;} cfgcmds[sh_arraycounter][2] = sz_input[a]; if ( is_con_ch_num(sz_input[a+1]) == 0 ) { //if (trace == 1) {cout << "";} b_valdone = 1; cfgvals[sh_arraycounter] = sz_to_sh(cfgcmds[sh_arraycounter][2]); sh_arraycounter++; } } } if ( sz_input[a] == '\n' ) { b_valdone = 0; b_cmddone = 0; b_invalline = 0; } } } void printarrays() { for ( short a = 0; cfgcmds[a][1] != ""; a++ ) { cout << a << ") " << cfgcmds[a][1] << "TO BE \'" << valeq[a] << "\' THAN: " << cfgcmds[a][2] << " NUM: " << cfgvals[a] << endl; } } int main() { char ch_readme; cout << "Welcome to the CFG Legalizer." << endl << "Have you read and followed the instructions \n" << "in the included README.txt? (y/n): "; cin.get(ch_readme); system("cls"); if (ch_readme == 'n' || ch_readme == 'N') { cout << endl << readme() << endl << endl; } parse_cmds(readinput(), 0); cout << endl << "==============" << endl; printarrays(); system("pause"); system("cls"); return 0; }