The DEFINE command should not have a command terminator before the final
!ENDDEFINE. When it does, that ends the whole thing early. The segmenter
didn't handle this well, instead treating everything up to !ENDDEFINE as
part of the command. That's probably not the best way because it makes
for confusing error messages. This improves the behavior.
if (ofs < 0)
return -1;
- if (*type == SEG_NEWLINE)
+ if (*type == SEG_END_COMMAND)
+ {
+ /* The DEFINE command is malformed because there was a command terminator
+ before the first line of the body. Transition back to general
+ parsing. */
+ s->state = S_GENERAL;
+ return ofs;
+ }
+ else if (*type == SEG_NEWLINE)
s->state = S_DEFINE_4;
return ofs;
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"
+SKIP
+MACRO_ID "!macro1"
+ENDCMD
+SKIP
+ID "data"
+SKIP
+ID "list"
+SKIP
+SLASH
+ID "x"
+SKIP
+POS_NUM 1
+ENDCMD
+-SKIP
+STOP
+])
+PSPP_CHECK_SCAN([-i])
+AT_CLEANUP
+\f
AT_SETUP([DEFINE command - missing !ENDDEFINE])
AT_KEYWORDS([scan])
AT_DATA([input], [dnl
-define !macro1().
+define !macro1()
content line 1
content line 2
])
MACRO_ID "!macro1"
LPAREN
RPAREN
-ENDCMD
SKIP
STRING "content line 1"
SKIP
end_command .
newline \n (first)
+identifier data space
+identifier list space
+punct /
+identifier x space
+number 1
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-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
+identifier define space
+macro_id !macro1
+end_command .
+newline \n (first)
+
identifier data space
identifier list space
punct /
AT_SETUP([DEFINE command - missing !ENDDEFINE])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
-define !macro1().
+define !macro1()
content line 1
content line 2
])
macro_id !macro1
punct (
punct )
-end_command .
newline \n (DEFINE)
macro_body content_line_1