+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DO REPEAT command in batch mode])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+do repeat x=a b c
+ y=d e f
+do repeat a=1 thru 5
+another command
+second command
++ third command
+end /* x */ /* y */ repeat print
+end
+ repeat
+do
+ repeat #a=1
+
+ inner command
+end repeat
+])
+AT_DATA([expout-base], [dnl
+ID "do"
+ID "repeat"
+ID "x"
+EQUALS
+ID "a"
+ID "b"
+ID "c"
+ID "y"
+EQUALS
+ID "d"
+ID "e"
+ID "f"
+ENDCMD
+STRING "do repeat a=1 thru 5"
+STRING "another command"
+STRING "second command"
+STRING "+ third command"
+STRING "end /* x */ /* y */ repeat print"
+ID "end"
+ID "repeat"
+ENDCMD
+ID "do"
+ID "repeat"
+ID "#a"
+EQUALS
+POS_NUM 1
+ENDCMD
+STRING " inner command"
+ID "end"
+ID "repeat"
+STOP
+])
+PSPP_CHECK_SCAN([-b])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - simple])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1()
+var1 var2 var3
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+RPAREN
+STRING "var1 var2 var3"
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - no newline after parentheses])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1() var1 var2 var3
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+RPAREN
+STRING " var1 var2 var3"
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - no newline before !ENDDEFINE])
+AT_KEYWORDS([scan ENDDEFINE])
+AT_DATA([input], [dnl
+define !macro1()
+var1 var2 var3!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+RPAREN
+STRING "var1 var2 var3"
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - all on one line])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1()var1 var2 var3!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+RPAREN
+STRING "var1 var2 var3"
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - empty])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1()
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+RPAREN
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - blank lines])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1()
+
+
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+RPAREN
+STRING ""
+STRING ""
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - arguments])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1(a(), b(), c())
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+ID "a"
+LPAREN
+RPAREN
+COMMA
+ID "b"
+LPAREN
+RPAREN
+COMMA
+ID "c"
+LPAREN
+RPAREN
+RPAREN
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - multiline arguments])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1(
+ a(), b(
+ ),
+ c()
+)
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+ID "a"
+LPAREN
+RPAREN
+COMMA
+ID "b"
+LPAREN
+RPAREN
+COMMA
+ID "c"
+LPAREN
+RPAREN
+RPAREN
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - arguments start on second line])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1
+(x,y,z
+)
+content 1
+content 2
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+ID "x"
+COMMA
+ID "y"
+COMMA
+ID "z"
+RPAREN
+STRING "content 1"
+STRING "content 2"
+MACRO_ID "!enddefine"
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 1])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+ENDCMD
+ID "data"
+ID "list"
+SLASH
+ID "x"
+POS_NUM 1
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 2])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1
+x.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+ID "x"
+ENDCMD
+ID "data"
+ID "list"
+SLASH
+ID "x"
+POS_NUM 1
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 3])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1(.
+x.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+ENDCMD
+ID "x"
+ENDCMD
+ID "data"
+ID "list"
+SLASH
+ID "x"
+POS_NUM 1
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 4])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+dnl Notice the command terminator at the end of the DEFINE command,
+dnl which should not be there and ends it early.
+define !macro1.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+ENDCMD
+ID "data"
+ID "list"
+SLASH
+ID "x"
+POS_NUM 1
+ENDCMD
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - missing !ENDDEFINE])
+AT_KEYWORDS([scan])
+AT_DATA([input], [dnl
+define !macro1()
+content line 1
+content line 2
+])
+AT_DATA([expout-base], [dnl
+ID "define"
+STRING "!macro1"
+LPAREN
+RPAREN
+STRING "content line 1"
+STRING "content line 2"