/* Parses and executes APPLY DICTIONARY. */
int
-cmd_apply_dictionary (void)
+cmd_apply_dictionary (struct lexer *lexer, struct dataset *ds)
{
struct file_handle *handle;
struct any_reader *reader;
int i;
- lex_match_id ("FROM");
- lex_match ('=');
- handle = fh_parse (FH_REF_FILE | FH_REF_SCRATCH);
+ lex_match_id (lexer, "FROM");
+ lex_match (lexer, '=');
+ handle = fh_parse (lexer, FH_REF_FILE | FH_REF_SCRATCH);
if (!handle)
return CMD_FAILURE;
for (i = 0; i < dict_get_var_cnt (dict); i++)
{
struct variable *s = dict_get_var (dict, i);
- struct variable *t = dict_lookup_var (default_dict, s->name);
+ struct variable *t = dict_lookup_var (dataset_dict (ds), s->name);
if (t == NULL)
continue;
s->name);
else if (val_labs_count (s->val_labs))
{
- /* Whether to apply the value labels. */
- int apply = 1;
-
- if (t->width < s->width)
- {
- struct val_labs_iterator *i;
- struct val_lab *lab;
-
- for (lab = val_labs_first (s->val_labs, &i); lab != NULL;
- lab = val_labs_next (s->val_labs, &i))
- {
- int j;
-
- /* We will apply the value labels only if all
- the truncated characters are blanks. */
- for (j = t->width; j < s->width; j++)
- if (lab->value.s[j] != ' ')
- {
- val_labs_done (&i);
- apply = 0;
- break;
- }
- }
- }
- else
- {
- /* Fortunately, we follow the convention that all value
- label values are right-padded with spaces, so it is
- unnecessary to bother padding values here. */
- }
-
- if (apply)
+ if (val_labs_can_set_width (s->val_labs, t->width))
{
val_labs_destroy (t->val_labs);
t->val_labs = s->val_labs;
if (dict_get_weight (dict) != NULL)
{
struct variable *new_weight
- = dict_lookup_var (default_dict, dict_get_weight (dict)->name);
+ = dict_lookup_var (dataset_dict (ds), dict_get_weight (dict)->name);
if (new_weight != NULL)
- dict_set_weight (default_dict, new_weight);
+ dict_set_weight (dataset_dict (ds), new_weight);
}
any_reader_close (reader);
- return lex_end_of_command ();
+ return lex_end_of_command (lexer);
}