]> ocean-lang.org Git - ocean/commitdiff
parsergen: fix some problems with choose_sym()
authorNeilBrown <neil@brown.name>
Fri, 5 Mar 2021 09:20:36 +0000 (20:20 +1100)
committerNeilBrown <neil@brown.name>
Wed, 10 Mar 2021 01:00:31 +0000 (12:00 +1100)
This would sometimes give wrong result, particularly bad when it is
larger than body_size.

Signed-off-by: NeilBrown <neil@brown.name>
csrc/parsergen.mdc

index 9156c63041121d0ef1f0e34bc7b45932967128b8..ad20195f51b8f355bc0bca3eebe021eb495106e0 100644 (file)
@@ -2204,7 +2204,7 @@ transformed, and will cause an error when the code is compiled.
                        c = *name;
                }
                if (namlen == 0) {
-                       if (name == *namep)
+                       if (name == *namep || n > p->body_size)
                                return -1;
                        *namep = name;
                        return n;
@@ -2213,8 +2213,10 @@ transformed, and will cause an error when the code is compiled.
                for (i = 0; i < p->body_size; i++) {
                        if (!subseq_match(nam, namlen, p->body[i]->name))
                                continue;
-                       if (slen == 0 || p->body[i]->name.len < slen)
+                       if (slen == 0 || p->body[i]->name.len < slen) {
                                s = i;
+                               slen = p->body[i]->name.len;
+                       }
                        if (s >= 0 && p->body[i] != p->body[s] &&
                            p->body[i]->name.len == p->body[s]->name.len)
                                /* not unique, so s cannot be used */
@@ -2222,7 +2224,7 @@ transformed, and will cause an error when the code is compiled.
                }
                if (s < 0)
                        return -1;
-               if (n == 0);
+               if (n == 0)
                        n = 1;
                for (i = 0; i < p->body_size; i++)
                        if (p->body[i] == p->body[s]) {
@@ -2230,7 +2232,7 @@ transformed, and will cause an error when the code is compiled.
                                if (n == 0)
                                        break;
                        }
-               if (n > 1)
+               if (n > 0 || i == p->body_size)
                        return -1;
                *namep = name;
                return i + 1;