return ofs;
}
+/* We are segmenting a DO REPEAT command, currently reading the syntax that
+ defines the stand-in variables (the head) before the lines of syntax to be
+ repeated (the body). */
static int
segmenter_parse_do_repeat_1__ (struct segmenter *s,
const char *input, size_t n, bool eof,
if (ofs < 0)
return -1;
- if (*type == SEG_START_COMMAND || *type == SEG_SEPARATE_COMMANDS)
- s->state = S_DO_REPEAT_2;
- else if (*type == SEG_END_COMMAND)
+ if (*type == SEG_SEPARATE_COMMANDS)
{
+ /* We reached a blank line that separates the head from the body. */
+ s->state = S_DO_REPEAT_2;
+ }
+ else if (*type == SEG_END_COMMAND || *type == SEG_START_COMMAND)
+ {
+ /* We reached the body. */
s->state = S_DO_REPEAT_3;
s->substate = 1;
}
return ofs;
}
+/* We are segmenting a DO REPEAT command, currently reading a blank line that
+ separates the head from the body. */
static int
segmenter_parse_do_repeat_2__ (struct segmenter *s,
const char *input, size_t n, bool eof,
if (*type == SEG_NEWLINE)
{
+ /* We reached the body. */
s->state = S_DO_REPEAT_3;
s->substate = 1;
}
return ofs - (input[ofs - 1] == '\r');
}
+/* We are in the body of DO REPEAT, segmenting the lines of syntax that are to
+ be repeated. Report each line of syntax as a single SEG_DO_REPEAT_COMMAND.
+
+ DO REPEAT can be nested, so we look for DO REPEAT...END REPEAT blocks inside
+ the lines we're segmenting. s->substate counts the nesting level, starting
+ at 1. */
static int
segmenter_parse_do_repeat_3__ (struct segmenter *s,
const char *input, size_t n, bool eof,
return -1;
else if (s->substate == 0)
{
+ /* Nesting level dropped to 0, so we've finished reading the DO REPEAT
+ body. */
s->state = S_GENERAL;
s->substate = SS_START_OF_COMMAND | SS_START_OF_LINE;
return segmenter_push (s, input, n, eof, type);
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"
+SKIP
+ID "repeat"
+SKIP
+ID "x"
+EQUALS
+ID "a"
+SKIP
+ID "b"
+SKIP
+ID "c"
+SKIP
+SKIP
+ID "y"
+EQUALS
+ID "d"
+SKIP
+ID "e"
+SKIP
+ID "f"
+SKIP
+ENDCMD
+STRING "do repeat a=1 thru 5"
+SKIP
+STRING "another command"
+SKIP
+STRING "second command"
+SKIP
+STRING "+ third command"
+SKIP
+STRING "end /* x */ /* y */ repeat print"
+SKIP
+ID "end"
+SKIP
+SKIP
+ID "repeat"
+SKIP
+ENDCMD
+ID "do"
+SKIP
+SKIP
+ID "repeat"
+SKIP
+ID "#a"
+EQUALS
+POS_NUM 1
+SKIP
+ENDCMD
+SKIP
+STRING " inner command"
+SKIP
+ID "end"
+SKIP
+ID "repeat"
+-SKIP
+STOP
+])
+PSPP_CHECK_SCAN([-b])
+AT_CLEANUP
+\f
AT_SETUP([batch mode])
AT_KEYWORDS([scan])
AT_DATA([input], [dnl
PSPP_CHECK_SEGMENT([-i])
AT_CLEANUP
\f
+AT_SETUP([DO REPEAT command in batch mode])
+AT_KEYWORDS([segment])
+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
+identifier do space
+identifier repeat space
+identifier x
+punct =
+identifier a space
+identifier b space
+identifier c
+newline \n (later)
+
+spaces __________
+identifier y
+punct =
+identifier d space
+identifier e space
+identifier f
+newline \n (later)
+
+start_command
+do_repeat_command do_repeat_a=1_thru_5
+newline \n (DO REPEAT)
+
+do_repeat_command another_command
+newline \n (DO REPEAT)
+
+do_repeat_command second_command
+newline \n (DO REPEAT)
+
+do_repeat_command +_third_command
+newline \n (DO REPEAT)
+
+do_repeat_command end_/*_x_*/_/*_y_*/_repeat_print
+newline \n (DO REPEAT)
+
+identifier end
+newline \n (later)
+ space
+identifier repeat
+newline \n (later)
+
+start_command
+identifier do
+newline \n (later)
+
+spaces __
+identifier repeat space
+identifier #a
+punct =
+number 1
+newline \n (later)
+
+separate_commands
+newline \n (DO REPEAT)
+
+do_repeat_command __inner_command
+newline \n (DO REPEAT)
+
+identifier end space
+identifier repeat
+-newline \n (later)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-b])
+AT_CLEANUP
+\f
AT_SETUP([batch mode])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl