diff options
author | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:18:09 +0000 |
---|---|---|
committer | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:18:09 +0000 |
commit | 5f8e0f8ef9a422691dd72e8a953a42a41478fcb4 (patch) | |
tree | 4b2df4796a534793648b3c4fc532fc36bd0cd525 /libwc/search.c | |
parent | Releasing debian version 0.3-2.4 (diff) | |
download | w3m-debian/0.5.1-1.tar.gz w3m-debian/0.5.1-1.zip |
Releasing debian version 0.5.1-1debian/0.5.1-1
Diffstat (limited to '')
-rw-r--r-- | libwc/search.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/libwc/search.c b/libwc/search.c new file mode 100644 index 0000000..655d1e0 --- /dev/null +++ b/libwc/search.c @@ -0,0 +1,72 @@ + +#include <stdlib.h> +#include "wc.h" + +static int +map_cmp(const void *a, const void *b) +{ + return *(wc_uint16 *)a - ((wc_map *)b)->code; +} + +static int +map3_cmp(const void *a, const void *b) +{ + return *(wc_uint32 *)a - (((wc_uint32)((wc_map3 *)b)->code << 16) | ((wc_map3 *)b)->code2); +} + +static int +map_range_cmp(const void *a, const void *b) +{ + return (*(wc_uint16 *)a < ((wc_map *)b)->code) ? -1 + : ((*(wc_uint16 *)a > ((wc_map *)b)->code2) ? 1 : 0); +} + +static int +map2_range_cmp(const void *a, const void *b) +{ + return (*(wc_uint16 *)a < ((wc_map *)b)->code) ? -1 + : ((*(wc_uint16 *)a >= ((wc_map *)b + 1)->code) ? 1 : 0); +} + +static int +map3_range_cmp(const void *a, const void *b) +{ + return (*(wc_uint16 *)a < ((wc_map3 *)b)->code) ? -1 + : ((*(wc_uint16 *)a > ((wc_map3 *)b)->code2) ? 1 : 0); +} + +wc_map * +wc_map_search(wc_uint16 code, wc_map *map, size_t n) +{ + return (wc_map *)bsearch((void *)&code, (void *)map, n, sizeof(wc_map), + map_cmp); +} + +wc_map3 * +wc_map3_search(wc_uint16 c1, wc_uint16 c2, wc_map3 *map, size_t n) +{ + wc_uint32 code = ((wc_uint32)c1 << 16) | c2; + return (wc_map3 *)bsearch((void *)&code, (void *)map, n, sizeof(wc_map3), + map3_cmp); +} + +wc_map * +wc_map_range_search(wc_uint16 code, wc_map *map, int n) +{ + return (wc_map *)bsearch((void *)&code, (void *)map, n, sizeof(wc_map), + map_range_cmp); +} + +wc_map * +wc_map2_range_search(wc_uint16 code, wc_map *map, size_t n) +{ + return (wc_map *)bsearch((void *)&code, (void *)map, n, sizeof(wc_map), + map2_range_cmp); +} + +wc_map3 * +wc_map3_range_search(wc_uint16 code, wc_map3 *map, size_t n) +{ + return (wc_map3 *)bsearch((void *)&code, (void *)map, n, sizeof(wc_map3), + map3_range_cmp); +} |