blob: 36dc6f32d9f2d4b4344ab2b4c153fe9e278a5e6b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#include <stddef.h>
#include "macros.h"
#define __MLIB_DEFINE_BSEARCH(TYPE, TABLE, DEFAULT) \
static TYPE mlib_lookup(rune ch) \
{ \
ptrdiff_t i, lo, hi; \
lo = 0; \
hi = lengthof(TABLE) - 1; \
i = (lo + hi) / 2; \
do { \
if (ch < TABLE[i].lo) \
hi = i - 1; \
else if (ch > TABLE[i].hi) \
lo = i + 1; \
else \
return TABLE[i].val; \
i = (lo + hi) / 2; \
} while (lo <= hi); \
return DEFAULT; \
}
#define __MLIB_DEFINE_BSEARCH_CONTAINS(TABLE) \
static bool mlib_lookup_contains(rune ch) \
{ \
ptrdiff_t i, lo, hi; \
lo = 0; \
hi = lengthof(TABLE) - 1; \
i = (lo + hi) / 2; \
do { \
if (ch < TABLE[i].lo) \
hi = i - 1; \
else if (ch > TABLE[i].hi) \
lo = i + 1; \
else \
return true; \
i = (lo + hi) / 2; \
} while (lo <= hi); \
return false; \
}
// [[gnu::always_inline]] static TYPE
// lookup(rune ch)
// {
// ptrdiff_t i, lo, hi;
//
// #ifdef LATIN1_TABLE
// if (ch <= LATIN1_MAX)
// return LATIN1_TABLE[ch];
// #endif
// if (ch >= lengthof(TABLE))
// return DEFAULT;
//
// lo = 0;
// hi = lengthof(TABLE) - 1;
//
// #ifdef INITIAL_INDEX
// i = INITIAL_INDEX;
// #else
// i = (lo + hi) / 2;
// #endif
//
// do {
// if (ch < TABLE[i].LO)
// hi = i - 1;
// else if (ch > TABLE[i].HI)
// lo = i + 1;
// else
// #if HAS_VALUE
// return TABLE[i].val;
// #else
// return true;
// #endif
// i = (lo + hi) / 2;
// } while (lo <= hi);
//
// return DEFAULT;
// }
|