pxd: initial work
[pspp] / src / data / vector.c
index 7c8ec4178dc9200473f308b385d35367441adac0..af56427899151f7b4ec55e4cd0225340df5365b5 100644 (file)
 
 #include "data/dictionary.h"
 #include "data/identifier.h"
+#include "data/variable.h"
 #include "libpspp/assertion.h"
 #include "libpspp/i18n.h"
+#include "libpspp/pxd.h"
 #include "libpspp/str.h"
 
 #include "gl/xalloc.h"
@@ -58,6 +60,7 @@ vector_create (const char *name, struct variable **vars, size_t var_cnt)
 
   assert (var_cnt > 0);
   assert (id_is_plausible (name, false));
+  vector->name = xstrdup (name);
 
   vector->name = xstrdup (name);
   vector->vars = xmemdup (vars, var_cnt * sizeof *vector->vars);
@@ -144,3 +147,41 @@ compare_vector_ptrs_by_name (const void *a_, const void *b_)
   return utf8_strcasecmp (a->name, b->name);
 }
 
+struct pxd_object *
+vector_save (const struct vector *vector, struct pxd *pxd)
+{
+  struct pxd_builder b;
+  size_t i;
+
+  pxd_builder_init (&b, pxd);
+
+  pxd_builder_put_string (&b, vector->name);
+
+  pxd_builder_put_size_t (&b, vector->var_cnt);
+  for (i = 0; i < vector->var_cnt; i++)
+    pxd_builder_put_size_t (&b, var_get_dict_index (vector->vars[i]));
+
+  return pxd_builder_commit (&b);
+}
+
+struct vector *
+vector_load (struct pxd_object *object, const struct pxd *pxd,
+             const struct dictionary *dict)
+{
+  struct pxd_parser p;
+  struct vector *vector;
+  size_t i;
+
+  vector = xzalloc (sizeof *vector);
+
+  pxd_parser_init (&p, object, pxd);
+
+  vector->name = pxd_parser_get_string (&p);
+
+  vector->var_cnt = pxd_parser_get_size_t (&p);
+  vector->vars = xmalloc (vector->var_cnt * sizeof *vector->vars);
+  for (i = 0; i < vector->var_cnt; i++)
+    vector->vars[i] = dict_get_var (dict, pxd_parser_get_size_t (&p));
+
+  return vector;
+}