+ /* Execute procedure. */
+ struct casereader *input = proc_open (ds);
+ struct ccase *c;
+ for (; (c = casereader_read (input)) != NULL; case_unref (c))
+ for (size_t i = 0; i < arc->n_specs; i++)
+ {
+ struct arc_spec *spec = &arc->specs[i];
+ const union value *value = case_data_idx (c, spec->src_idx);
+ if (spec->width == 0 && value->f == SYSMIS)
+ {
+ /* AUTORECODE never changes the system-missing value.
+ (Leaving it out of the translation table has this
+ effect automatically because values not found in the
+ translation table get translated to system-missing.) */
+ continue;
+ }
+
+ int width = value_trim_spaces (value, spec->width);
+ if (width == 1 && value->s[0] == ' ' && !arc->blank_valid)
+ continue;
+
+ size_t hash = value_hash (value, width, 0);
+ if (find_arc_item (spec->items, value, width, hash))
+ continue;
+
+ struct string value_label = DS_EMPTY_INITIALIZER;
+ var_append_value_name__ (src_vars[i], value,
+ SETTINGS_VALUE_SHOW_LABEL, &value_label);
+
+ struct arc_item *item = xmalloc (sizeof *item);
+ item->width = width;
+ value_clone (&item->from, value, width);
+ item->missing = mv_is_value_missing_varwidth (&spec->mv, value, spec->width,
+ MV_ANY);
+ item->value_label = ds_steal_cstr (&value_label);
+ hmap_insert (&spec->items->ht, &item->hmap_node, hash);
+
+ ds_destroy (&value_label);
+ }
+ bool ok = casereader_destroy (input);
+ ok = proc_commit (ds) && ok;
+
+ /* Re-fetch dictionary because it might have changed (if TEMPORARY was in
+ use). */
+ dict = dataset_dict (ds);
+
+ /* Create transformation. */
+ for (size_t i = 0; i < arc->n_specs; i++)
+ {
+ struct arc_spec *spec = &arc->specs[i];