rendered paste body#include <iostream>
#include <string>
#include <fstream>
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 << "<CMD>";}
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 << "<CMD done>";}
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 << "<VAL>";}
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 << "<VAL done>";}
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;
}