dict_set_case_limit (mtf.dict, dict_get_case_limit (default_dict));
lex_match ('/');
- while (lex_id_match ("FILE", tokid) || lex_id_match ("TABLE", tokid))
+ while (token == T_ID
+ && (lex_id_match ("FILE", tokid) || lex_id_match ("TABLE", tokid)))
{
struct mtf_file *file = xmalloc (sizeof *file);
}
else
assert (0);
+ lex_match ('=');
file->by = NULL;
file->handle = NULL;
mtf.head = file;
first_table->prev = file;
}
-
- lex_match ('=');
-
+
if (lex_match ('*'))
{
file->handle = NULL;
}
}
+ /* Set up mapping from each file's variables to master
+ variables. */
for (iter = mtf.head; iter != NULL; iter = iter->next)
{
struct dictionary *d = iter->dict;
}
}
+ /* Add IN variables to master dictionary. */
for (iter = mtf.head; iter != NULL; iter = iter->next)
if (iter->in_name != NULL)
{
- static const struct fmt_spec f1_0 = {FMT_F, 1, 0};
-
iter->in_var = dict_create_var (mtf.dict, iter->in_name, 0);
if (iter->in_var == NULL)
{
iter->in_var);
goto error;
}
- iter->in_var->print = iter->in_var->write = f1_0;
+ iter->in_var->print = iter->in_var->write
+ = make_output_format (FMT_F, 1, 0);
}
/* MATCH FILES performs an n-way merge on all its input files.
if (mtf.sink->class->open != NULL)
mtf.sink->class->open (mtf.sink);
- mtf.seq_nums = xcalloc (dict_get_var_cnt (mtf.dict) * sizeof *mtf.seq_nums);
+ mtf.seq_nums = xcalloc (dict_get_var_cnt (mtf.dict), sizeof *mtf.seq_nums);
case_create (&mtf.mtf_case, dict_get_next_value_idx (mtf.dict));
mtf_read_nonactive_records (&mtf);
bool read_active_file;
assert (mtf->head != NULL);
- assert (mtf->head->type == MTF_FILE);
+ if (mtf->head->type == MTF_TABLE)
+ return 1;
+
do
{
struct mtf_file *min_head, *min_tail; /* Files with minimum BY values. */
}
}
- dict_compact_values (d);
-
for (i = 0; i < dict_get_var_cnt (d); i++)
{
struct variable *dv = dict_get_var (d, i);
struct variable *mv = dict_lookup_var (m, dv->name);
+ if (dict_class_from_id (dv->name) == DC_SCRATCH)
+ continue;
+
if (mv != NULL)
{
if (mv->width != dv->width)