From 604c11affe988bab23c87598c02248fff1d73f43 Mon Sep 17 00:00:00 2001 From: Fumitoshi UKAI Date: Mon, 22 Sep 2003 21:02:15 +0000 Subject: merge m17n patch add libwc --- libwc/search.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 libwc/search.c (limited to 'libwc/search.c') 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 +#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); +} -- cgit v1.2.3