pxd: initial work
[pspp] / src / data / mrset.c
index 38b0ab2d5266e88192342166df828cd7a98e2bd9..ce1a35851e1860b8e7f8894d65b23c113f87bd19 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@
 #include "data/val-type.h"
 #include "data/variable.h"
 #include "libpspp/message.h"
+#include "libpspp/pxd.h"
 
 #include "gl/xalloc.h"
 
@@ -130,3 +131,75 @@ mrset_ok (const struct mrset *mrset, const struct dictionary *dict)
 
   return true;
 }
+
+struct pxd_object *
+mrset_save (const struct mrset *mrset, struct pxd *pxd)
+{
+  struct pxd_builder b;
+  size_t i;
+
+  pxd_builder_init (&b, pxd);
+
+  pxd_builder_put_string (&b, mrset->name);
+  pxd_builder_put_string (&b, mrset->label != NULL ? mrset->label : "");
+  pxd_builder_put_u8 (&b, mrset->type);
+
+  pxd_builder_put_size_t (&b, mrset->n_vars);
+  for (i = 0; i < mrset->n_vars; i++)
+    pxd_builder_put_string (&b, var_get_name (mrset->vars[i]));
+
+  if (mrset->type == MRSET_MD)
+    {
+      pxd_builder_put_u8 (&b, mrset->cat_source);
+      pxd_builder_put_bool (&b, mrset->label_from_var_label);
+      pxd_builder_put_u16 (&b, mrset->width);
+      pxd_builder_put_value (&b, &mrset->counted, mrset->width);
+    }
+
+  return pxd_builder_commit (&b);
+}
+
+struct mrset *
+mrset_load (struct pxd_object *object, const struct pxd *pxd,
+            const struct dictionary *dict)
+{
+  struct pxd_parser p;
+  struct mrset *mrset;
+  size_t i;
+
+  mrset = xzalloc (sizeof *mrset);
+
+  pxd_parser_init (&p, object, pxd);
+
+  mrset->name = pxd_parser_get_string (&p);
+
+  mrset->label = pxd_parser_get_string (&p);
+  if (mrset->label[0] == '\0')
+    {
+      free (mrset->label);
+      mrset->label = NULL;
+    }
+
+  mrset->type = pxd_parser_get_u8 (&p);
+
+  mrset->n_vars = pxd_parser_get_size_t (&p);
+  mrset->vars = xmalloc (mrset->n_vars * sizeof *mrset->vars);
+  for (i = 0; i < mrset->n_vars; i++)
+    {
+      char *name = pxd_parser_get_string (&p);
+      mrset->vars[i] = dict_lookup_var_assert (dict, name);
+      free (name);
+    }
+
+  if (mrset->type == MRSET_MD)
+    {
+      mrset->cat_source = pxd_parser_get_u8 (&p);
+      mrset->label_from_var_label = pxd_parser_get_bool (&p);
+      mrset->width = pxd_parser_get_u16 (&p);
+      pxd_parser_get_value (&p, &mrset->counted, mrset->width);
+    }
+  else
+    value_init (&mrset->counted, 0);
+
+  return mrset;
+}