Rewrite expression code.
[pspp-builds.git] / src / casefile.c
index 76de45dc7a6b392dd8581f6334fdaa0ee5cd2026..97929c570eaaa81b655cba62f6a2c32dacdfacd7 100644 (file)
@@ -30,6 +30,7 @@
 #include "case.h"
 #include "error.h"
 #include "misc.h"
+#include "mkfile.h"
 #include "settings.h"
 #include "var.h"
 
@@ -224,6 +225,7 @@ casefile_sleep (const struct casefile *cf_)
 
   casefile_mode_reader (cf);
   casefile_to_disk (cf);
+  flush_buffer (cf);
 
   if (cf->fd != -1) 
     {
@@ -338,35 +340,6 @@ flush_buffer (struct casefile *cf)
     } 
 }
 
-/* Creates a temporary file and stores its name in *FILENAME and
-   a file descriptor for it in *FD.  Returns success.  Caller is
-   responsible for freeing *FILENAME. */
-static int
-make_temp_file (int *fd, char **filename)
-{
-  const char *parent_dir;
-
-  assert (filename != NULL);
-  assert (fd != NULL);
-
-  if (getenv ("TMPDIR") != NULL)
-    parent_dir = getenv ("TMPDIR");
-  else
-    parent_dir = P_tmpdir;
-
-  *filename = xmalloc (strlen (parent_dir) + 32);
-  sprintf (*filename, "%s%cpsppXXXXXX", parent_dir, DIR_SEPARATOR);
-  *fd = mkstemp (*filename);
-  if (*fd < 0)
-    {
-      msg (FE, _("%s: Creating temporary file: %s."),
-           *filename, strerror (errno));
-      free (*filename);
-      *filename = NULL;
-      return 0;
-    }
-  return 1;
-}
 
 /* If CF is currently stored in memory, writes it to disk.  Readers, if any,
    retain their current positions. */
@@ -444,13 +417,14 @@ casefile_get_reader (const struct casefile *cf_)
   cf->mode = READ;
 
   reader = xmalloc (sizeof *reader);
-  reader->cf = cf;
   reader->next = cf->readers;
   if (cf->readers != NULL)
     reader->next->prev = reader;
-  reader->prev = NULL;
   cf->readers = reader;
+  reader->prev = NULL;
+  reader->cf = cf;
   reader->case_idx = 0;
+  reader->destructive = 0;
   reader->fd = -1;
   reader->buffer = NULL;
   reader->buffer_pos = 0;
@@ -724,6 +698,7 @@ full_write (int fd, const void *buffer_, size_t size)
   return bytes_written;
 }
 
+
 /* Registers our exit handler with atexit() if it has not already
    been registered. */
 static void
@@ -737,6 +712,8 @@ register_atexit (void)
     }
 }
 
+
+
 /* atexit() handler that closes and deletes our temporary
    files. */
 static void
@@ -783,7 +760,7 @@ cmd_debug_casefile (void)
   if (token != '.')
     return lex_end_of_command ();
     
-  for (pattern = 0; pattern < 5; pattern++) 
+  for (pattern = 0; pattern < 6; pattern++) 
     {
       const size_t *size;
 
@@ -811,13 +788,18 @@ test_casefile (int pattern, size_t value_cnt, size_t case_cnt)
 
   rng = gsl_rng_alloc (gsl_rng_mt19937);
   cf = casefile_create (value_cnt);
+  if (pattern == 5)
+    casefile_to_disk (cf);
   for (i = 0; i < case_cnt; i++)
     write_random_case (cf, i);
+  if (pattern == 5)
+    casefile_sleep (cf);
   r1 = casefile_get_reader (cf);
   r2 = casefile_get_reader (cf);
   switch (pattern) 
     {
     case 0:
+    case 5:
       for (i = 0; i < case_cnt; i++) 
         {
           read_and_verify_random_case (cf, r1, i);