X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fget.c;h=bda892a503c6c0ef95e4f0ba63f2cf6d2c7aaf11;hb=19f4600e289108cd04b042ffff3769a6db2da070;hp=fd9492210ab782544186749f1d26ddce7420df37;hpb=79e615c130eb0eaa23c7c220a51c3cf00e17b3a6;p=pspp diff --git a/src/get.c b/src/get.c index fd9492210a..bda892a503 100644 --- a/src/get.c +++ b/src/get.c @@ -887,6 +887,7 @@ cmd_match_files (void) } } } + free (by); } else if (lex_match_id ("FIRST")) { @@ -982,7 +983,7 @@ cmd_match_files (void) { msg (SE, _("IN variable name %s duplicates an " "existing variable name."), - iter->in_var); + iter->in_var->name); goto error; } iter->in_var->print = iter->in_var->write @@ -1038,6 +1039,9 @@ cmd_match_files (void) procedure (mtf_processing, &mtf); mtf_processing_finish (&mtf); + free_case_source (vfm_source); + vfm_source = NULL; + dict_destroy (default_dict); default_dict = mtf.dict; mtf.dict = NULL; @@ -1218,38 +1222,34 @@ mtf_processing (struct ccase *c, void *mtf_) min_head = min_tail = mtf->head; max_head = max_tail = NULL; for (iter = mtf->head->next; iter && iter->type == MTF_FILE; - iter = iter->next) - switch (mtf_compare_BY_values (mtf, min_head, iter, c)) - { - case -1: - if (max_head) - max_tail = max_tail->next_min = iter; - else - max_head = max_tail = iter; - break; - - case 0: + iter = iter->next) + { + int cmp = mtf_compare_BY_values (mtf, min_head, iter, c); + if (cmp < 0) + { + if (max_head) + max_tail = max_tail->next_min = iter; + else + max_head = max_tail = iter; + } + else if (cmp == 0) min_tail = min_tail->next_min = iter; - break; - - case 1: - if (max_head) - { - max_tail->next_min = min_head; - max_tail = min_tail; - } - else - { - max_head = min_head; - max_tail = min_tail; - } - min_head = min_tail = iter; - break; - - default: - assert (0); - } - + else /* cmp > 0 */ + { + if (max_head) + { + max_tail->next_min = min_head; + max_tail = min_tail; + } + else + { + max_head = min_head; + max_tail = min_tail; + } + min_head = min_tail = iter; + } + } + /* 4. For every TABLE, read another record as long as the BY values on the TABLE's input record are less than the FILEs' BY values. If an exact match is found, store all the values @@ -1259,32 +1259,28 @@ mtf_processing (struct ccase *c, void *mtf_) assert (iter->type == MTF_TABLE); next = iter->next; - - again: - switch (mtf_compare_BY_values (mtf, min_head, iter, c)) - { - case -1: - if (max_head) - max_tail = max_tail->next_min = iter; - else - max_head = max_tail = iter; - break; - - case 0: - min_tail = min_tail->next_min = iter; - break; - - case 1: - if (iter->handle == NULL) - return 1; - if (sfm_read_case (iter->reader, &iter->input)) - goto again; - mtf_delete_file_in_place (mtf, &iter); - break; - - default: - assert (0); - } + for (;;) + { + int cmp = mtf_compare_BY_values (mtf, min_head, iter, c); + if (cmp < 0) + { + if (max_head) + max_tail = max_tail->next_min = iter; + else + max_head = max_tail = iter; + } + else if (cmp == 0) + min_tail = min_tail->next_min = iter; + else /* cmp > 0 */ + { + if (iter->handle == NULL) + return 1; + if (sfm_read_case (iter->reader, &iter->input)) + continue; + mtf_delete_file_in_place (mtf, &iter); + } + break; + } } /* Next sequence number. */