LOOP: Correctly implement MXLOOPS and add a test.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 5 Nov 2011 23:11:59 +0000 (16:11 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 6 Nov 2011 16:19:23 +0000 (08:19 -0800)
Previously the MXLOOPS value was implemented incorrectly: the
loop would actually iterate MXLOOPS+1 times.  This commit fixes
the problem.

src/language/control/loop.c
tests/language/control/loop.at

index e91d9438f39c131836141ee2be53d47c970d2904..e4877b9e82cd126a90d9936953760df456d6f66d 100644 (file)
@@ -367,12 +367,8 @@ end_loop_trns_proc (void *loop_, struct ccase **c, casenumber case_num UNUSED)
     goto break_out;
 
   /* MXLOOPS limiter. */
-  if (loop->max_pass_count >= 0)
-    {
-      if (loop->pass >= loop->max_pass_count)
-        goto break_out;
-      loop->pass++;
-    }
+  if (loop->max_pass_count >= 0 && ++loop->pass >= loop->max_pass_count)
+    goto break_out;
 
   /* Indexing clause limiter: counting downward. */
   if (loop->index_var != NULL)
index af8d8aecf03d1745beba2a0851dd48d8dd9de49c..be214cce489e3ee52b4ff397585362cf53d22a52 100644 (file)
@@ -208,10 +208,9 @@ AT_CHECK([cat pspp.csv], [0], [dnl
 ])
 AT_CLEANUP
 
-AT_SETUP([LOOP with no conditions])
+AT_SETUP([LOOP with no conditions containing BREAK])
 AT_DATA([loop.sps], [dnl
 LOOP_DATA
-set mxloops = 2.
 compute #p = x.
 loop.
 print /#p.
@@ -246,3 +245,43 @@ AT_CHECK([cat pspp.csv], [0], [dnl
 --------
 ])
 AT_CLEANUP
+
+AT_SETUP([LOOP with no conditions that ends due to MXLOOPS])
+AT_DATA([loop.sps], [dnl
+LOOP_DATA
+set mxloops=2.
+loop.
+compute #p = #p + 1.
+print /x #p.
+end loop.
+print/'--------'.
+execute.
+])
+AT_CHECK([pspp -o pspp.csv loop.sps])
+AT_CHECK([cat pspp.csv], [0], [dnl
+1     1.00 @&t@
+
+1     2.00 @&t@
+
+--------
+
+2     3.00 @&t@
+
+2     4.00 @&t@
+
+--------
+
+3     5.00 @&t@
+
+3     6.00 @&t@
+
+--------
+
+4     7.00 @&t@
+
+4     8.00 @&t@
+
+--------
+])
+AT_CLEANUP
+