summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-03-12 06:22:15 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-03-12 06:22:15 -0700
commit36d83a1ec702a46a0e5e3813fba69e31fd70d47b (patch)
treeebb220c8a2d04a93c685dfa0b4c7a707c62525be
parente0af172ad80d71f441fcb99f18fe24a946001ade (diff)
downloadtxr-36d83a1ec702a46a0e5e3813fba69e31fd70d47b.tar.gz
txr-36d83a1ec702a46a0e5e3813fba69e31fd70d47b.tar.bz2
txr-36d83a1ec702a46a0e5e3813fba69e31fd70d47b.zip
parser: catch out-of-range floats.
* parser.l (out_of_range_float): New static function. (grammar): Check for flo_str returning nil in several places; that value is returned for out of range floats. This is not documented! * txr.1: Document athat flo-str returns nil for out-of-range floats.
-rw-r--r--parser.l18
-rw-r--r--txr.15
2 files changed, 20 insertions, 3 deletions
diff --git a/parser.l b/parser.l
index 7a9d8d8b..c0114b24 100644
--- a/parser.l
+++ b/parser.l
@@ -137,6 +137,12 @@ static void yyerrprepf(scanner_t *scanner, val fmt, ...)
}
}
+static void out_of_range_float(scanner_t *scanner, val tok)
+{
+ yyerrorf(scanner, lit("out-of-range floating-point literal: ~a"),
+ tok, nao);
+}
+
static wchar_t char_esc(int letter)
{
switch (letter) {
@@ -344,7 +350,9 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
|| yy_top_state(yyscanner) == QWLIT)
yy_pop_state(yyscanner);
- yylval->val = flo_str(str);
+ if ((yylval->val = flo_str(str)) == nil)
+ out_of_range_float(yyg, str);
+
return NUMBER;
}
@@ -360,7 +368,9 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
|| yy_top_state(yyscanner) == QWLIT)
yy_pop_state(yyscanner);
- yylval->val = flo_str(str);
+ if ((yylval->val = flo_str(str)) == nil)
+ out_of_range_float(yyg, str);
+
return NUMBER;
}
@@ -372,7 +382,9 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
|| yy_top_state(yyscanner) == QWLIT)
yy_pop_state(yyscanner);
- yylval->val = flo_str(str);
+ if ((yylval->val = flo_str(str)) == nil)
+ out_of_range_float(yyg, str);
+
return NUMBER;
}
diff --git a/txr.1 b/txr.1
index 7f2c5cf9..89f6c32e 100644
--- a/txr.1
+++ b/txr.1
@@ -36741,6 +36741,11 @@ part denoted by the letter
or
.codn e ,
an optional sign and one or more optional exponent digits.
+If the value specified by
+.meta string
+is out of range of the floating-point representation, then
+.code nil
+is returned.
The
.code num-str