treewide: Replace <name>_cnt by n_<name>s and <name>_cap by allocated_<name>.
[pspp] / src / data / sys-file-writer.c
index e0c6eade4b158d81e457bdb263b490828500d6a8..c94d13d85994037042ea236ac85c89600c50f339 100644 (file)
@@ -33,7 +33,6 @@
 #include "data/casewriter.h"
 #include "data/dictionary.h"
 #include "data/file-handle-def.h"
-#include "data/file-name.h"
 #include "data/format.h"
 #include "data/make-file.h"
 #include "data/missing-values.h"
@@ -74,7 +73,7 @@ struct sfm_writer
     struct replace_file *rf;    /* Ticket for replacing output file. */
 
     enum any_compression compression;
-    casenumber case_cnt;       /* Number of cases written so far. */
+    casenumber n_cases;         /* Number of cases written so far. */
     uint8_t space;              /* ' ' in the file's character encoding. */
 
     /* Simple compression buffering.
@@ -98,8 +97,8 @@ struct sfm_writer
 
     /* Variables. */
     struct sfm_var *sfm_vars;   /* Variables. */
-    size_t sfm_var_cnt;         /* Number of variables. */
-    size_t segment_cnt;         /* Number of variables including extra segments
+    size_t sfm_n_vars;          /* Number of variables. */
+    size_t n_segments;          /* Number of variables including extra segments
                                    for long string variables. */
   };
 
@@ -201,7 +200,6 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
                  struct sfm_write_options opts)
 {
   struct encoding_info encoding_info;
-  struct sfm_writer *w;
   mode_t mode;
   int i;
 
@@ -214,7 +212,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
     }
 
   /* Create and initialize writer. */
-  w = xzalloc (sizeof *w);
+  struct sfm_writer *w = XZALLOC (struct sfm_writer);
   w->fh = fh_ref (fh);
   w->lock = NULL;
   w->file = NULL;
@@ -228,7 +226,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
       && is_encoding_ebcdic_compatible (dict_get_encoding (d)))
     w->compression = ANY_COMP_SIMPLE;
 
-  w->case_cnt = 0;
+  w->n_cases = 0;
 
   w->n_opcodes = w->n_elements = 0;
   memset (w->cbuf[0], 0, 8);
@@ -237,8 +235,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
      data.  Also count the number of segments.  Very long strings
      occupy multiple segments, otherwise each variable only takes
      one segment. */
-  w->segment_cnt = sfm_dictionary_to_sfm_vars (d, &w->sfm_vars,
-                                               &w->sfm_var_cnt);
+  w->n_segments = sfm_dictionary_to_sfm_vars (d, &w->sfm_vars, &w->sfm_n_vars);
 
   /* Open file handle as an exclusive writer. */
   /* TRANSLATORS: this fragment will be interpolated into
@@ -251,8 +248,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
   mode = 0444;
   if (opts.create_writeable)
     mode |= 0222;
-  w->rf = replace_file_start (fh_get_file_name (fh), "wb", mode,
-                              &w->file, NULL);
+  w->rf = replace_file_start (fh, "wb", mode, &w->file);
   if (w->rf == NULL)
     {
       msg (ME, _("Error opening `%s' for writing as a system file: %s."),
@@ -268,12 +264,12 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
 
   /* Write basic variable info. */
   short_names_assign (d);
-  for (i = 0; i < dict_get_var_cnt (d); i++)
+  for (i = 0; i < dict_get_n_vars (d); i++)
     write_variable (w, dict_get_var (d, i));
 
   write_value_labels (w, d);
 
-  if (dict_get_document_line_cnt (d) > 0)
+  if (dict_get_document_n_lines (d) > 0)
     write_documents (w, d);
 
   write_integer_info_record (w, d);
@@ -351,7 +347,7 @@ calc_oct_idx (const struct dictionary *d, struct variable *target_var)
   int i;
 
   oct_idx = 0;
