From: Ben Pfaff Date: Fri, 9 Apr 2021 17:32:18 +0000 (-0700) Subject: segment: Fix segmentation of integer followed by "." at end of file. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=9ecd5482c0847e65b012509008deb1a19e501c67 segment: Fix segmentation of integer followed by "." at end of file. Previously this was segmented as a single number containing a trailing dot, but it should be an integer followed by end-of-command. --- diff --git a/src/language/lexer/segment.c b/src/language/lexer/segment.c index 93eb1e8f85..3e060a5b9f 100644 --- a/src/language/lexer/segment.c +++ b/src/language/lexer/segment.c @@ -286,20 +286,23 @@ segmenter_parse_number__ (struct segmenter *s, const char *input, size_t n, if (!eof) return -1; goto number; - }; + } if (input[ofs] == '.') { + if (ofs + 1 >= n) + { + if (!eof) + return -1; + goto number; + } + ofs = skip_digits (input, n, eof, ofs + 1); if (ofs < 0) return -1; + else if (ofs >= n) + goto number; } - if (ofs >= n) - { - if (!eof) - return -1; - goto number; - } if (input[ofs] == 'e' || input[ofs] == 'E') { ofs++; diff --git a/tests/language/lexer/lexer.at b/tests/language/lexer/lexer.at index e664ac2ad7..d499f0922f 100644 --- a/tests/language/lexer/lexer.at +++ b/tests/language/lexer/lexer.at @@ -103,7 +103,7 @@ AT_SETUP([lexer crash due to overflow]) printf "DATA LIST/5555555555555555." > lexer.sps AT_CHECK([pspp -O format=csv lexer.sps], [1], [dnl -lexer.sps:1.11-1.27: error: DATA LIST: Syntax error at `5555555555555555.': Expected integer between 1 and 2147483647. +lexer.sps:1.11-1.26: error: DATA LIST: Syntax error at `5555555555555555': Expected integer between 1 and 2147483647. ]) AT_CLEANUP diff --git a/tests/language/lexer/segment.at b/tests/language/lexer/segment.at index 04a77a9b8f..b358b3e509 100644 --- a/tests/language/lexer/segment.at +++ b/tests/language/lexer/segment.at @@ -345,7 +345,7 @@ AT_DATA([input], [dnl 5e1 6E-1 7e+1 6E+01 6e-03 .3E1 .4e-1 .5E+1 .6e+01 .7E-03 1.23e1 45.6E-1 78.9e+1 99.9E+01 11.2e-03 -. 1e e1 1e+ 1e- +. 1e e1 1e+ 1e- 1. ]) AT_DATA([expout-base], [dnl number 0 space @@ -395,8 +395,10 @@ start_command . space expected_exponent 1e space identifier e1 space expected_exponent 1e+ space -expected_exponent 1e- --newline \n (later) +expected_exponent 1e- space +number 1 +end_command . +-newline \n (first) - end ])