AT_KEYWORDS([segment])
AT_DATA([input], [dnl
~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
-~&|=>=><=<~=<>(),-+*/[[]]**
-% : ; ? _ ` { } ~
+~&|=>=><=<~=<>(),-+*/[[]]**!*
+% : ; ? _ ` { } ~ !*
])
AT_DATA([expout-base], [dnl
punct ~ space
punct [[
punct ]]
punct **
+macro_id !*
newline \n (later)
punct % space
punct ` space
punct { space
punct } space
-punct ~
+punct ~ space
+macro_id !*
-newline \n (later)
-
end
PSPP_CHECK_SEGMENT([-i])
AT_CLEANUP
\f
-AT_SETUP([numbers])
+AT_SETUP([positive numbers])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
0 1 01 001. 1.
])
PSPP_CHECK_SEGMENT([-i])
AT_CLEANUP
+\f
+AT_SETUP([negative numbers])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+ -0 -1 -01 -001. -1.
+ -123. /* comment 1 */ /* comment 2 */
+ -.1 -0.1 -00.1 -00.10
+ -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
+ -/**/1
+ -. -1e -e1 -1e+ -1e- -1.
+])
+AT_DATA([expout-base], [dnl
+spaces _
+number -0 space
+number -1 space
+number -01 space
+number -001. space
+number -1
+end_command .
+newline \n (first)
+ space
+number -123
+end_command . space
+comment /*_comment_1_*/ space
+comment /*_comment_2_*/
+newline \n (first)
+ space
+number -.1 space
+number -0.1 space
+number -00.1 space
+number -00.10
+newline \n (later)
+ space
+number -5e1 space
+number -6E-1 space
+number -7e+1 space
+number -6E+01 space
+number -6e-03
+newline \n (later)
+ space
+number -.3E1 space
+number -.4e-1 space
+number -.5E+1 space
+number -.6e+01 space
+number -.7E-03
+newline \n (later)
+ space
+number -1.23e1 space
+number -45.6E-1 space
+number -78.9e+1 space
+number -99.9E+01 space
+number -11.2e-03
+newline \n (later)
+ space
+punct -
+comment /**/
+number 1
+newline \n (later)
+ space
+punct -
+punct . space
+expected_exponent -1e space
+punct -
+identifier e1 space
+expected_exponent -1e+ space
+expected_exponent -1e- space
+number -1
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+
\f
AT_SETUP([strings])
AT_KEYWORDS([segment])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
define !macro1()
-var1 var2 var3
+var1 var2 var3 "!enddefine"
!enddefine.
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
punct )
spaces
newline \n (DEFINE)
-macro_body var1_var2_var3
+macro_body var1_var2_var3_"!enddefine"
newline \n (DEFINE)
macro_id !enddefine
AT_SETUP([DEFINE command - no newline after parentheses])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
-define !macro1() var1 var2 var3
+define !macro1() var1 var2 var3 /* !enddefine
!enddefine.
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
punct )
-macro_body _var1_var2_var3
+macro_body _var1_var2_var3_/*_!enddefine
newline \n (DEFINE)
macro_id !enddefine
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
punct )
spaces
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
punct )
macro_body var1_var2_var3
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
punct )
spaces
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
punct )
spaces
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
identifier a
punct (
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
newline \n (later)
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
newline \n (later)
punct (
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
end_command .
newline \n (first)
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
newline \n (later)
identifier x
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
end_command .
newline \n (first)
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
end_command .
newline \n (first)
])
AT_DATA([expout-base], [dnl
identifier define space
-macro_id !macro1
+macro_name !macro1
punct (
punct )
spaces
])
PSPP_CHECK_SEGMENT([-a])
AT_CLEANUP
+\f
+# This checks for regression against bug #61253. To see the read of
+# uninitialized data, run with valgrind. The test will pass either
+# way. (The bug report has a more complicated crashing case.)
+AT_SETUP([input ends in carriage return])
+printf '\r' > input
+AT_DATA([expout-base], [dnl
+separate_commands
+spaces \r
+end
+])
+PSPP_CHECK_SEGMENT
+AT_CLEANUP