Had to get last call to multipass_split_output() inside
authorBen Pfaff <blp@gnu.org>
Wed, 31 Mar 2004 06:07:03 +0000 (06:07 +0000)
committerBen Pfaff <blp@gnu.org>
Wed, 31 Mar 2004 06:07:03 +0000 (06:07 +0000)
open_active_file()/close_active_file() pairing.

src/ChangeLog
src/vfm.c

index 36aba0424bdde44c3ef197731bbd1ad42f70d53f..5514d1f59a945d852161001c7fb37f3760cc8e3a 100644 (file)
@@ -1,3 +1,15 @@
+Tue Mar 30 22:04:19 2004  Ben Pfaff  <blp@gnu.org>
+
+       * vfm.c: Had to get last call to multipass_split_output() inside
+       open_active_file()/close_active_file() pairing, so introduce new
+       function.
+       (internal_procedure) Move procedure() code here, except for calls
+       to open_active_file() and close_active_file().
+       (procedure) Wrap open_active_file() and close_active_file() around
+       internal_procedure().
+       (multipass_procedure_with_splits) Wrap open_active_file() and
+       close_active_file() around internal_procedure().
+
 Tue Mar 30 22:01:57 2004  Ben Pfaff  <blp@gnu.org>
 
        * descript.c: (cmd_descriptives) Free `vars' to avoid memory leak.
index bfd1ef017a2950ee85993d4930bc48942a9f4d61..09c132f7b2030cf12d60d1cdfea8c328352388ca 100644 (file)
--- a/src/vfm.c
+++ b/src/vfm.c
@@ -83,6 +83,8 @@ static int lag_count;         /* Number of cases in lag_queue so far. */
 static int lag_head;           /* Index where next case will be added. */
 static struct ccase **lag_queue; /* Array of n_lag ccase * elements. */
 
+static void internal_procedure (int (*proc_func) (struct ccase *, void *),
+                                void *aux);
 static struct ccase *create_trns_case (struct dictionary *);
 static void open_active_file (void);
 static int write_case (struct write_case_data *wc_data);
@@ -122,6 +124,17 @@ static void close_active_file (void);
    7. Pass case to PROC_FUNC, passing AUX as auxiliary data. */
 void
 procedure (int (*proc_func) (struct ccase *, void *), void *aux)
+{
+  open_active_file ();
+  internal_procedure (proc_func, aux);
+  close_active_file ();
+}
+
+/* Executes a procedure, as procedure(), except that the caller
+   is responsible for calling open_active_file() and
+   close_active_file(). */
+static void
+internal_procedure (int (*proc_func) (struct ccase *, void *), void *aux) 
 {
   static int recursive_call;
 
@@ -137,12 +150,10 @@ procedure (int (*proc_func) (struct ccase *, void *), void *aux)
 
   last_vfm_invocation = time (NULL);
 
-  open_active_file ();
   if (vfm_source != NULL) 
     vfm_source->class->read (vfm_source,
                              wc_data.trns_case,
                              write_case, &wc_data);
-  close_active_file ();
 
   free (wc_data.sink_case);
   free (wc_data.trns_case);
@@ -868,16 +879,19 @@ multipass_procedure_with_splits (void (*split_func) (const struct casefile *,
 
   assert (split_func != NULL);
 
+  open_active_file ();
+
   aux.prev_case = xmalloc (dict_get_case_size (default_dict));
   aux.casefile = NULL;
   aux.split_func = split_func;
   aux.func_aux = func_aux;
-  
-  procedure (multipass_split_callback, &aux);
 
+  internal_procedure (multipass_split_callback, &aux);
   if (aux.casefile != NULL)
     multipass_split_output (&aux);
   free (aux.prev_case);
+
+  close_active_file ();
 }
 
 /* procedure() callback used by multipass_procedure_with_splits(). */