X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcase-map.c;h=b47d38e1dd1346df17454ed4c20f4dff432da806;hb=df1d194af32e35739355981252785e768f21ebb0;hp=131e4078796eb8c8c7d4f812499857b03e6ba031;hpb=6e097c89af440da90b43ce90864394c4d0c843d5;p=pspp diff --git a/src/data/case-map.c b/src/data/case-map.c index 131e407879..b47d38e1dd 100644 --- a/src/data/case-map.c +++ b/src/data/case-map.c @@ -72,6 +72,22 @@ insert_mapping (struct case_map *map, size_t from, size_t to) map->map[to] = from; } +/* Returns a copy of OLD, if OLD is nonnull, and otherwise returns NULL. */ +struct case_map * +case_map_clone (const struct case_map *old) +{ + if (!old) + return NULL; + + size_t n_values = caseproto_get_n_widths (old->proto); + struct case_map *new = xmalloc (sizeof *new); + *new = (struct case_map) { + .proto = caseproto_ref (old->proto), + .map = xmemdup (old->proto, n_values * sizeof *new->map), + }; + return new; +} + /* Destroys case map MAP. */ void case_map_destroy (struct case_map *map) @@ -131,11 +147,12 @@ struct casereader * case_map_create_input_translator (struct case_map *map, struct casereader *subreader) { - return casereader_create_translator (subreader, + static const struct casereader_translator_class class = { + translate_case, destroy_case_map, + }; + return casereader_translate_stateless (subreader, case_map_get_proto (map), - translate_case, - destroy_case_map, - map); + &class, map); } /* Creates and returns a new casewriter. Cases written to the @@ -182,14 +199,14 @@ destroy_case_map (void *map_) the last value. (Holes are created by deleting variables.) All variables are compacted if EXCLUDE_CLASSES is 0, or it may - contain one or more of (1u << DC_ORDINARY), (1u << DC_SYSTEM), - or (1u << DC_SCRATCH) to cause the corresponding type of - variable to be deleted during compaction. */ + contain one or more of DC_ORDINARY, DC_SYSTEM, or DC_SCRATCH + to cause the corresponding type of variable to be deleted + during compaction. */ struct case_map * case_map_to_compact_dict (const struct dictionary *d, unsigned int exclude_classes) { - size_t n_vars = dict_get_var_cnt (d); + size_t n_vars = dict_get_n_vars (d); struct caseproto *proto; struct case_map *map; size_t n_values; @@ -205,7 +222,7 @@ case_map_to_compact_dict (const struct dictionary *d, for (i = 0; i < n_vars; i++) { struct variable *v = dict_get_var (d, i); - if (!(exclude_classes & (1u << var_get_dict_class (v)))) + if (!(exclude_classes & var_get_dict_class (v))) insert_mapping (map, var_get_case_index (v), n_values++); } @@ -234,7 +251,7 @@ struct case_map_stage struct case_map_stage * case_map_stage_create (const struct dictionary *dict) { - size_t n_vars = dict_get_var_cnt (dict); + size_t n_vars = dict_get_n_vars (dict); struct case_map_stage *stage; size_t i; @@ -305,7 +322,7 @@ struct case_map * case_map_stage_get_case_map (const struct case_map_stage *stage) { struct case_map *map; - size_t n_vars = dict_get_var_cnt (stage->dict); + size_t n_vars = dict_get_n_vars (stage->dict); size_t n_values; size_t i; bool identity_map = true; @@ -343,12 +360,9 @@ struct case_map * case_map_by_name (const struct dictionary *old, const struct dictionary *new) { - struct case_map *map; - size_t var_cnt = dict_get_var_cnt (new); - size_t i; - - map = create_case_map (dict_get_proto (new)); - for (i = 0; i < var_cnt; i++) + size_t n_vars = dict_get_n_vars (new); + struct case_map *map = create_case_map (dict_get_proto (new)); + for (size_t i = 0; i < n_vars; i++) { struct variable *nv = dict_get_var (new, i); struct variable *ov = dict_lookup_var_assert (old, var_get_name (nv)); @@ -364,6 +378,6 @@ void case_map_dump (const struct case_map *cm) { int i; - for (i = 0 ; i < caseproto_get_n_widths (cm->proto); ++i ) + for (i = 0 ; i < caseproto_get_n_widths (cm->proto); ++i) printf ("%d -> %d\n", i, cm->map[i]); }