]> git.mxchange.org Git - simgear.git/commitdiff
Fix the fixes. Note that "." had the same problem as "+" and "-", and
authorandy <andy>
Fri, 11 Mar 2005 20:39:07 +0000 (20:39 +0000)
committerandy <andy>
Fri, 11 Mar 2005 20:39:07 +0000 (20:39 +0000)
that we can still match non-identical constants if they are both
strings with the same numerical value.

simgear/nasal/codegen.c
simgear/nasal/string.c

index fa605516f38c8a7f7f4d0367d28583b3dbbd43c4..f481e4190e9affe0866ba5316237bd72a78fdebe 100644 (file)
@@ -55,15 +55,25 @@ static naRef getConstant(struct Parser* p, int idx)
 // Interns a scalar (!) constant and returns its index
 static int internConstant(struct Parser* p, naRef c)
 {
-    int i, n = naVec_size(p->cg->consts);
+    int i, j, n = naVec_size(p->cg->consts);
     for(i=0; i<n; i++) {
         naRef b = naVec_get(p->cg->consts, i);
         if(IS_NUM(b) && IS_NUM(c) && b.num == c.num)
             return i;
-        if(IS_REF(b) && IS_REF(c) && b.ref.ptr.obj->type != c.ref.ptr.obj->type)
-            continue;
-        if(naEqual(b, c))
-            return i;
+        if(IS_STR(b) && IS_STR(c)) {
+            int len = naStr_len(c);
+            char* cs = naStr_data(c);
+            char* bs = naStr_data(b);
+            if(naStr_len(b) != len)
+                continue;
+            for(j=0; j<len; j++)
+                if(cs[j] != bs[j])
+                    continue;
+        }
+        if(IS_REF(b) && IS_REF(c))
+            if(b.ref.ptr.obj->type == c.ref.ptr.obj->type)
+                if(naEqual(b, c))
+                    return i;
     }
     return newConstant(p, c);
 }
index 5efb153e389518786a58139e4b0c197663067919..6d9434f726a966d6f3a0204939f8420f0f2754d1 100644 (file)
@@ -147,8 +147,7 @@ static int readdec(unsigned char* s, int len, int i, double* v)
 
 // Reads a signed integer out of the string starting at i, stores it
 // in v, and returns the next index to start at.  Zero-length
-// decimal numbers (and length-1 strings like '+') are allowed, and
-// are returned as zero.
+// decimal numbers are allowed, and are returned as zero.
 static int readsigned(unsigned char* s, int len, int i, double* v)
 {
     int i0 = i, i2;
@@ -157,10 +156,12 @@ static int readsigned(unsigned char* s, int len, int i, double* v)
     if(s[i] == '+')      { i++; }
     else if(s[i] == '-') { i++; sgn = -1; }
     i2 = readdec(s, len, i, &val);
-    if(i2 == i)
-        return i0; // don't parse "+" or "-" as zero.
+    if(i0 == i && i2 == i) {
+        *v = 0;
+        return i0; // don't successfully parse bare "+" or "-"
+    }
     *v = sgn*val;
-    return i;
+    return i2;
 }
 
 
@@ -183,6 +184,10 @@ static int tonum(unsigned char* s, int len, double* result)
     int i=0, fraclen=0;
     double sgn=1, val, frac=0, exp=0;
 
+    // Special case, "." is not a number, even though "1." and ".0" are.
+    if(len == 1 && s[0] == '.')
+        return 0;
+
     // Read the integer part
     i = readsigned(s, len, i, &val);
     if(val < 0) { sgn = -1; val = -val; }