bsearch-insert-pos.h revision 810bf6e564ebef9655fc0ca3b5273fbb6022c098
8b1ff8af3123607dde63c516e007b47f6519c69aTimo Sirainen#ifndef __BSEARCH_INSERT_POS
8b1ff8af3123607dde63c516e007b47f6519c69aTimo Sirainen#define __BSEARCH_INSERT_POS
8b1ff8af3123607dde63c516e007b47f6519c69aTimo Sirainen
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen/* Binary search template */
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen#define BINARY_NUMBER_SEARCH(data, count, value, idx_r) \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen unsigned int idx, left_idx, right_idx; \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen idx = 0; left_idx = 0; right_idx = (count); \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen while (left_idx < right_idx) { \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen idx = (left_idx + right_idx) / 2; \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen if ((data)[idx] < (value)) \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen left_idx = idx+1; \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen else if ((data)[idx] > (value)) \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen right_idx = idx; \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen else { \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen *(idx_r) = idx; \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen return TRUE; \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen } \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen } \
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen return FALSE
810bf6e564ebef9655fc0ca3b5273fbb6022c098Timo Sirainen
9f5f6bdc3fd1304720b5d541bc31eb21417af6cbTimo Sirainen/* If key is found, returns TRUE and sets idx_r to the position where the key
9f5f6bdc3fd1304720b5d541bc31eb21417af6cbTimo Sirainen was found. If key isn't found, returns FALSE and sets idx_r to the position
9f5f6bdc3fd1304720b5d541bc31eb21417af6cbTimo Sirainen where the key should be inserted. */
9f5f6bdc3fd1304720b5d541bc31eb21417af6cbTimo Sirainenbool bsearch_insert_pos(const void *key, const void *base, unsigned int nmemb,
9f5f6bdc3fd1304720b5d541bc31eb21417af6cbTimo Sirainen size_t size, int (*cmp)(const void *, const void *),
9f5f6bdc3fd1304720b5d541bc31eb21417af6cbTimo Sirainen unsigned int *idx_r);
8b1ff8af3123607dde63c516e007b47f6519c69aTimo Sirainen
8b1ff8af3123607dde63c516e007b47f6519c69aTimo Sirainen#endif