some more mconvert
[pspp] / src / language / data-io / mconvert.c
index 78a0d212d9d9a253f1e0550b3f107d68270bcace..1e24464709e09195b88b8dcb15f7445b471df60b 100644 (file)
@@ -35,7 +35,7 @@
 int
 cmd_mconvert (struct lexer *lexer, struct dataset *ds)
 {
-  bool append UNUSED = false;
+  bool append = false;
   struct file_handle *in = NULL;
   struct file_handle *out = NULL;
   while (lex_token (lexer) != T_ENDCMD)
@@ -116,28 +116,31 @@ cmd_mconvert (struct lexer *lexer, struct dataset *ds)
       if (!matrix_reader_next (&mm, mr, &group))
         break;
 
-      struct ccase *model = NULL;
+      bool add_corr = mm.cov && !mm.corr;
+      bool add_cov = mm.corr && !mm.cov;
+      bool remove_corr = add_cov && !append;
+      bool remove_cov = add_corr && !append;
+
+      struct ccase *model = casereader_peek (group, 0);
+      for (size_t i = 0; i < mr->n_fvars; i++)
+        *case_num_rw (model, mr->fvars[i]) = SYSMIS;
+
       for (;;)
         {
           struct ccase *c = casereader_read (group);
           if (!c)
             break;
 
-          if (!model)
-            {
-              struct substring rowtype
-                = matrix_reader_get_string (c, mr->rowtype);
-              if (ss_equals_case (rowtype, ss_cstr ("COV"))
-                  || ss_equals_case (rowtype, ss_cstr ("CORR")))
-                model = case_ref (c);
-            }
-          casewriter_write (cw, c);
+          struct substring rowtype = matrix_reader_get_string (c, mr->rowtype);
+          if ((remove_cov && ss_equals_case (rowtype, ss_cstr ("COV")))
+              || (remove_corr && ss_equals_case (rowtype, ss_cstr ("CORR"))))
+            case_unref (c);
+          else
+            casewriter_write (cw, c);
         }
+      casereader_destroy (group);
 
-      if (!model)
-        continue;
-
-      if (mm.cov && !mm.corr)
+      if (add_corr)
         {
           assert (mm.cov->size1 == mr->n_cvars);
           assert (mm.cov->size2 == mr->n_cvars);
@@ -169,7 +172,7 @@ cmd_mconvert (struct lexer *lexer, struct dataset *ds)
           casewriter_write (cw, c);
         }
 
-      if (mm.corr && !mm.cov)
+      if (add_cov)
         {
           assert (mm.corr->size1 == mr->n_cvars);
           assert (mm.corr->size2 == mr->n_cvars);
@@ -184,6 +187,9 @@ cmd_mconvert (struct lexer *lexer, struct dataset *ds)
                   double corr = gsl_matrix_get (mm.corr, y, x);
                   *case_num_rw (c, mr->cvars[x]) = corr * sqrt (d1 * d2);
                 }
+              matrix_reader_set_string (c, mr->rowtype, ss_cstr ("COV"));
+              matrix_reader_set_string (c, mr->varname,
+                                        ss_cstr (var_get_name (mr->cvars[y])));
               casewriter_write (cw, c);
             }
         }