-  for (i = 0; i < dict_get_var_cnt (d); i++)
+  for (i = 0; i < dict_get_n_vars (d); i++)
     {
       struct variable *var = dict_get_var (d, i);
       if (var == target_var)
@@ -367,8 +363,6 @@ write_header (struct sfm_writer *w, const struct dictionary *d)
 {
   const char *dict_encoding = dict_get_encoding (d);
   char prod_name[61];
-  char creation_date[10];
-  char creation_time[9];
   const char *file_label;
   struct variable *weight;
 
@@ -411,10 +405,11 @@ write_header (struct sfm_writer *w, const struct dictionary *d)
   write_float (w, COMPRESSION_BIAS);
 
   /* Creation date and time. */
+  char *creation_date, *creation_time;
   if (time (&t) == (time_t) -1)
     {
-      strcpy (creation_date, "01 Jan 70");
-      strcpy (creation_time, "00:00:00");
+      creation_date = xstrdup ("01 Jan 70");
+      creation_time = xstrdup ("00:00:00");
     }
   else
     {
@@ -431,13 +426,14 @@ write_header (struct sfm_writer *w, const struct dictionary *d)
       int min = rerange (tmp->tm_min + 1);
       int sec = rerange (tmp->tm_sec + 1);
 
-      snprintf (creation_date, sizeof creation_date,
-                "%02d %s %02d", day, month_name[mon - 1], year);
-      snprintf (creation_time, sizeof creation_time,
-                "%02d:%02d:%02d", hour - 1, min - 1, sec - 1);
+      creation_date = xasprintf ("%02d %s %02d",
+                                 day, month_name[mon - 1], year);
+      creation_time = xasprintf ("%02d:%02d:%02d", hour - 1, min - 1, sec - 1);
     }
   write_utf8_string (w, dict_encoding, creation_date, 9);
   write_utf8_string (w, dict_encoding, creation_time, 8);
+  free (creation_time);
+  free (creation_date);
 
   /* File label. */
   file_label = dict_get_label (d);
@@ -489,7 +485,7 @@ static void
 write_variable (struct sfm_writer *w, const struct variable *v)
 {
   int width = var_get_width (v);
-  int segment_cnt = sfm_width_to_segments (width);
+  int n_segments = sfm_width_to_segments (width);
   int seg0_width = sfm_segment_alloc_width (width, 0);
   const char *encoding = var_get_encoding (v);
   int i;
@@ -509,6 +505,7 @@ write_variable (struct sfm_writer *w, const struct variable *v)
 
      Missing values for long string variables are written in a separate
      record. */
+  enum { MAX_SHORT_STRING = 8 };
   if (width <= MAX_SHORT_STRING)
     {
       const struct missing_values *mv = var_get_missing_values (v);
@@ -558,7 +555,7 @@ write_variable (struct sfm_writer *w, const struct variable *v)
   write_variable_continuation_records (w, seg0_width);
 
   /* Write additional segments for very long string variables. */
-  for (i = 1; i < segment_cnt; i++)
+  for (i = 1; i < n_segments; i++)
     {
       int seg_width = sfm_segment_alloc_width (width, i);
       struct fmt_spec fmt = fmt_for_output (FMT_A, MAX (seg_width, 1), 0);
@@ -601,7 +598,7 @@ write_value_labels (struct sfm_writer *w, const struct dictionary *d)
   hmap_init (&same_sets);
 
   idx = 0;
-  for (i = 0; i < dict_get_var_cnt (d); i++)
+  for (i = 0; i < dict_get_n_vars (d); i++)
     {
       struct variable *v = dict_get_var (d, i);
 
@@ -717,14 +714,14 @@ put_attrset (struct string *string, const struct attrset *attrs)
   struct attrset_iterator i;
 
   for (attr = attrset_first (attrs, &i); attr != NULL;
-       attr = attrset_next (attrs, &i)) 
+       attr = attrset_next (attrs, &i))
     {
       size_t n_values = attribute_get_n_values (attr);
       size_t j;
 
       ds_put_cstr (string, attribute_get_name (attr));
       ds_put_byte (string, '(');
-      for (j = 0; j < n_values; j++) 
+      for (j = 0; j < n_values; j++)
         ds_put_format (string, "'%s'\n", attribute_get_value (attr, j));
       ds_put_byte (string, ')');
     }
@@ -784,12 +781,12 @@ static void
 write_variable_attributes (struct sfm_writer *w, const struct dictionary *d)
 {
   struct string s = DS_EMPTY_INITIALIZER;
-  size_t n_vars = dict_get_var_cnt (d);
+  size_t n_vars = dict_get_n_vars (d);
   size_t n_attrsets = 0;
   size_t i;
 
   for (i = 0; i < n_vars; i++)
-    { 
+    {
       struct variable *v = dict_get_var (d, i);
       struct attrset attrs;
 
@@ -855,8 +852,7 @@ write_mrsets (struct sfm_writer *w, const struct dictionary *dict,
           if (mrset->width == 0)
             counted = xasprintf ("%.0f", mrset->counted.f);
           else
-            counted = xmemdup0 (value_str (&mrset->counted, mrset->width),
-                                mrset->width);
+            counted = xmemdup0 (mrset->counted.s, mrset->width);
           ds_put_format (&s, "%zu %s", strlen (counted), counted);
           free (counted);
         }
@@ -901,13 +897,13 @@ write_variable_display_parameters (struct sfm_writer *w,
   write_int (w, 7);             /* Record type. */
   write_int (w, 11);            /* Record subtype. */
   write_int (w, 4);             /* Data item (int32) size. */
-  write_int (w, w->segment_cnt * 3); /* Number of data items. */
+  write_int (w, w->n_segments * 3); /* Number of data items. */
 
-  for (i = 0; i < dict_get_var_cnt (dict); ++i)
+  for (i = 0; i < dict_get_n_vars (dict); ++i)
     {
       struct variable *v = dict_get_var (dict, i);
       int width = var_get_width (v);
-      int segment_cnt = sfm_width_to_segments (width);
+      int n_segments = sfm_width_to_segments (width);
       int measure = (var_get_measure (v) == MEASURE_NOMINAL ? 1
                      : var_get_measure (v) == MEASURE_ORDINAL ? 2
                      : 3);
@@ -916,7 +912,7 @@ write_variable_display_parameters (struct sfm_writer *w,
                        : 2);
       int i;
 
-      for (i = 0; i < segment_cnt; i++)
+      for (i = 0; i < n_segments; i++)
         {
           int width_left = width - sfm_segment_effective_offset (width, i);
           write_int (w, measure);
@@ -936,7 +932,7 @@ write_vls_length_table (struct sfm_writer *w,
   int i;
 
   ds_init_empty (&map);
-  for (i = 0; i < dict_get_var_cnt (dict); ++i)
+  for (i = 0; i < dict_get_n_vars (dict); ++i)
     {
       const struct variable *v = dict_get_var (dict, i);
       if (sfm_width_to_segments (var_get_width (v)) > 1)
@@ -953,9 +949,8 @@ write_long_string_value_labels (struct sfm_writer *w,
                                 const struct dictionary *dict)
 {
   const char *encoding = dict_get_encoding (dict);
-  size_t n_vars = dict_get_var_cnt (dict);
+  size_t n_vars = dict_get_n_vars (dict);
   size_t size, i;
-  off_t start UNUSED;
 
   /* Figure out the size in advance. */
   size = 0;
@@ -987,7 +982,6 @@ write_long_string_value_labels (struct sfm_writer *w,
   write_int (w, 1);             /* Data item (byte) size. */
   write_int (w, size);          /* Number of data items. */
 
-  start = ftello (w->file);
   for (i = 0; i < n_vars; i++)
     {
       struct variable *var = dict_get_var (dict, i);
@@ -1013,8 +1007,7 @@ write_long_string_value_labels (struct sfm_writer *w,
           size_t len;
 
           write_int (w, width);
-          write_bytes (w, value_str (val_lab_get_value (val_lab), width),
-                       width);
+          write_bytes (w, val_lab_get_value (val_lab)->s, width);
 
           label = recode_string (var_get_encoding (var), "UTF-8",
                                  val_lab_get_escaped_label (val_lab), -1);
@@ -1024,7 +1017,6 @@ write_long_string_value_labels (struct sfm_writer *w,
           free (label);
         }
     }
-  assert (ftello (w->file) == start + size);
 }
 
 static void
@@ -1032,9 +1024,8 @@ write_long_string_missing_values (struct sfm_writer *w,
                                   const struct dictionary *dict)
 {
   const char *encoding = dict_get_encoding (dict);
-  size_t n_vars = dict_get_var_cnt (dict);
+  size_t n_vars = dict_get_n_vars (dict);
   size_t size, i;
-  off_t start UNUSED;
 
   /* Figure out the size in advance. */
   size = 0;
@@ -1060,7 +1051,6 @@ write_long_string_missing_values (struct sfm_writer *w,
   write_int (w, 1);             /* Data item (byte) size. */
   write_int (w, size);          /* Number of data items. */
 
-  start = ftello (w->file);
   for (i = 0; i < n_vars; i++)
     {
       struct variable *var = dict_get_var (dict, i);
@@ -1086,10 +1076,9 @@ write_long_string_missing_values (struct sfm_writer *w,
           const union value *value = mv_get_value (mv, j);
 
           write_int (w, 8);
-          write_bytes (w, value_str (value, width), 8);
+          write_bytes (w, value->s, 8);
         }
     }
-  assert (ftello (w->file) == start + size);
 }
 
 static void
@@ -1116,7 +1105,7 @@ write_longvar_table (struct sfm_writer *w, const struct dictionary *dict)
   size_t i;
 
   ds_init_empty (&map);
-  for (i = 0; i < dict_get_var_cnt (dict); i++)
+  for (i = 0; i < dict_get_n_vars (dict); i++)
     {
       struct variable *v = dict_get_var (dict, i);
       if (i)
@@ -1214,7 +1203,7 @@ sys_file_casewriter_write (struct casewriter *writer, void *w_,
       return;
     }
 
-  w->case_cnt++;
+  w->n_cases++;
 
   if (w->compression == ANY_COMP_NONE)
     write_case_uncompressed (w, c);
@@ -1267,9 +1256,9 @@ close_writer (struct sfm_writer *w)
       /* Seek back to the beginning and update the number of cases.
          This is just a courtesy to later readers, so there's no need
          to check return values or report errors. */
-      if (ok && w->case_cnt <= INT32_MAX && !fseeko (w->file, 80, SEEK_SET))
+      if (ok && w->n_cases <= INT32_MAX && !fseeko (w->file, 80, SEEK_SET))
         {
-          write_int (w, w->case_cnt);
+          write_int (w, w->n_cases);
           clearerr (w->file);
         }
 
@@ -1309,7 +1298,7 @@ write_case_uncompressed (struct sfm_writer *w, const struct ccase *c)
 {
   size_t i;
 
-  for (i = 0; i < w->sfm_var_cnt; i++)
+  for (i = 0; i < w->sfm_n_vars; i++)
     {
       struct sfm_var *v = &w->sfm_vars[i];
 
@@ -1330,7 +1319,7 @@ write_case_compressed (struct sfm_writer *w, const struct ccase *c)
 {
   size_t i;
 
-  for (i = 0; i < w->sfm_var_cnt; i++)
+  for (i = 0; i < w->sfm_n_vars; i++)
     {
       struct sfm_var *v = &w->sfm_vars[i];
 
@@ -1422,6 +1411,7 @@ finish_zstream (struct sfm_writer *w)
   block = &w->blocks[w->n_blocks++];
   block->uncompressed_size = w->zstream.total_in;
   block->compressed_size = w->zstream.total_out;
+  deflateEnd (&w->zstream);
 }
 
 static void
@@ -1599,7 +1589,7 @@ write_value (struct sfm_writer *w, const union value *value, int width)
     write_float (w, value->f);
   else
     {
-      write_bytes (w, value_str (value, width), width);
+      write_bytes (w, value->s, width);
       write_zeros (w, 8 - width);
     }
 }