X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fget.c;h=44e5af4ad2403acc60a3289da1169c090d545538;hb=dcd7e905755e831af27550a052cd9f2c7c0aa427;hp=fd9492210ab782544186749f1d26ddce7420df37;hpb=79e615c130eb0eaa23c7c220a51c3cf00e17b3a6;p=pspp diff --git a/src/get.c b/src/get.c index fd9492210a..44e5af4ad2 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")) { @@ -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. */