work on lexer
[pspp] / src / data / sys-file-writer.c
index 2a6f5680eceab961284b047054510a071f84fefc..34f420e4a46e69c4a54a68cb64d3752952f4b9b9 100644 (file)
@@ -41,6 +41,7 @@
 #include "data/short-names.h"
 #include "data/value-labels.h"
 #include "data/variable.h"
+#include "data/varset.h"
 #include "libpspp/float-format.h"
 #include "libpspp/i18n.h"
 #include "libpspp/integer-format.h"
@@ -132,6 +133,7 @@ static void write_long_string_value_labels (struct sfm_writer *,
 static void write_long_string_missing_values (struct sfm_writer *,
                                               const struct dictionary *);
 
+static void write_varsets (struct sfm_writer *, const struct dictionary *);
 static void write_mrsets (struct sfm_writer *, const struct dictionary *,
                           bool pre_v14);
 
@@ -275,6 +277,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
   write_integer_info_record (w, d);
   write_float_info_record (w);
 
+  write_varsets (w, d);
   write_mrsets (w, d, true);
 
   write_variable_display_parameters (w, d);
@@ -450,7 +453,7 @@ write_header (struct sfm_writer *w, const struct dictionary *d)
 static void
 write_format (struct sfm_writer *w, struct fmt_spec fmt, int width)
 {
-  assert (fmt_check_output (&fmt));
+  assert (fmt_check_output (fmt));
   assert (sfm_width_to_segments (width) == 1);
 
   if (width > 0)
@@ -518,8 +521,8 @@ write_variable (struct sfm_writer *w, const struct variable *v)
     write_int (w, 0);
 
   /* Print and write formats. */
-  write_format (w, *var_get_print_format (v), seg0_width);
-  write_format (w, *var_get_write_format (v), seg0_width);
+  write_format (w, var_get_print_format (v), seg0_width);
+  write_format (w, var_get_write_format (v), seg0_width);
 
   /* Short name.
      The full name is in a translation table written
@@ -804,6 +807,49 @@ write_variable_attributes (struct sfm_writer *w, const struct dictionary *d)
   ds_destroy (&s);
 }
 
+/* Write variable sets. */
+static void
+write_varsets (struct sfm_writer *w, const struct dictionary *dict)
+{
+  const char *encoding = dict_get_encoding (dict);
+
+  if (is_encoding_ebcdic_compatible (encoding))
+    {
+      /* FIXME. */
+      return;
+    }
+
+  size_t n_varsets = dict_get_n_varsets (dict);
+  if (n_varsets == 0)
+    return;
+
+  struct string s = DS_EMPTY_INITIALIZER;
+  for (size_t i = 0; i < n_varsets; i++)
+    {
+      const struct varset *varset = dict_get_varset (dict, i);
+
+      char *name = recode_string (encoding, "UTF-8", varset->name, -1);
+      ds_put_format (&s, "%s= ", name);
+      free (name);
+
+      for (size_t j = 0; j < varset->n_vars; j++)
+        {
+          if (j)
+            ds_put_byte (&s, ' ');
+
+          const char *name_utf8 = var_get_name (varset->vars[j]);
+          char *name = recode_string (encoding, "UTF-8", name_utf8, -1);
+          ds_put_cstr (&s, name);
+          free (name);
+        }
+      ds_put_byte (&s, '\n');
+    }
+
+  if (!ds_is_empty (&s))
+    write_string_record (w, ds_ss (&s), 5);
+  ds_destroy (&s);
+}
+
 /* Write multiple response sets.  If PRE_V14 is true, writes sets supported by
    SPSS before release 14, otherwise writes sets supported only by later
    versions. */