From 32741902830062a269bdb506b531a0f5dbe27b59 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Fri, 20 Jan 2023 17:42:05 +0100 Subject: [PATCH] fix right operande of + and - --- calc.c | 10 ++++++---- parser.c | 19 +++++++------------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/calc.c b/calc.c index 960bc14..aee65be 100644 --- a/calc.c +++ b/calc.c @@ -71,7 +71,7 @@ int main (int argc, char *argv[]) while (argc-- > 1) { char *arg = *(++argv); if (arg[0] != '-') { - fprintf (stderr, "%s: invalid option -- %s\n", progname, arg); + fprintf (stderr, "%s: invalid option -- '%s'\n", progname, arg); return usage (1); } char c = arg[1]; @@ -142,11 +142,12 @@ int main (int argc, char *argv[]) } nb = 0; char *pt = line[nb++] = buffer; - while (*pt++ != '\0') { + while (*pt != '\0') { if (*pt == '\n') { *pt = '\0'; - line[nb++] = ++pt; + line[nb++] = pt + 1; } + pt++; } VERBOSE (INFO, fprintf (stdout, "line: '%s'\n", buffer)); } @@ -158,7 +159,7 @@ int main (int argc, char *argv[]) } element_t *element = parser (line[i], NULL, 0); if (element == ERROR_OP) { - VERBOSE (WARNING, fprintf (stdout, "error while parsing: %s\n", line[i]); fflush (stdout)); + VERBOSE (WARNING, fprintf (stdout, "error while parsing: '%s'\n", line[i]); fflush (stdout)); ret = 1; } else { VERBOSE (INFO, print_element (element, 0)); @@ -222,6 +223,7 @@ int main (int argc, char *argv[]) // test: echo "95 - 6.3 * 15 - 1" | calc.exe | grep -q '=> -0\.5' // test: echo "95-6.3+15" | calc.exe | grep -q '=> 103.7' // test: echo "-cos (0) + 1" | calc.exe | grep -q '=> -0' +// test: echo "-cos(0)+1" | calc.exe | grep -q '=> -0' // test: echo "quit" | calc.exe | grep -q 'bye' // test: echo "help" | calc.exe | grep -q 'miscellaneous' // test: echo "1 + 2 *" | calc.exe | grep -q 'error' diff --git a/parser.c b/parser.c index 776d06b..a1c6666 100644 --- a/parser.c +++ b/parser.c @@ -303,18 +303,13 @@ element_t *parser (char *str, char **next, int prio) new->value = value; root = new; str = pt; - } else if (root->func == Val) { - if ((*str == '+') || (*str == '-')) { - if ((prio) && (prio > 1)) { - VERBOSE (DEBUG, fprintf (stdout, "stop because operator priority\n")); - *next = str; - return root; - } - if (subparser (&root, &str, Add, 2, 1) == ERROR_OP) { - delelement (root); - return ERROR_OP; - } - } else { + } else if ((*str == '+') || (*str == '-')) { + if ((prio) && (prio > 1)) { + VERBOSE (DEBUG, fprintf (stdout, "stop because operator priority\n")); + *next = str; + return root; + } + if (subparser (&root, &str, Add, 2, 1) == ERROR_OP) { delelement (root); return ERROR_OP; } -- 2.30.2