+
+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;
+}