From 0790746952bc8609c5f1edf476d70dc9a49d3915 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 7 Jul 2005 03:46:04 +0000 Subject: [PATCH] * get.c: (mtf_processing) Don't assume that mtf_compare_BY_values() always returns -1, 0, or 1. Actually, it returns a negative, zero, or positive result. Fixes MATCH FILES bug on Mac OS X reported by "Marshall DeBerry" . --- src/ChangeLog | 7 ++++ src/get.c | 106 +++++++++++++++++++++++--------------------------- 2 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index fbae8241..2505600b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +Wed Jul 6 20:44:27 2005 Ben Pfaff + + * get.c: (mtf_processing) Don't assume that + mtf_compare_BY_values() always returns -1, 0, or 1. Actually, it + returns a negative, zero, or positive result. Fixes MATCH FILES + bug on Mac OS X reported by "Marshall DeBerry" . + Mon Jul 4 18:01:15 2005 Ben Pfaff * flip.c: [HAVE_SYS_TYPES_H] Really include . The diff --git a/src/get.c b/src/get.c index 32602b35..44e5af4a 100644 --- a/src/get.c +++ b/src/get.c @@ -1222,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 @@ -1263,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. */ -- 2.30.2