X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvector.c;h=af56427899151f7b4ec55e4cd0225340df5365b5;hb=52c54183e360053b1845e46cb96cd44a0cf96040;hp=7c8ec4178dc9200473f308b385d35367441adac0;hpb=2ca3267c1110bbff675c560b19d02defb96ee2f9;p=pspp diff --git a/src/data/vector.c b/src/data/vector.c index 7c8ec4178d..af56427899 100644 --- a/src/data/vector.c +++ b/src/data/vector.c @@ -22,8 +22,10 @@ #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; +}