Skip to content

Commit 2111794

Browse files
committed
Fixed parsing bug in ANF::readFileForMaxVar
1 parent 067cb92 commit 2111794

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

src/anf.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ bool isCharInStr(const char c, const std::string& s) {
6969
size_t ANF::readFileForMaxVar(const std::string& filename)
7070
{
7171
// Read in the file line by line
72-
size_t maxVar = 0;
7372
size_t maxes[26] = {0};
7473
char varLetter;
74+
size_t var = 0;
75+
bool start_bracket = false;
7576

7677
std::ifstream ifs(filename.c_str());
7778
if (!ifs) {
@@ -93,16 +94,35 @@ size_t ANF::readFileForMaxVar(const std::string& filename)
9394
// simply search for consecutive numbers
9495
// however "+1" is a NUMBER but not a MONOMIAL
9596
// so we have to take that into consideration
96-
size_t var = 0;
97+
9798
bool isMonomial = false;
9899
for (uint32_t i = 0; i < temp.length(); ++i) {
99100
//At this point, only numbers are valid
100101
if (!std::isdigit(temp[i])) {
101102
var = 0;
102-
char temp_char = tolower(temp[i]);
103+
char temp_char = temp[i];
104+
if (temp_char >= 'A' && temp_char <= 'Z')
105+
temp_char += 'a' - 'A';
103106
if (temp[i] == '_')
104107
continue;
105-
if (isCharInStr(temp_char,var_letters) || (isMonomial && temp[i] == '(')) {
108+
109+
if (temp[i] == ')') {
110+
if (!start_bracket) {
111+
cout << "ERROR: close bracket but no start bracket?" << endl;
112+
exit(-1);
113+
}
114+
start_bracket = false;
115+
continue;
116+
}
117+
if (temp[i] == '(') {
118+
if (start_bracket) {
119+
cout << "ERROR: start bracket but previous not closed?" << endl;
120+
exit(-1);
121+
}
122+
start_bracket = true;
123+
continue;
124+
}
125+
if (isCharInStr(temp_char,var_letters)) {
106126
varLetter = temp_char;
107127
isMonomial = true;
108128
} else {
@@ -111,13 +131,16 @@ size_t ANF::readFileForMaxVar(const std::string& filename)
111131
} else if (isMonomial) {
112132
var = var * 10 + (temp[i] - '0');
113133
int index = (varLetter-'a'); // variables are zero based
114-
if (maxes[index] < (var+1)) {
115-
maxes[index] = (var+1);
134+
printf("%c %zu ", varLetter, var);
135+
if (maxes[index] <= var) {
136+
maxes[index] = var+1;
116137
}
117138
}
118139
}
119140
}
120141
ifs.close();
142+
143+
size_t maxVar = 0;
121144
for(size_t i=0;i<26;i++) {
122145
maxVar += maxes[i];
123146
}
@@ -129,7 +152,7 @@ size_t ANF::readFile(const std::string& filename)
129152
{
130153
// Read in the file line by line
131154
vector<std::string> text_file;
132-
int maxes[26] = {0};
155+
size_t maxes[26] = {0};
133156

134157
size_t currentVar = 2;
135158
bool proj_set_found = false;

0 commit comments

Comments
 (0)