X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fmrset.c;h=ce1a35851e1860b8e7f8894d65b23c113f87bd19;hb=52c54183e360053b1845e46cb96cd44a0cf96040;hp=38b0ab2d5266e88192342166df828cd7a98e2bd9;hpb=2ca3267c1110bbff675c560b19d02defb96ee2f9;p=pspp diff --git a/src/data/mrset.c b/src/data/mrset.c index 38b0ab2d52..ce1a35851e 100644 --- a/src/data/mrset.c +++ b/src/data/mrset.c @@ -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; +}