73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #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, size_t 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);
 | |
| }
 |