Automatically infer variables' measurement level from format and data.
[pspp] / src / language / data-io / matrix-data.c
index bffdd92cb7f463d0183181196b9e920f7e1a2fe9..f741b4d54cc2808b59488d5caec39865c82aa813 100644 (file)
@@ -39,6 +39,7 @@
 #include "language/lexer/variable-parser.h"
 #include "libpspp/assertion.h"
 #include "libpspp/i18n.h"
+#include "libpspp/intern.h"
 #include "libpspp/message.h"
 #include "libpspp/str.h"
 
@@ -252,12 +253,13 @@ parse_msg (struct dfm_reader *reader, const struct substring *token,
 
   int line_number = dfm_get_line_number (reader);
   struct msg_location *location = xmalloc (sizeof *location);
+  int last_column = (first_column && token->length
+                     ? first_column + token->length - 1
+                     : 0);
   *location = (struct msg_location) {
-    .file_name = xstrdup (dfm_get_file_name (reader)),
-    .first_line = line_number,
-    .last_line = line_number + 1,
-    .first_column = first_column,
-    .last_column = first_column ? first_column + token->length : 0,
+    .file_name = intern_new (dfm_get_file_name (reader)),
+    .start = { .line = line_number, .column = first_column },
+    .end = { .line = line_number, .column = last_column },
   };
   struct msg *m = xmalloc (sizeof *m);
   *m = (struct msg) {
@@ -845,7 +847,10 @@ parse_matrix_data_variables (struct lexer *lexer)
     if (!strcasecmp (names[i], "ROWTYPE_"))
       dict_create_var_assert (dict, "ROWTYPE_", 8);
     else
-      dict_create_var_assert (dict, names[i], 0);
+      {
+        struct variable *var = dict_create_var_assert (dict, names[i], 0);
+        var_set_measure (var, MEASURE_SCALE);
+      }
 
   for (size_t i = 0; i < n_names; ++i)
     free (names[i]);
@@ -889,6 +894,7 @@ parse_matrix_data_subvars (struct lexer *lexer, struct dictionary *dict,
         }
       *tv = true;
 
+      var_set_measure (v, MEASURE_NOMINAL);
       var_set_both_formats (v, &(struct fmt_spec) { .type = FMT_F, .w = 4 });
     }
   return true;
@@ -909,7 +915,7 @@ cmd_matrix_data (struct lexer *lexer, struct dataset *ds)
   if (!dict)
     return CMD_FAILURE;
 
-  size_t n_input_vars = dict_get_var_cnt (dict);
+  size_t n_input_vars = dict_get_n_vars (dict);
   struct variable **input_vars = xnmalloc (n_input_vars, sizeof *input_vars);
   for (size_t i = 0; i < n_input_vars; i++)
     input_vars[i] = dict_get_var (dict, i);
@@ -1005,6 +1011,7 @@ cmd_matrix_data (struct lexer *lexer, struct dataset *ds)
               mf.svars = xmalloc (sizeof *mf.svars);
               mf.svars[0] = dict_create_var_assert (dict, lex_tokcstr (lexer),
                                                     0);
+              var_set_measure (mf.svars[0], MEASURE_NOMINAL);
               var_set_both_formats (
                 mf.svars[0], &(struct fmt_spec) { .type = FMT_F, .w = 4 });
               mf.n_svars = 1;
@@ -1142,7 +1149,7 @@ cmd_matrix_data (struct lexer *lexer, struct dataset *ds)
       goto error;
     }
 
-  struct variable **order = xnmalloc (dict_get_var_cnt (dict), sizeof *order);
+  struct variable **order = xnmalloc (dict_get_n_vars (dict), sizeof *order);
   size_t n_order = 0;
   for (size_t i = 0; i < mf.n_svars; i++)
     order[n_order++] = mf.svars[i];
@@ -1152,11 +1159,11 @@ cmd_matrix_data (struct lexer *lexer, struct dataset *ds)
   order[n_order++] = mf.varname;
   for (size_t i = 0; i < mf.n_cvars; i++)
     order[n_order++] = mf.cvars[i];
-  assert (n_order == dict_get_var_cnt (dict));
+  assert (n_order == dict_get_n_vars (dict));
   dict_reorder_vars (dict, order, n_order);
   free (order);
 
-  dict_set_split_vars (dict, mf.svars, mf.n_svars);
+  dict_set_split_vars (dict, mf.svars, mf.n_svars, SPLIT_LAYERED);
 
   schedule_matrices (&mf);