Patch #6302.
authorBen Pfaff <blp@gnu.org>
Sat, 8 Dec 2007 06:09:03 +0000 (06:09 +0000)
committerBen Pfaff <blp@gnu.org>
Sat, 8 Dec 2007 06:09:03 +0000 (06:09 +0000)
* casegrouper.c (casegrouper_get_next_group): Cause a casegrouper
made from an empty casereader produce a casegrouper with no
groups, instead of one with one group that has no cases.

* casereader.c (casereader_is_empty): New function.

src/data/ChangeLog
src/data/casegrouper.c
src/data/casereader.c
src/data/casereader.h

index e25c3984df8c9333a1f06ac803d3449def61d750..25d67925bc962a7d3d68d6acb53d36a50aa455ef 100644 (file)
@@ -1,3 +1,13 @@
+2007-12-07  Ben Pfaff  <blp@gnu.org>
+
+       Patch #6302.
+
+       * casegrouper.c (casegrouper_get_next_group): Cause a casegrouper
+       made from an empty casereader produce a casegrouper with no
+       groups, instead of one with one group that has no cases.
+
+       * casereader.c (casereader_is_empty): New function.
+
 2007-12-06  Ben Pfaff  <blp@gnu.org>
 
        Patch #6303.
index 8a4f05b318faa2874dab7d1e695a9d9901ab94c6..f5974a404b0a6200729548a62a2d67afde684323 100644 (file)
@@ -110,9 +110,18 @@ casegrouper_get_next_group (struct casegrouper *grouper,
     {
       if (grouper->reader != NULL)
         {
-          *reader = grouper->reader;
-          grouper->reader = NULL;
-          return true;
+          if (!casereader_is_empty (grouper->reader))
+            {
+              *reader = grouper->reader;
+              grouper->reader = NULL;
+              return true;
+            }
+          else
+            {
+              casereader_destroy (grouper->reader);
+              grouper->reader = NULL;
+              return false;
+            }
         }
       else
         {
index 8b78645627e1243f4efb875612b97eac2666cc70..e6d859c9df5c101799f086aa12b58f670b36561d 100644 (file)
@@ -183,6 +183,24 @@ casereader_peek (struct casereader *reader, casenumber idx, struct ccase *c)
   return false;
 }
 
+/* Returns true if no cases remain to be read from READER, or if
+   an error has occurred on READER.  (A return value of false
+   does *not* mean that the next call to casereader_peek or
+   casereader_read will return true, because an error can occur
+   in the meantime.) */
+bool
+casereader_is_empty (struct casereader *reader)
+{
+  struct ccase c;
+  if (reader->case_cnt == 0 || !casereader_peek (reader, 0, &c))
+    return true;
+  else
+    {
+      case_destroy (&c);
+      return false;
+    }
+}
+
 /* Returns true if an I/O error or another hard error has
    occurred on READER, a clone of READER, or on some object on
    which READER's data has a dependency, false otherwise. */
index d4a1cce5188a7a467569cbceb95ec9f30a1db402..6d719c6128da45b9fbd8f6635741132053311816 100644 (file)
@@ -70,6 +70,7 @@ void casereader_swap (struct casereader *, struct casereader *);
 
 bool casereader_peek (struct casereader *, casenumber, struct ccase *)
      WARN_UNUSED_RESULT;
+bool casereader_is_empty (struct casereader *);
 
 bool casereader_error (const struct casereader *);
 void casereader_force_error (struct casereader *);