summaryrefslogtreecommitdiff
path: root/Src/math.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/math.c')
-rw-r--r--Src/math.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/Src/math.c b/Src/math.c
index 809999f9c..66d57fd53 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -216,17 +216,33 @@ lexconstant(void)
lastbase = 16;
return NUM;
}
- else if (isset(OCTALZEROES) &&
- (memchr(nptr, '.', strlen(nptr)) == NULL) &&
- idigit(*nptr)) {
- yyval.u.l = zstrtol(ptr, &ptr, 0);
- lastbase = 8;
- return NUM;
+ else if (isset(OCTALZEROES))
+ {
+ char *ptr2;
+
+ /*
+ * Make sure this is a real octal constant;
+ * it can't be a base indication (always decimal)
+ * or a floating point number.
+ */
+ for (ptr2 = nptr; idigit(*ptr2); ptr2++)
+ ;
+
+ if (ptr2 > nptr && *ptr2 != '.' && *ptr2 != 'e' &&
+ *ptr2 != 'E' && *ptr2 != '#')
+ {
+ yyval.u.l = zstrtol(ptr, &ptr, 0);
+ lastbase = 8;
+ return NUM;
+ }
+ nptr = ptr2;
}
}
-
- while (idigit(*nptr))
- nptr++;
+ else
+ {
+ while (idigit(*nptr))
+ nptr++;
+ }
if (*nptr == '.' || *nptr == 'e' || *nptr == 'E') {
/* it's a float */