From 3b4f0cbc9786b810e7f186030d4cb2d9f6bd7a56 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 5 Dec 2009 14:49:07 -0800 Subject: [PATCH] casereader: New function casereader_advance(). --- src/data/casereader.c | 28 +++++++++++++++++++++------- src/data/casereader.h | 1 + 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/data/casereader.c b/src/data/casereader.c index 0eb3baf5..77278851 100644 --- a/src/data/casereader.c +++ b/src/data/casereader.c @@ -264,13 +264,7 @@ casereader_count_cases__ (struct casereader *reader, casenumber max_cases) casenumber n_cases; clone = casereader_clone (reader); - for (n_cases = 0; n_cases < max_cases; n_cases++) - { - struct ccase *c = casereader_read (clone); - if (c == NULL) - break; - case_unref (c); - } + n_cases = casereader_advance (clone, max_cases); casereader_destroy (clone); return n_cases; @@ -315,6 +309,26 @@ casereader_get_proto (const struct casereader *reader) return reader->proto; } +/* Skips past N cases in READER, stopping when the last case in + READER has been read or on an input error. Returns the number + of cases successfully skipped. */ +casenumber +casereader_advance (struct casereader *reader, casenumber n) +{ + casenumber i; + + for (i = 0; i < n; i++) + { + struct ccase *c = casereader_read (reader); + if (c == NULL) + break; + case_unref (c); + } + + return i; +} + + /* Copies all the cases in READER to WRITER, propagating errors appropriately. */ void diff --git a/src/data/casereader.h b/src/data/casereader.h index 107e6069..fb9d50ff 100644 --- a/src/data/casereader.h +++ b/src/data/casereader.h @@ -80,6 +80,7 @@ casenumber casereader_count_cases (struct casereader *); void casereader_truncate (struct casereader *, casenumber); const struct caseproto *casereader_get_proto (const struct casereader *); +casenumber casereader_advance (struct casereader *, casenumber); void casereader_transfer (struct casereader *, struct casewriter *); struct casereader * -- 2.30.2