Skip to content

Commit

Permalink
Drastically reduce use of heap memory and memory leaks
Browse files Browse the repository at this point in the history
  • Loading branch information
lefticus committed Nov 17, 2023
1 parent a1b0996 commit 136c224
Show file tree
Hide file tree
Showing 12 changed files with 78 additions and 164 deletions.
20 changes: 9 additions & 11 deletions legacy/Evaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ void evaluateStacks(Stack * numbers, Stack * operators, int num) {
operand2 = (RationalNumber *)numbers->pop();
operand1 = (RationalNumber *)numbers->pop();

operand1->add(operand2);
operand1->add(*operand2);
delete operand2;
numbers->push(operand1);
break;
Expand All @@ -87,7 +87,7 @@ void evaluateStacks(Stack * numbers, Stack * operators, int num) {
operand2 = (RationalNumber *)numbers->pop();
operand1 = (RationalNumber *)numbers->pop();

operand1->multiply(operand2);
operand1->multiply(*operand2);
delete operand2;
numbers->push(operand1);
break;
Expand All @@ -97,7 +97,7 @@ void evaluateStacks(Stack * numbers, Stack * operators, int num) {
operand2 = (RationalNumber *)numbers->pop();
operand1 = (RationalNumber *)numbers->pop();

operand1->divide(operand2);
operand1->divide(*operand2);
delete operand2;
numbers->push(operand1);
break;
Expand All @@ -112,23 +112,21 @@ void evaluateStacks(Stack * numbers, Stack * operators, int num) {



RationalNumber * evaluateExpression(StringTokenizer * st) {
RationalNumber evaluateExpression(StringTokenizer & st) {
Stack * operators = new Stack();
Stack * numbers = new Stack();

int negateNext = FALSE;

int op;

char * next;
while (st.hasMoreTokens()) {

while (st->hasMoreTokens()) {

next = st->nextToken();
std::string next = st.nextToken();

int * value = new int;

if (next != NULL) {
if (!next.empty()) {
switch(next[0]) {
case '+':
*value = PLUS_SIGN;
Expand Down Expand Up @@ -156,7 +154,7 @@ RationalNumber * evaluateExpression(StringTokenizer * st) {
break;

default:
*value = atoi(next);
*value = atoi(next.c_str());
op = FALSE;
numbers->push(new RationalNumber(*value, 1));
break;
Expand Down Expand Up @@ -195,6 +193,6 @@ RationalNumber * evaluateExpression(StringTokenizer * st) {

if (operators->peek() != NULL)
evaluateStacks(numbers, operators, 0);
return (RationalNumber *)numbers->peek();
return *(RationalNumber *)numbers->peek();
}

2 changes: 1 addition & 1 deletion legacy/Evaluator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include "StringTokenizer.h"

int precedence(int op);
RationalNumber * evaluateExpression(StringTokenizer * st);
RationalNumber evaluateExpression(StringTokenizer &st);
void evaluateStacks(Stack * numbers, Stack * operators, int num);

#endif
35 changes: 16 additions & 19 deletions legacy/RationalNumber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,47 +7,44 @@ RationalNumber::RationalNumber(int num, int den) {
denominator = den;
}

RationalNumber::~RationalNumber() {
void RationalNumber::divide(const RationalNumber & rn) {
denominator *= rn.getNumerator();
numerator *= rn.getDenominator();
}

void RationalNumber::divide(RationalNumber * rn) {
denominator *= rn->getNumerator();
numerator *= rn->getDenominator();
void RationalNumber::multiply(const RationalNumber & rn) {
numerator *= rn.getNumerator();
denominator *= rn.getDenominator();
}

void RationalNumber::multiply(RationalNumber * rn) {
numerator *= rn->getNumerator();
denominator *= rn->getDenominator();
}

void RationalNumber::add(RationalNumber * rn) {
int denom = denominator * rn->getDenominator();
numerator *= rn->getDenominator();
int numer = numerator + (rn->getNumerator() * denominator);
void RationalNumber::add(const RationalNumber &rn) {
int denom = denominator * rn.getDenominator();
numerator *= rn.getDenominator();
int numer = numerator + (rn.getNumerator() * denominator);

numerator = numer;
denominator = denom;
}

void RationalNumber::subtract(RationalNumber * rn) {
int denom = denominator * rn->getDenominator();
void RationalNumber::subtract(const RationalNumber &rn) {
int denom = denominator * rn.getDenominator();

numerator *= rn->getDenominator();
int numer = numerator - (rn->getNumerator() * denominator);
numerator *= rn.getDenominator();
int numer = numerator - (rn.getNumerator() * denominator);

numerator = numer;
denominator = denom;
}

int RationalNumber::getDenominator() {
int RationalNumber::getDenominator() const {
return denominator;
}

void RationalNumber::negate() {
numerator*=-1;
}

int RationalNumber::getNumerator() {
int RationalNumber::getNumerator() const {
return numerator;
}

Expand Down
13 changes: 6 additions & 7 deletions legacy/RationalNumber.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,14 @@
class RationalNumber {
public:
RationalNumber(int num, int den);
~RationalNumber();
void divide(RationalNumber * rn);
void multiply(RationalNumber * rn);
void add(RationalNumber * rn);
void subtract(RationalNumber * rn);
void divide(const RationalNumber & rn);
void multiply(const RationalNumber & rn);
void add(const RationalNumber & rn);
void subtract(const RationalNumber & rn);
void negate();

int getNumerator();
int getDenominator();
int getNumerator() const;
int getDenominator() const;

float getFloat();

Expand Down
63 changes: 18 additions & 45 deletions legacy/StringTokenizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,54 +3,38 @@
#include "StringTokenizer.h"
#include <string.h>

StringTokenizer::StringTokenizer(char * n_string) {

string = new char[strlen(n_string) + 1];
strcpy(string, n_string);

stringLen = strlen(string);

currentOffset = 0;
moreTokens = 1;
}

StringTokenizer::~StringTokenizer()
StringTokenizer::StringTokenizer(const std::string &n_string)
: string(n_string), currentOffset(0), moreTokens(true)
{
delete [] string;
}

char * StringTokenizer::nextToken()
{
char* toReturn;

int cont = 1;

std::string StringTokenizer::nextToken()
{
int endOfToken;

for (;(currentOffset<stringLen) && (isWhiteSpace(string[currentOffset])); currentOffset++);
for (;(currentOffset<string.size()) && (isWhiteSpace(string[currentOffset])); currentOffset++);

endOfToken = findTokenEnd(currentOffset, string);

toReturn = getSubString(string, currentOffset, endOfToken);
std::string toReturn = getSubString(string, currentOffset, endOfToken);

currentOffset = endOfToken + 1;

if (currentOffset == stringLen)
moreTokens = 0;
if (currentOffset >= string.size())
moreTokens = false;

return toReturn;
}

int StringTokenizer::hasMoreTokens() {
bool StringTokenizer::hasMoreTokens() {
return moreTokens;
}

int StringTokenizer::findTokenEnd(int start, char * string) {

int StringTokenizer::findTokenEnd(int start, const std::string& string) {
if ( isNumber(string[start]) ) {
for (; (currentOffset<stringLen) && (isNumber(string[start])); start++);
}

else {
for (; (start<string.size()) && (isNumber(string[start])); start++);
} else {
if ( isOperator(string[start]) ) {
start++;
}
Expand All @@ -61,23 +45,12 @@ int StringTokenizer::findTokenEnd(int start, char * string) {



char * StringTokenizer::getSubString(char * string, int start, int end) {
char * toReturn;

int len = end - start + 1;

toReturn = new char[len+1];

toReturn[len] = NULL;

for (int i = 0; i<len; i++)
toReturn[i] = string[i+start];

return toReturn;
std::string StringTokenizer::getSubString(const std::string &string, int start, int end) {
return string.substr(start, end);
}


int StringTokenizer::isOperator(char c) {
bool StringTokenizer::isOperator(char c) {
switch (c) {
case '+':
case '-':
Expand All @@ -94,7 +67,7 @@ int StringTokenizer::isOperator(char c) {
}


int StringTokenizer::isNumber(char c) {
bool StringTokenizer::isNumber(char c) {
switch (c) {
case '1':
case '2':
Expand All @@ -115,7 +88,7 @@ int StringTokenizer::isNumber(char c) {
}


int StringTokenizer::isWhiteSpace(char c) {
bool StringTokenizer::isWhiteSpace(char c) {
switch (c) {
case '1':
case '2':
Expand Down
25 changes: 12 additions & 13 deletions legacy/StringTokenizer.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef INFIZ_STRING_TOKENIZER_H
#define INFIZ_STRING_TOKENIZER_H

#include <string>

// StringTokenizer.h

Expand All @@ -12,24 +13,22 @@
class StringTokenizer
{
public:
StringTokenizer(char * n_string);
~StringTokenizer();
StringTokenizer(const std::string &n_string);

int hasMoreTokens();

char * nextToken();
bool hasMoreTokens();

std::string nextToken();

private:
std::string string;
int currentOffset;
int stringLen;
char * string;
int isNumber(char c);
int isOperator(char c);
int isWhiteSpace(char c);
char * getSubString(char * string, int start, int end);
int findTokenEnd(int start, char * string);
int moreTokens;
bool moreTokens;

static bool isNumber(char c);
static bool isOperator(char c);
static bool isWhiteSpace(char c);
static std::string getSubString(const std::string &, int start, int end);
static int findTokenEnd(int start, const std::string &);
};

#endif
10 changes: 5 additions & 5 deletions legacy/infiz.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ void main(int argc, char * args[]) {
cin.getline(input,254, '\n');

while (cin) {
StringTokenizer * st = new StringTokenizer(input);
RationalNumber * answer = evaluateExpression(st);
StringTokenizer st(input);
RationalNumber answer = evaluateExpression(st);
cout << "answer: ";
if (answer->getDenominator()==1)
cout <<answer->getNumerator()<<endl<<flush;
if (answer.getDenominator()==1)
cout <<answer.getNumerator()<<endl<<flush;
else
cout <<answer->getNumerator()<<'/'<<answer->getDenominator()<<" ("<<answer->getFloat()<<")"<<endl<<flush;
cout <<answer.getNumerator()<<'/'<<answer.getDenominator()<<" ("<<answer.getFloat()<<")"<< '\n';
cin.getline(input,254, '\n');
}
}
Expand Down
Binary file modified legacy/infiz.ncb
Binary file not shown.
Binary file modified legacy/infiz.opt
Binary file not shown.
8 changes: 4 additions & 4 deletions legacy/infiz.plg
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@
--------------------Configuration: infiz - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\Users\Jason\AppData\Local\Temp\RSPB26E.tmp" with contents
Creating temporary file "C:\Users\Jason\AppData\Local\Temp\RSP51B6.tmp" with contents
[
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Debug/infiz.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /c
"C:\Users\Jason\Documents\GitHub\infiz\legacy\infiz.cpp"
]
Creating command line "cl.exe @C:\Users\Jason\AppData\Local\Temp\RSPB26E.tmp"
Creating temporary file "C:\Users\Jason\AppData\Local\Temp\RSPB26F.tmp" with contents
Creating command line "cl.exe @C:\Users\Jason\AppData\Local\Temp\RSP51B6.tmp"
Creating temporary file "C:\Users\Jason\AppData\Local\Temp\RSP51B7.tmp" with contents
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/infiz.pdb" /debug /machine:I386 /out:"Debug/infiz.exe" /pdbtype:sept
.\Debug\infiz.obj
.\InfixEvaluator\Debug\InfixEvaluator.lib
]
Creating command line "link.exe @C:\Users\Jason\AppData\Local\Temp\RSPB26F.tmp"
Creating command line "link.exe @C:\Users\Jason\AppData\Local\Temp\RSP51B7.tmp"
<h3>Output Window</h3>
Compiling...
infiz.cpp
Expand Down
Loading

0 comments on commit 136c224

Please sign in to comment.