From fa90ad17dbe0cbdea10bd4b020e48f94d56b3807 Mon Sep 17 00:00:00 2001 From: Jon Lewis Date: Tue, 16 Oct 2018 20:58:34 -0500 Subject: [PATCH] Converted push/pop to pass by ref --- ee.c | 65 +++++++++++++++++++++++++++++++++++++----------------------- ee.h | 8 ++++---- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/ee.c b/ee.c index cdce3e5..3f9c714 100644 --- a/ee.c +++ b/ee.c @@ -1,34 +1,37 @@ #include "ee.h" int error = 0; - +void printStack(STACK); int -main (int argc, const char* argv[]){ +main (const int argc, const char* argv[]){ STACK expr = NULL; + const char** endPtr = argv+argc, ** arg = argv+1 ; while ((arg < endPtr) && (!error)){ if (arrity(**arg)) - expr = push(evaluate(&expr, **arg), expr); - + push(evaluate(&expr, **arg), &expr); + else if(isNum(*arg)) - expr = push(strtod(*arg,NULL), expr); + push(strtod(*arg,NULL), &expr); else error |= ERR_INVALID_INPUT; - arg++; + + arg += 1; + } if (expr == NULL) error |= ERR_NS_OPERANDS; - else if (expr->tail!=NULL) + else if ((*expr).tail != NULL) error |= ERR_NS_OPERATORS; - - report(expr); + + report(&expr); return error; } @@ -131,8 +134,8 @@ operands(STACK* target_stack, int size){ double * endPtr = _operands + size; while ((tPtr < endPtr) && !error) { - *tPtr = peek((*target_stack)); - (*target_stack) = pop(*target_stack); + *tPtr = peek((target_stack)); + pop(target_stack); tPtr += 1; } @@ -148,13 +151,14 @@ fact(int n){ } void -report(STACK expr){ +report(STACK* expr){ /* * reportErrors() prints error strings according to the value of global * bitvector error if it is nonzero, or the result of evaluation if error * is zero. */ + //printStack(expr); if (error & ERR_INVALID_INPUT) printf("Error: Unexpected input.\n"); @@ -171,38 +175,49 @@ report(STACK expr){ printf("%g\n", peek(expr)); } -STACK -push(double datum, STACK tail){ +void +printStack(STACK s){ + /* Given a stack, print "datum tail"*/ + + while (s != NULL){ + printf("%g\t%p\n", s->datum, s->tail); + s = s->tail; + } + printf("%s\n", "-----"); +} + +void +push(double datum, STACK* tail){ /* Given a double value (datum), and a STACK (tail), * push(datum,tail) is the STACK resulting from * prepending datum to the STACK tail. */ NODE* new_node = (NODE*)malloc(sizeof(NODE)); (*new_node).datum = datum; - (*new_node).tail = tail; - return new_node; + (*new_node).tail = *tail; + (*tail) = new_node; } -STACK -pop(STACK target_stack){ +void +pop(STACK* target_stack){ /* Given a STACK (target_stack), pop(target_stack) * is the STACK resulting from the removal of the first * item in target_stack; */ - + STACK tail = NULL; - if (target_stack != NULL){ - tail = (*target_stack).tail; - free(target_stack); + if ((*target_stack) != NULL){ + tail = (*target_stack)->tail; + free(*target_stack); } - return tail; + (*target_stack) = tail; } double -peek(STACK target_stack){ +peek(STACK* target_stack){ /* Given a STACK (target_stack), peek(STACK) * is the first element's datum. */ - return (target_stack)? (*target_stack).datum : 0; + return (*target_stack)? (*target_stack)->datum : 0; } diff --git a/ee.h b/ee.h index 1fff3c1..c94f4de 100644 --- a/ee.h +++ b/ee.h @@ -18,9 +18,9 @@ struct EE_STACK_NODE { typedef struct EE_STACK_NODE NODE; typedef struct EE_STACK_NODE* STACK; -STACK push(double,STACK); -STACK pop(STACK); -double peek(STACK); +void push(double,STACK*); +void pop(STACK*); +double peek(STACK*); int isNum(const char*); int arrity(const char); @@ -29,7 +29,7 @@ double evaluate(STACK*, char); double* operands(STACK*, int); double fact(int n); -void report(); +void report(STACK*);