diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-10-01 17:28:26 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-10-01 17:28:26 +0300 |
commit | 7ab9bfa2000ccf02449b12af4d3d8d383db9cab3 (patch) | |
tree | 4cb6006a60881bb4fa8a6c6a317e330e989bd3f6 /libmailutils | |
parent | b9f3a3d90f09668bb6c131f94bcd4c91e83a44b1 (diff) | |
download | mailutils-7ab9bfa2000ccf02449b12af4d3d8d383db9cab3.tar.gz mailutils-7ab9bfa2000ccf02449b12af4d3d8d383db9cab3.tar.bz2 |
Rewrite amd_msg_bsearch without recursion
Diffstat (limited to 'libmailutils')
-rw-r--r-- | libmailutils/base/amd.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/libmailutils/base/amd.c b/libmailutils/base/amd.c index 8a7ee9b68..17ef4e456 100644 --- a/libmailutils/base/amd.c +++ b/libmailutils/base/amd.c @@ -254,18 +254,22 @@ amd_msg_bsearch (struct _amd_data *amd, mu_off_t first, mu_off_t last, mu_off_t mid; int rc; - if (last < first) - return 1; - - mid = (first + last) / 2; - rc = amd->msg_cmp (amd->msg_array[mid], msg); - if (rc > 0) - return amd_msg_bsearch (amd, first, mid-1, msg, pret); - *pret = mid; - if (rc < 0) - return amd_msg_bsearch (amd, mid+1, last, msg, pret); - /* else */ - return 0; + while (first <= last) + { + mid = (first + last) / 2; + rc = amd->msg_cmp (amd->msg_array[mid], msg); + if (rc > 0) + last = mid - 1; + else + { + *pret = mid; + if (rc < 0) + first = mid + 1; + else + return 0; + } + } + return 1; } /* Search for message MSG in the message array of AMD. |