fix right operande of + and -
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Fri, 20 Jan 2023 16:42:05 +0000 (17:42 +0100)
committerLaurent Mazet <laurent.mazet@thalesgroup.com>
Fri, 20 Jan 2023 16:42:05 +0000 (17:42 +0100)
calc.c
parser.c

diff --git a/calc.c b/calc.c
index 960bc1495e8b616493dba4838e005eeec59044e3..aee65be74b3fdee227c59ca1d906eb5f61c8ae9f 100644 (file)
--- 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'
index 776d06b65823f858b6bf792d83e5933b1207f3d5..a1c6666a9f25f496e5eee9470957fd1c94f3050d 100644 (file)
--- 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;
                     }