25 #define GRN_PAT_DELETED (GRN_ID_MAX + 1)
27 #define GRN_PAT_SEGMENT_SIZE 0x400000
28 #define W_OF_KEY_IN_A_SEGMENT 22
29 #define W_OF_PAT_IN_A_SEGMENT 18
30 #define W_OF_SIS_IN_A_SEGMENT 19
31 #define KEY_MASK_IN_A_SEGMENT 0x3fffff
32 #define PAT_MASK_IN_A_SEGMENT 0x3ffff
33 #define SIS_MASK_IN_A_SEGMENT 0x7ffff
34 #define SEG_NOT_ASSIGNED 0xffff
35 #define GRN_PAT_MAX_SEGMENT 0x1000
36 #define GRN_PAT_MDELINFOS (GRN_PAT_NDELINFOS - 1)
38 #define GRN_PAT_BIN_KEY 0x70000
78 #define PAT_DELETING (1<<1)
79 #define PAT_IMMEDIATE (1<<2)
81 #define PAT_DEL(x) ((x)->bits & PAT_DELETING)
82 #define PAT_IMD(x) ((x)->bits & PAT_IMMEDIATE)
83 #define PAT_LEN(x) (((x)->bits >> 3) + 1)
84 #define PAT_CHK(x) ((x)->check)
85 #define PAT_DEL_ON(x) ((x)->bits |= PAT_DELETING)
86 #define PAT_IMD_ON(x) ((x)->bits |= PAT_IMMEDIATE)
87 #define PAT_DEL_OFF(x) ((x)->bits &= ~PAT_DELETING)
88 #define PAT_IMD_OFF(x) ((x)->bits &= ~PAT_IMMEDIATE)
89 #define PAT_LEN_SET(x,v) ((x)->bits = ((x)->bits & ((1<<3) - 1))|(((v) - 1) << 3))
90 #define PAT_CHK_SET(x,v) ((x)->check = (v))
105 #define nth_bit(key,n,l) ((((key)[(n)>>4]) >> (7 - (((n)>>1) & 7))) & 1)
111 #define PAT_AT(pat,id,n) do {\
113 GRN_IO_ARRAY_AT(pat->io, segment_pat, id, &flags, n);\
132 if ((res = pat_get(ctx, pat, n))) {
168 sis_node *sl = sis_at(ctx, pat,
id);
171 while (sid && sid !=
id) {
174 if (level <
MAX_LEVEL) { sis_collect(ctx, pat, h, sid, level + 1); }
175 if (!(sl = sis_at(ctx, pat, sid))) {
break; }
186 #define KEY_AT(pat,pos,ptr,addp) do {\
188 GRN_IO_ARRAY_AT(pat->io, segment_key, pos, &flags, ptr);\
191 inline static uint32_t
204 if (!dest) {
return 0; }
205 memcpy(dest, key, len);
211 inline static uint8_t *
215 return (uint8_t *) &n->
key;
228 if (len <=
sizeof(uint32_t)) {
230 memcpy(&n->
key, key, len);
233 n->
key = key_put(ctx, pat, key, len);
256 if (di->
ld ==
id) {
return di; }
257 if (di->
d ==
id) {
return di; }
280 uint32_t len =
PAT_LEN(dn) * 16;
281 const uint8_t *key = pat_node_get_key(ctx, pat, dn);
293 if (c <= c0 || len <= c) {
break; }
295 p0 = (c + 1 < len) ? &rn->
lr[1] : &rn->
lr[0];
297 p0 = &rn->
lr[
nth_bit((uint8_t *)key, c, len)];
304 ln->
lr[1] = dn->
lr[1];
305 ln->
lr[0] = dn->
lr[0];
319 if (!ln) {
continue; }
320 if (!(dd = ddi->
d)) {
continue; }
385 const char *path, uint32_t key_size,
386 uint32_t value_size, uint32_t flags) {
390 uint32_t entry_size, w_of_element;
393 entry_size =
sizeof(
sis_node) + value_size;
397 for (w_of_element = 0; (1 << w_of_element) < entry_size; w_of_element++) {
411 if (!io) {
return NULL; }
442 if (!(node0 = pat_get(ctx, pat, 0))) {
454 uint32_t value_size, uint32_t flags)
461 if (!_grn_pat_create(ctx, pat, path, key_size, value_size, flags)) {
482 if (cache_size & (cache_size - 1)) {
511 if (!io) {
return NULL; }
553 ERR(rc,
"grn_io_close failed");
593 if (!_grn_pat_create(ctx, pat, path, key_size, value_size, flags)) {
605 _grn_pat_add(
grn_ctx *ctx,
grn_pat *pat,
const uint8_t *key, uint32_t size, uint32_t *
new, uint32_t *lkey)
607 grn_id r, r0, *p0, *p1 = NULL;
609 int c, c0 = -1, c1 = -1, len;
611 uint32_t cache_id = 0;
613 const uint8_t *p = key;
614 uint32_t length = size;
615 for (cache_id = 0; length--; p++) { cache_id = (cache_id * 37) + *p; }
617 if (pat->
cache[cache_id]) {
620 const uint8_t *k = pat_node_get_key(ctx, pat, rn);
621 if (k && size ==
PAT_LEN(rn) && !memcmp(k, key, size)) {
622 return pat->
cache[cache_id];
629 len = (int)size * 16;
635 const uint8_t *s, *d;
638 if (!(s = pat_node_get_key(ctx, pat, rn0))) {
return 0; }
644 if (c0 < rn0->check && rn0->
check < len) {
645 c1 = c0; c0 = rn0->
check;
648 p0 = (c0 + 1 < len) ? &rn0->
lr[1] : &rn0->
lr[0];
653 if (!(s = pat_node_get_key(ctx, pat, rn0))) {
return 0; }
655 if (size == size2 && !memcmp(s, key, size)) {
656 if (pat->
cache) { pat->
cache[cache_id] = r0; }
663 uint32_t min = size > size2 ? size2 : size;
664 for (c = 0, d = key; min && *s == *d; c += 16, s++, d++, min--);
666 for (xor = *s ^ *d, mask = 0x80; !(xor & mask); mask >>= 1, c += 2);
671 if (c == c0 && !*p0) {
672 if (c < len - 2) { c += 2; }
682 if (!rn0) {
return 0; }
684 if (c < c0) {
break; }
686 p0 = (c0 + 1 < len) ? &rn0->
lr[1] : &rn0->
lr[0];
694 if (c >= len) {
return 0; }
699 uint32_t size2 = size >
sizeof(uint32_t) ? size : 0;
700 if (*lkey && size2) {
706 if (!rn) {
return 0; }
709 if (!(rn = pat_node_new(ctx, pat, &r))) {
return 0; }
721 if (!rn) {
return 0; }
723 if (!(keybuf = pat_node_get_key(ctx, pat, rn))) {
return 0; }
725 memcpy(keybuf, key, size);
727 if (!(rn = pat_node_new(ctx, pat, &r))) {
return 0; }
728 pat_node_set_key(ctx, pat, rn, key, size);
735 if ((c & 1) ? (c + 1 < len) :
nth_bit(key, c, len)) {
750 chop(
grn_ctx *ctx,
grn_pat *pat,
const char **key,
const char *end, uint32_t *lkey)
762 #define MAX_FIXED_KEY_SIZE (sizeof(int64_t))
764 #define KEY_NEEDS_CONVERT(pat,size) \
765 (!((pat)->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE) && (size) <= MAX_FIXED_KEY_SIZE)
767 #define KEY_ENC(pat,keybuf,key,size) do {\
768 switch ((pat)->obj.header.flags & GRN_OBJ_KEY_MASK) {\
769 case GRN_OBJ_KEY_UINT :\
770 if (((pat)->obj.header.domain != GRN_DB_TOKYO_GEO_POINT) &&\
771 ((pat)->obj.header.domain != GRN_DB_WGS84_GEO_POINT)) {\
772 grn_hton((keybuf), (key), (size));\
775 case GRN_OBJ_KEY_GEO_POINT :\
776 grn_gton((keybuf), (key), (size));\
778 case GRN_OBJ_KEY_INT :\
779 grn_hton((keybuf), (key), (size));\
780 *((uint8_t *)(keybuf)) ^= 0x80;\
782 case GRN_OBJ_KEY_FLOAT :\
783 if ((size) == sizeof(int64_t)) {\
784 int64_t v = *(int64_t *)(key);\
785 v ^= ((v >> 63)|(1LL << 63));\
786 grn_hton((keybuf), &v, (size));\
792 #define KEY_DEC(pat,keybuf,key,size) do {\
793 switch ((pat)->obj.header.flags & GRN_OBJ_KEY_MASK) {\
794 case GRN_OBJ_KEY_UINT :\
795 if (((pat)->obj.header.domain != GRN_DB_TOKYO_GEO_POINT) &&\
796 ((pat)->obj.header.domain != GRN_DB_WGS84_GEO_POINT)) {\
797 grn_ntoh((keybuf), (key), (size));\
800 case GRN_OBJ_KEY_GEO_POINT :\
801 grn_ntog((keybuf), (key), (size));\
803 case GRN_OBJ_KEY_INT :\
804 grn_ntohi((keybuf), (key), (size));\
806 case GRN_OBJ_KEY_FLOAT :\
807 if ((size) == sizeof(int64_t)) {\
809 grn_hton(&v, (key), (size));\
810 *((int64_t *)(keybuf)) = v ^ (((v^(1LL<<63))>> 63)|(1LL<<63)); \
816 #define KEY_ENCODE(pat,keybuf,key,size) do {\
817 if (KEY_NEEDS_CONVERT(pat,size)) {\
818 KEY_ENC((pat), (keybuf), (key), (size));\
825 void **value,
int *added)
827 uint32_t
new, lkey = 0;
836 r0 = _grn_pat_add(ctx, pat, (uint8_t *)key, key_size, &
new, &lkey);
837 if (added) { *added =
new; }
839 (*((uint8_t *)key) & 0x80)) {
842 if (
new && (sl = sis_get(ctx, pat, l))) {
843 const char *sis = key, *end = sis +
key_size;
846 while (chop(ctx, pat, &sis, end, &lkey)) {
847 if (!(*sis & 0x80)) {
break; }
848 if (!(r = _grn_pat_add(ctx, pat, (uint8_t *)sis, end - sis, &
new, &lkey))) {
851 if (!(sr = sis_get(ctx, pat, r))) {
break; }
867 byte *v = (
byte *)sis_get(ctx, pat, r0);
878 _grn_pat_get(
grn_ctx *ctx,
grn_pat *pat,
const void *key, uint32_t key_size,
void **value)
883 uint32_t len = key_size * 16;
885 for (r = rn->
lr[1]; r;) {
889 if (len <= c) {
break; }
891 const uint8_t *k = pat_node_get_key(ctx, pat, rn);
892 if (k && key_size ==
PAT_LEN(rn) && !memcmp(k, key, key_size)) {
894 byte *v = (
byte *)sis_get(ctx, pat, r);
906 r = (c + 1 < len) ? rn->
lr[1] : rn->
lr[0];
908 r = rn->
lr[
nth_bit((uint8_t *)key, c, len)];
920 return _grn_pat_get(ctx, pat, key, key_size, value);
928 if (!(r = pat->
header->
garbages[key_size >
sizeof(uint32_t) ? key_size : 0])) {
945 get_tc(ctx, pat, h, node);
956 get_tc(ctx, pat, h, node);
966 const void *key, uint32_t key_size,
grn_hash *h)
970 uint32_t len = key_size * 16;
981 if (c0 < c && c < len - 1) {
983 r = (c + 1 < len) ? rn->
lr[1] : rn->
lr[0];
985 r = rn->
lr[
nth_bit((uint8_t *)key, c, len)];
990 if (!(k = pat_node_get_key(ctx, pat, rn))) {
break; }
991 if (
PAT_LEN(rn) < key_size) {
break; }
992 if (!memcmp(k, key, key_size)) {
994 get_tc(ctx, pat, h, rn);
1009 if (!pat || !key) {
return NULL; }
1021 const void *key, uint32_t key_size,
grn_hash *h)
1024 if ((r =
grn_pat_get(ctx, pat, key, key_size, NULL))) {
1028 if (pat->
obj.
header.
flags & GRN_OBJ_KEY_WITH_SIS) { sis_collect(ctx, pat, h, r, 1); }
1039 if (!pat || !key) {
return NULL; }
1054 uint32_t len = key_size * 16;
1058 for (r = rn->
lr[1]; r;) {
1063 if (
PAT_LEN(rn) <= key_size) {
1064 uint8_t *p = pat_node_get_key(ctx, pat, rn);
1066 if (!memcmp(p, key,
PAT_LEN(rn))) {
return r; }
1070 if (len <= c) {
break; }
1076 if (!rn0) {
break; }
1077 p = pat_node_get_key(ctx, pat, rn0);
1079 if (
PAT_LEN(rn0) <= key_size && !memcmp(p, key,
PAT_LEN(rn0))) { r2 = r0; }
1080 r = (c + 1 < len) ? rn->
lr[1] : rn->
lr[0];
1082 r = rn->
lr[
nth_bit((uint8_t *)key, c, len)];
1090 _grn_pat_del(
grn_ctx *ctx,
grn_pat *pat,
const char *key, uint32_t key_size,
int shared,
1097 uint32_t len = key_size * 16;
1098 grn_id r, otherside, *proot, *p, *p0 = NULL;
1100 di = delinfo_new(ctx, pat);
1104 proot = p = &rn->
lr[1];
1112 const uint8_t *k = pat_node_get_key(ctx, pat, rn);
1114 if (key_size ==
PAT_LEN(rn) && !memcmp(k, key, key_size)) {
1121 p = (c + 1 < len) ? &rn->
lr[1] : &rn->
lr[0];
1123 p = &rn->
lr[
nth_bit((uint8_t *)key, c, len)];
1127 if (optarg && optarg->
func &&
1131 direction = (rn0->
lr[1] == r);
1132 otherside = direction ? rn0->
lr[0] : rn0->
lr[1];
1137 PAT_AT(pat, otherside, rno);
1139 if (!delinfo_search(pat, otherside)) {
1144 if (proot == p0 && !rno->check) { rno->lr[0] = rno->lr[1] = otherside; }
1149 if (
PAT_DEL(rn)) { ldi = delinfo_search(pat, r); }
1150 if (
PAT_DEL(rn0)) { ddi = delinfo_search(pat, *p0); }
1174 if (ddi->d != *p0) {
1196 if (*p0 == otherside) {
1198 if (proot == p0 && !rn0->
check) { rn0->
lr[0] = rn0->
lr[1] = otherside; }
1201 PAT_AT(pat, otherside, rno);
1203 if (!delinfo_search(pat, otherside)) {
1208 if (proot == p0 && !rno->check) { rno->lr[0] = rno->lr[1] = otherside; }
1219 _grn_pat_delete(
grn_ctx *ctx,
grn_pat *pat,
const void *key, uint32_t key_size,
1229 return _grn_pat_del(ctx, pat, key, key_size, 0, optarg);
1239 return _grn_pat_delete(ctx, pat, key, key_size, optarg);
1259 key = pat_node_get_key(ctx, pat, node);
1265 return (
const char *)key;
1275 const char *key =
_grn_pat_key(ctx, pat,
id, &key_size);
1276 return _grn_pat_delete(ctx, pat, key, key_size, optarg);
1288 if (!node) {
return 0; }
1289 if (!(key = pat_node_get_key(ctx, pat, node))) {
return 0; }
1291 if (keybuf && bufsize >= len) {
1293 KEY_DEC(pat, keybuf, key, len);
1295 memcpy(keybuf, key, len);
1309 if (!node) {
return 0; }
1310 if (!(key = pat_node_get_key(ctx, pat, node))) {
return 0; }
1323 bulk->
u.
b.head = (
char *)key;
1324 bulk->
u.
b.curr = (
char *)key + len;
1337 byte *v = (
byte *)sis_at(ctx, pat,
id);
1341 memcpy(valuebuf, v +
sizeof(
sis_node), value_size);
1343 memcpy(valuebuf, v, value_size);
1355 const char *value = NULL;
1357 if ((value = (
const char *)sis_at(ctx, pat,
id))
1367 const void *value,
int flags)
1372 byte *v = (
byte *)sis_get(ctx, pat,
id);
1377 memcpy(v, value, value_size);
1380 switch (value_size) {
1381 case sizeof(int32_t) :
1382 *((int32_t *)v) += *((int32_t *)value);
1384 case sizeof(int64_t) :
1385 *((int64_t *)v) += *((int64_t *)value);
1392 switch (value_size) {
1393 case sizeof(int32_t) :
1394 *((int32_t *)v) -= *((int32_t *)value);
1396 case sizeof(int64_t) :
1397 *((int64_t *)v) -= *((int64_t *)value);
1421 if (key_size) { *key_size = pat->
key_size; }
1423 if (encoding) { *encoding = pat->
encoding; }
1431 *file_size = (
unsigned int) tmp;
1440 int level = 0, shared;
1441 const char *key = NULL, *_key;
1442 sis_node *sp, *ss = NULL, *si = sis_at(ctx, pat,
id);
1446 if ((si && si->children && si->children !=
id) ||
1447 (optarg && optarg->
func &&
1452 if (!(_key = (
char *)pat_node_get_key(ctx, pat, rn))) {
return 0; }
1460 if (key && key_size) { _grn_pat_del(ctx, pat, key, key_size, shared, NULL); }
1464 if ((*key & 0x80) && chop(ctx, pat, &key, key + key_size, &lkey)) {
1465 if ((sid =
grn_pat_get(ctx, pat, key, key_size - lkey, NULL)) &&
1466 (ss = sis_at(ctx, pat, sid))) {
1472 if (!(sp = sis_at(ctx, pat, *p))) {
break; }
1491 if (
_grn_pat_key(ctx, pat,
id, &key_size) != key) {
break; }
1499 pat_node_set_key(ctx, pat, rn, (uint8_t *)key, key_size);
1505 if (!((*key & 0x80) && chop(ctx, pat, &key, end, &lkey))) {
break; }
1516 while (++id <= pat->header->
curr_rec) {
1518 const char *key =
_grn_pat_key(ctx, pat,
id, &key_size);
1519 if (
id ==
grn_pat_get(ctx, pat, key, key_size, NULL)) {
1530 const char *key =
_grn_pat_key(ctx, pat,
id, &key_size);
1531 if (key && (
id == _grn_pat_get(ctx, pat, key, key_size, NULL))) {
return id; }
1552 unsigned int offset = 0, offset0 = 0;
1553 unsigned int normalized_length_in_bytes;
1554 const char *sp, *se;
1557 se = sp + normalized_length_in_bytes;
1558 while (n < sh_size) {
1563 sh[n].
offset = (*cp > 0) ? offset : offset0;
1565 if (*cp > 0) { offset0 = offset; offset += *cp; }
1571 if (*cp > 0) { offset0 = offset; offset += *cp; }
1574 }
while (sp < se && !*cp);
1576 if (se <= sp) { offset = str_len;
break; }
1585 if (rest) { *rest = str; }
1589 const char *sp, *se = str + str_len;
1590 for (sp = str; sp < se && n < sh_size; sp += len) {
1600 if (!len) {
break; }
1602 if (rest) { *rest = sp; }
1607 #define INITIAL_SIZE 512
1616 uint32_t size = c->
size * 4;
1618 if (!ss) {
return; }
1628 se = &c->
ss[c->
sp++];
1636 return c->
sp ? &c->
ss[--c->
sp] : NULL;
1649 if (_grn_pat_get(ctx, pat, key, key_size, NULL) != c->
curr_rec) {
1666 return grn_pat_cursor_next_by_id(ctx, c);
1668 while ((se =
pop(c))) {
1670 int check = se->
check, ch;
1678 push(c, node->
lr[0], ch);
1681 push(c, node->
lr[1], ch);
1687 if (
id == c->
tail) {
1691 uint32_t lmin, lmax;
1693 const uint8_t *kmin, *kmax;
1703 kmin = pat_node_get_key(ctx, c->
pat, nmin);
1704 kmax = pat_node_get_key(ctx, c->
pat, nmax);
1706 (memcmp(kmin, kmax, lmin) > 0) :
1707 (memcmp(kmin, kmax, lmax) >= 0)) {
1735 bitcmp(
const void *s1,
const void *s2,
int offset,
int length)
1737 int r, rest = length + (offset & 7) - 8, bl = offset >> 3, mask = 0xff >> (offset & 7);
1738 unsigned char *a = (
unsigned char *)s1 + bl, *
b = (
unsigned char *)s2 + bl;
1740 mask &= 0xff << -rest;
1741 return (*a & mask) - (*
b & mask);
1743 if ((r = (*a & mask) - (*
b & mask))) {
return r; }
1745 if ((bl = rest >> 3)) {
1746 if ((r = memcmp(a,
b, bl))) {
return r; }
1749 mask = 0xff << (8 - (rest & 7));
1750 return (*a & mask) - (*
b & mask);
1755 const void *key, uint32_t key_size,
int flags)
1759 uint32_t len, byte_len;
1765 byte_len = key_size >> 3;
1767 len = key_size * 16;
1777 if (c0 < ch && ch < len - 1) {
1779 id = (ch + 1 < len) ? node->
lr[1] : node->
lr[0];
1781 id = node->
lr[
nth_bit((uint8_t *)key, ch, len)];
1786 if (!(k = pat_node_get_key(ctx, pat, node))) {
break; }
1787 if (
PAT_LEN(node) < byte_len) {
break; }
1788 if ((flags & GRN_CURSOR_SIZE_BY_BIT)
1789 ? !bitcmp(k, key, 0, key_size)
1790 : !memcmp(k, key, key_size)) {
1794 push(c, node->
lr[0], ch);
1796 push(c, node->
lr[1], ch);
1798 push(c, node->
lr[1], ch);
1800 push(c, node->
lr[0], ch);
1816 uint32_t min_size,
const void *key,
int flags)
1821 int r, check = -1, ch;
1822 uint32_t min = min_size * 16;
1826 for (
id = node->
lr[1];
id;) {
1831 if (check >= min) {
push(c,
id, check); }
1834 if ((check += 2) < ch) {
1836 if ((r = bitcmp(key, k, check >> 1, (ch - check) >> 1))) {
1838 push(c, node->
lr[1], ch);
1839 push(c, node->
lr[0], ch);
1846 if (check >= min) {
push(c, node->
lr[0], check); }
1849 if (check >= min) {
push(c, node->
lr[1], check); }
1858 uint32_t min_size,
const void *key, uint32_t key_size,
int flags)
1864 uint32_t len = key_size * 16;
1868 for (
id = node->
lr[1];
id;) {
1876 if (min_size <= l && l <= key_size) {
1877 if (!memcmp(key, k, l)) {
push(c,
id, check); }
1883 if (len <= check) {
break; }
1892 if (memcmp(key, k, l)) {
break; }
1893 if (min_size <= l) {
1894 push(c, id0, check);
1899 id = node->
lr[
nth_bit((uint8_t *)key, check, len)];
1907 const void *key, uint32_t key_size,
int flags)
1912 int r, check = -1, ch, c2;
1913 uint32_t len = key_size * 16;
1917 for (
id = node->
lr[1];
id;) {
1925 if (l == key_size) {
1927 if (memcmp(key, k, l) < 0) {
push(c,
id, check); }
1929 if (memcmp(key, k, l) <= 0) {
push(c,
id, check); }
1931 }
else if (l < key_size) {
1932 if (memcmp(key, k, l) < 0) {
push(c,
id, check); }
1934 if (memcmp(key, k, key_size) <= 0) {
push(c,
id, check); }
1939 c2 = len < ch ? len : ch;
1940 if ((check += 2) < c2) {
1942 if ((r = bitcmp(key, k, check >> 1, ((c2 + 1) >> 1) - (check >> 1)))) {
1944 push(c, node->
lr[1], ch);
1945 push(c, node->
lr[0], ch);
1952 push(c, node->
lr[1], ch);
1953 push(c, node->
lr[0], ch);
1957 if (check + 1 < len) {
1960 push(c, node->
lr[1], check);
1964 if (
nth_bit((uint8_t *)key, check, len)) {
1967 push(c, node->
lr[1], check);
1977 const void *key, uint32_t key_size,
int flags)
1982 int r, check = -1, ch, c2;
1983 uint32_t len = key_size * 16;
1987 for (
id = node->
lr[1];
id;) {
1995 if (l <= key_size) {
1997 if (memcmp(key, k, l) > 0) {
push(c,
id, check); }
1999 if (memcmp(key, k, l) >= 0) {
push(c,
id, check); }
2002 if (memcmp(key, k, key_size) > 0) {
push(c,
id, check); }
2007 c2 = len < ch ? len : ch;
2008 if ((check += 2) < c2) {
2010 if ((r = bitcmp(key, k, check >> 1, ((c2 + 1) >> 1) - (check >> 1)))) {
2012 push(c, node->
lr[0], ch);
2013 push(c, node->
lr[1], ch);
2019 if (len <= check) {
break; }
2021 if (check + 1 < len) {
2022 push(c, node->
lr[0], check);
2028 if (
nth_bit((uint8_t *)key, check, len)) {
2029 push(c, node->
lr[0], check);
2041 const void *min, uint32_t min_size,
2042 const void *max, uint32_t max_size,
2043 int offset,
int limit,
int flags)
2047 if (!pat || !ctx) {
return NULL; }
2058 if (flags & GRN_CURSOR_DESCENDING) {
2065 if (!(flags & GRN_CURSOR_LT)) { c->
curr_rec++; }
2074 if ((flags & GRN_CURSOR_GT)) { c->
tail++; }
2086 if (!(flags & GRN_CURSOR_GT)) { c->
curr_rec--; }
2095 if ((flags & GRN_CURSOR_LT)) { c->
tail--; }
2107 if (_grn_pat_get(ctx, pat, key, key_size, NULL) == c->
curr_rec) {
2124 const void *key, uint32_t key_size,
int flags);
2128 const void *min, uint32_t min_size,
2129 const void *max, uint32_t max_size,
2130 int offset,
int limit,
int flags)
2135 if (!pat || !ctx) {
return NULL; }
2137 return grn_pat_cursor_open_by_id(ctx, pat, min, min_size, max, max_size,
2138 offset, limit, flags);
2152 if (max && max_size) {
2154 set_cursor_common_prefix(ctx, pat, c, min_size, max, max_size, flags);
2156 set_cursor_near(ctx, pat, c, min_size, max, flags);
2160 if (min && min_size) {
2162 set_cursor_rk(ctx, pat, c, min, min_size, flags);
2164 set_cursor_prefix(ctx, pat, c, min, min_size, flags);
2170 if (flags & GRN_CURSOR_DESCENDING) {
2171 if (min && min_size) {
2172 set_cursor_ascend(ctx, pat, c, min, min_size, flags);
2176 if (!c->
tail) {
goto exit; }
2178 if (max && max_size) {
2179 set_cursor_descend(ctx, pat, c, max, max_size, flags);
2186 if ((
id = node->
lr[1])) {
2190 push(c, node->
lr[0], ch);
2191 push(c, node->
lr[1], ch);
2196 if (max && max_size) {
2197 set_cursor_descend(ctx, pat, c, max, max_size, flags);
2201 if (!c->
tail) {
goto exit; }
2203 if (min && min_size) {
2204 set_cursor_ascend(ctx, pat, c, min, min_size, flags);
2211 if ((
id = node->
lr[1])) {
2215 push(c, node->
lr[1], ch);
2216 push(c, node->
lr[0], ch);
2257 void **key, uint32_t *key_size,
void **value)
2265 if (value && value_size) {
2282 const void *value,
int flags)
2344 grn_obj *key_buf,
int indent,
const char *prefix,
2353 for (i = 0; i < indent; i++) {
2371 grn_pat_inspect_check(ctx, buf, c);
2374 key = pat_node_get_key(ctx, pat, node);
2377 uint8_t
byte = key[
i];
2381 for (j = 0; j < 8; j++) {
2390 grn_pat_inspect_node(ctx, pat, node->
lr[0], c, key_buf,
2391 indent + 2,
"L:", buf);
2393 grn_pat_inspect_node(ctx, pat, node->
lr[1], c, key_buf,
2394 indent + 2,
"R:", buf);
2409 grn_pat_inspect_node(ctx, pat, node->
lr[1], -1, &key_buf, 0,
"", buf);
2421 for (i = 0; i < c->
sp; i++) {
2429 grn_pat_inspect_check(ctx, buf, e->
check);
2485 grn_pat_cursor_inspect_entries(ctx, c, buf);
2497 static uint16_t rk_str_idx[] = {
2498 0x0003, 0x0006, 0x0009, 0x000c, 0x0012, 0x0015, 0x0018, 0x001e, 0x0024, 0x002a,
2499 0x0030, 0x0036, 0x003c, 0x0042, 0x0048, 0x004e, 0x0054, 0x005a, 0x0060, 0x0066,
2500 0x006c, 0x0072, 0x0078, 0x007e, 0x0084, 0x008a, 0x0090, 0x0096, 0x009c, 0x00a2,
2501 0x00a8, 0x00ae, 0x00b4, 0x00ba, 0x00c0, 0x00c3, 0x00c6, 0x00c9, 0x00cc, 0x00cf,
2502 0x00d2, 0x00d5, 0x00db, 0x00e1, 0x00e7, 0x00ea, 0x00f0, 0x00f6, 0x00fc, 0x00ff,
2503 0x0105, 0x0108, 0x010e, 0x0111, 0x0114, 0x0117, 0x011a, 0x011d, 0x0120, 0x0123,
2504 0x0129, 0x012f, 0x0135, 0x013b, 0x013e, 0x0144, 0x014a, 0x0150, 0x0156, 0x0159,
2505 0x015c, 0x015f, 0x0162, 0x0165, 0x0168, 0x016b, 0x016e, 0x0171, 0x0177, 0x017d,
2506 0x0183, 0x0189, 0x018c, 0x0192, 0x0198, 0x019e, 0x01a1, 0x01a4, 0x01aa, 0x01b0,
2507 0x01b6, 0x01bc, 0x01bf, 0x01c2, 0x01c8, 0x01ce, 0x01d1, 0x01d7, 0x01dd, 0x01e0,
2508 0x01e6, 0x01e9, 0x01ef, 0x01f2, 0x01f5, 0x01fb, 0x0201, 0x0207, 0x020d, 0x0213,
2509 0x0216, 0x0219, 0x021c, 0x021f, 0x0222, 0x0225, 0x0228, 0x022e, 0x0234, 0x023a,
2510 0x023d, 0x0243, 0x0249, 0x024f, 0x0252, 0x0258, 0x025e, 0x0264, 0x0267, 0x026d,
2511 0x0273, 0x0279, 0x027f, 0x0285, 0x0288, 0x028b, 0x028e, 0x0291, 0x0294, 0x0297,
2512 0x029a, 0x029d, 0x02a0, 0x02a3, 0x02a9, 0x02af, 0x02b5, 0x02b8, 0x02bb, 0x02be,
2513 0x02c1, 0x02c4, 0x02c7, 0x02ca, 0x02cd, 0x02d0, 0x02d3, 0x02d6, 0x02dc, 0x02e2,
2514 0x02e8, 0x02eb, 0x02ee, 0x02f1, 0x02f4, 0x02f7, 0x02fa, 0x02fd, 0x0300, 0x0303,
2515 0x0309, 0x030c, 0x0312, 0x0318, 0x031e, 0x0324, 0x0327, 0x032a, 0x032d
2517 static char rk_str[] = {
2518 0xe3, 0x82, 0xa1, 0xe3, 0x82, 0xa2, 0xe3, 0x82, 0xa3, 0xe3, 0x82, 0xa4, 0xe3,
2519 0x82, 0xa4, 0xe3, 0x82, 0xa7, 0xe3, 0x82, 0xa5, 0xe3, 0x82, 0xa6, 0xe3, 0x82,
2520 0xa6, 0xe3, 0x82, 0xa2, 0xe3, 0x82, 0xa6, 0xe3, 0x82, 0xa3, 0xe3, 0x82, 0xa6,
2521 0xe3, 0x82, 0xa4, 0xe3, 0x82, 0xa6, 0xe3, 0x82, 0xa6, 0xe3, 0x82, 0xa6, 0xe3,
2522 0x82, 0xa7, 0xe3, 0x82, 0xa6, 0xe3, 0x82, 0xa8, 0xe3, 0x82, 0xa6, 0xe3, 0x82,
2523 0xaa, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xa0, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xa1,
2524 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xa2, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xa3, 0xe3,
2525 0x82, 0xa6, 0xe3, 0x83, 0xa4, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xa5, 0xe3, 0x82,
2526 0xa6, 0xe3, 0x83, 0xa6, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xa7, 0xe3, 0x82, 0xa6,
2527 0xe3, 0x83, 0xa8, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xa9, 0xe3, 0x82, 0xa6, 0xe3,
2528 0x83, 0xaa, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xab, 0xe3, 0x82, 0xa6, 0xe3, 0x83,
2529 0xac, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xad, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xae,
2530 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xaf, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
2531 0x82, 0xa6, 0xe3, 0x83, 0xb1, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb2, 0xe3, 0x82,
2532 0xa6, 0xe3, 0x83, 0xb3, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xbc, 0xe3, 0x82, 0xa7,
2533 0xe3, 0x82, 0xa8, 0xe3, 0x82, 0xa9, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xab, 0xe3,
2534 0x82, 0xac, 0xe3, 0x82, 0xad, 0xe3, 0x82, 0xad, 0xe3, 0x83, 0xa3, 0xe3, 0x82,
2535 0xad, 0xe3, 0x83, 0xa5, 0xe3, 0x82, 0xad, 0xe3, 0x83, 0xa7, 0xe3, 0x82, 0xae,
2536 0xe3, 0x82, 0xae, 0xe3, 0x83, 0xa3, 0xe3, 0x82, 0xae, 0xe3, 0x83, 0xa5, 0xe3,
2537 0x82, 0xae, 0xe3, 0x83, 0xa7, 0xe3, 0x82, 0xaf, 0xe3, 0x82, 0xaf, 0xe3, 0x82,
2538 0xa1, 0xe3, 0x82, 0xb0, 0xe3, 0x82, 0xb0, 0xe3, 0x82, 0xa1, 0xe3, 0x82, 0xb1,
2539 0xe3, 0x82, 0xb2, 0xe3, 0x82, 0xb3, 0xe3, 0x82, 0xb4, 0xe3, 0x82, 0xb5, 0xe3,
2540 0x82, 0xb6, 0xe3, 0x82, 0xb7, 0xe3, 0x82, 0xb7, 0xe3, 0x82, 0xa7, 0xe3, 0x82,
2541 0xb7, 0xe3, 0x83, 0xa3, 0xe3, 0x82, 0xb7, 0xe3, 0x83, 0xa5, 0xe3, 0x82, 0xb7,
2542 0xe3, 0x83, 0xa7, 0xe3, 0x82, 0xb8, 0xe3, 0x82, 0xb8, 0xe3, 0x82, 0xa7, 0xe3,
2543 0x82, 0xb8, 0xe3, 0x83, 0xa3, 0xe3, 0x82, 0xb8, 0xe3, 0x83, 0xa5, 0xe3, 0x82,
2544 0xb8, 0xe3, 0x83, 0xa7, 0xe3, 0x82, 0xb9, 0xe3, 0x82, 0xba, 0xe3, 0x82, 0xbb,
2545 0xe3, 0x82, 0xbc, 0xe3, 0x82, 0xbd, 0xe3, 0x82, 0xbe, 0xe3, 0x82, 0xbf, 0xe3,
2546 0x83, 0x80, 0xe3, 0x83, 0x81, 0xe3, 0x83, 0x81, 0xe3, 0x82, 0xa7, 0xe3, 0x83,
2547 0x81, 0xe3, 0x83, 0xa3, 0xe3, 0x83, 0x81, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x81,
2548 0xe3, 0x83, 0xa7, 0xe3, 0x83, 0x82, 0xe3, 0x83, 0x82, 0xe3, 0x83, 0xa3, 0xe3,
2549 0x83, 0x82, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x82, 0xe3, 0x83, 0xa7, 0xe3, 0x83,
2550 0x83, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x84, 0xe3, 0x82, 0xa1, 0xe3, 0x83, 0x84,
2551 0xe3, 0x82, 0xa3, 0xe3, 0x83, 0x84, 0xe3, 0x82, 0xa7, 0xe3, 0x83, 0x84, 0xe3,
2552 0x82, 0xa9, 0xe3, 0x83, 0x85, 0xe3, 0x83, 0x86, 0xe3, 0x83, 0x86, 0xe3, 0x82,
2553 0xa3, 0xe3, 0x83, 0x86, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x87, 0xe3, 0x83, 0x87,
2554 0xe3, 0x82, 0xa3, 0xe3, 0x83, 0x87, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x88, 0xe3,
2555 0x83, 0x88, 0xe3, 0x82, 0xa5, 0xe3, 0x83, 0x89, 0xe3, 0x83, 0x89, 0xe3, 0x82,
2556 0xa5, 0xe3, 0x83, 0x8a, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x8b, 0xe3, 0x82, 0xa3,
2557 0xe3, 0x83, 0x8b, 0xe3, 0x82, 0xa7, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0xa3, 0xe3,
2558 0x83, 0x8b, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0xa7, 0xe3, 0x83,
2559 0x8c, 0xe3, 0x83, 0x8d, 0xe3, 0x83, 0x8e, 0xe3, 0x83, 0x8f, 0xe3, 0x83, 0x90,
2560 0xe3, 0x83, 0x91, 0xe3, 0x83, 0x92, 0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa3, 0xe3,
2561 0x83, 0x92, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa7, 0xe3, 0x83,
2562 0x93, 0xe3, 0x83, 0x93, 0xe3, 0x83, 0xa3, 0xe3, 0x83, 0x93, 0xe3, 0x83, 0xa5,
2563 0xe3, 0x83, 0x93, 0xe3, 0x83, 0xa7, 0xe3, 0x83, 0x94, 0xe3, 0x83, 0x94, 0xe3,
2564 0x83, 0xa3, 0xe3, 0x83, 0x94, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x94, 0xe3, 0x83,
2565 0xa7, 0xe3, 0x83, 0x95, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xa1, 0xe3, 0x83, 0x95,
2566 0xe3, 0x82, 0xa3, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xa7, 0xe3, 0x83, 0x95, 0xe3,
2567 0x82, 0xa9, 0xe3, 0x83, 0x95, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0x96, 0xe3, 0x83,
2568 0x97, 0xe3, 0x83, 0x98, 0xe3, 0x83, 0x99, 0xe3, 0x83, 0x9a, 0xe3, 0x83, 0x9b,
2569 0xe3, 0x83, 0x9c, 0xe3, 0x83, 0x9d, 0xe3, 0x83, 0x9e, 0xe3, 0x83, 0x9f, 0xe3,
2570 0x83, 0x9f, 0xe3, 0x83, 0xa3, 0xe3, 0x83, 0x9f, 0xe3, 0x83, 0xa5, 0xe3, 0x83,
2571 0x9f, 0xe3, 0x83, 0xa7, 0xe3, 0x83, 0xa0, 0xe3, 0x83, 0xa1, 0xe3, 0x83, 0xa2,
2572 0xe3, 0x83, 0xa3, 0xe3, 0x83, 0xa4, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0xa6, 0xe3,
2573 0x83, 0xa7, 0xe3, 0x83, 0xa8, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xaa, 0xe3, 0x83,
2574 0xaa, 0xe3, 0x83, 0xa3, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0xa5, 0xe3, 0x83, 0xaa,
2575 0xe3, 0x83, 0xa7, 0xe3, 0x83, 0xab, 0xe3, 0x83, 0xac, 0xe3, 0x83, 0xad, 0xe3,
2576 0x83, 0xae, 0xe3, 0x83, 0xaf, 0xe3, 0x83, 0xb0, 0xe3, 0x83, 0xb1, 0xe3, 0x83,
2577 0xb2, 0xe3, 0x83, 0xb3, 0xe3, 0x83, 0xb3, 0xe3, 0x83, 0xbc, 0xe3, 0x83, 0xb4,
2578 0xe3, 0x83, 0xb4, 0xe3, 0x82, 0xa1, 0xe3, 0x83, 0xb4, 0xe3, 0x82, 0xa3, 0xe3,
2579 0x83, 0xb4, 0xe3, 0x82, 0xa7, 0xe3, 0x83, 0xb4, 0xe3, 0x82, 0xa9, 0xe3, 0x83,
2580 0xb5, 0xe3, 0x83, 0xb6, 0xe3, 0x83, 0xbc
2582 static uint16_t rk_tree_idx[] = {
2583 0x001b, 0x0022, 0x0025, 0x0028, 0x002d, 0x0030, 0x0039, 0x003b, 0x003c, 0x003f,
2584 0x0046, 0x0047, 0x004f, 0x0050, 0x0053, 0x005a, 0x005d, 0x0064, 0x0067, 0x006f,
2585 0x0070, 0x0073, 0x007d, 0x007f, 0x0081, 0x0082, 0x0083, 0x0088, 0x008f, 0x0092,
2586 0x00af, 0x00b5, 0x00bc, 0x00bf, 0x00c6, 0x00c9, 0x00d1, 0x00d6, 0x00da, 0x00e4,
2587 0x00e6, 0x00eb, 0x00ec, 0x00f0, 0x00f6, 0x00fc, 0x00fe, 0x0108, 0x010a, 0x010c,
2588 0x010d, 0x010e, 0x0113, 0x0118, 0x011f, 0x0123, 0x0125, 0x0164, 0x0180, 0x0183,
2592 {0x2d, 0x00, 0xb2, 0x01}, {0x61, 0x00, 0x01, 0x01}, {0x62, 0x01, 0xff, 0x01},
2593 {0x63, 0x03, 0xff, 0x01}, {0x64, 0x06, 0xff, 0x01}, {0x65, 0x00, 0x24, 0x01},
2594 {0x66, 0x0a, 0xff, 0x01}, {0x67, 0x0c, 0xff, 0x01}, {0x68, 0x0f, 0xff, 0x01},
2595 {0x69, 0x00, 0x03, 0x01}, {0x6a, 0x11, 0xff, 0x01}, {0x6b, 0x13, 0xff, 0x01},
2596 {0x6c, 0x16, 0xff, 0x01}, {0x6d, 0x1c, 0xff, 0x01}, {0x6e, 0x1e, 0xff, 0x01},
2597 {0x6f, 0x00, 0x26, 0x01}, {0x70, 0x20, 0xff, 0x01}, {0x72, 0x22, 0xff, 0x01},
2598 {0x73, 0x24, 0xff, 0x01}, {0x74, 0x27, 0xff, 0x01}, {0x75, 0x00, 0x06, 0x01},
2599 {0x76, 0x2c, 0xff, 0x01}, {0x77, 0x2d, 0xff, 0x01}, {0x78, 0x2f, 0xff, 0x01},
2600 {0x79, 0x35, 0xff, 0x01}, {0x7a, 0x36, 0xff, 0x01}, {0xe3, 0x38, 0xff, 0x01},
2601 {0x61, 0x00, 0x72, 0x01}, {0x62, 0x01, 0x56, 0x01}, {0x65, 0x00, 0x89, 0x01},
2602 {0x69, 0x00, 0x78, 0x01}, {0x6f, 0x00, 0x8c, 0x01}, {0x75, 0x00, 0x86, 0x01},
2603 {0x79, 0x02, 0xff, 0x00}, {0x61, 0x00, 0x79, 0x01}, {0x6f, 0x00, 0x7b, 0x01},
2604 {0x75, 0x00, 0x7a, 0x01}, {0x63, 0x03, 0x56, 0x01}, {0x68, 0x04, 0xff, 0x01},
2605 {0x79, 0x05, 0xff, 0x01}, {0x61, 0x00, 0x4f, 0x00}, {0x65, 0x00, 0x4e, 0x00},
2606 {0x69, 0x00, 0x4d, 0x01}, {0x6f, 0x00, 0x51, 0x00}, {0x75, 0x00, 0x50, 0x00},
2607 {0x61, 0x00, 0x4f, 0x01}, {0x6f, 0x00, 0x51, 0x01}, {0x75, 0x00, 0x50, 0x01},
2608 {0x61, 0x00, 0x4c, 0x01}, {0x64, 0x06, 0x56, 0x01}, {0x65, 0x00, 0x60, 0x01},
2609 {0x68, 0x07, 0xff, 0x00}, {0x69, 0x00, 0x61, 0x00}, {0x6f, 0x00, 0x65, 0x01},
2610 {0x75, 0x00, 0x5c, 0x01}, {0x77, 0x08, 0xff, 0x00}, {0x79, 0x09, 0xff, 0x01},
2611 {0x69, 0x00, 0x61, 0x01}, {0x75, 0x00, 0x62, 0x01}, {0x75, 0x00, 0x66, 0x01},
2612 {0x61, 0x00, 0x53, 0x01}, {0x6f, 0x00, 0x55, 0x01}, {0x75, 0x00, 0x54, 0x01},
2613 {0x61, 0x00, 0x81, 0x00}, {0x65, 0x00, 0x83, 0x00}, {0x66, 0x0a, 0x56, 0x01},
2614 {0x69, 0x00, 0x82, 0x00}, {0x6f, 0x00, 0x84, 0x00}, {0x75, 0x00, 0x80, 0x01},
2615 {0x79, 0x0b, 0xff, 0x00}, {0x75, 0x00, 0x85, 0x01}, {0x61, 0x00, 0x28, 0x01},
2616 {0x65, 0x00, 0x36, 0x01}, {0x67, 0x0c, 0x56, 0x01}, {0x69, 0x00, 0x2d, 0x01},
2617 {0x6f, 0x00, 0x38, 0x01}, {0x75, 0x00, 0x33, 0x01}, {0x77, 0x0d, 0xff, 0x00},
2618 {0x79, 0x0e, 0xff, 0x00}, {0x61, 0x00, 0x34, 0x01}, {0x61, 0x00, 0x2e, 0x01},
2619 {0x6f, 0x00, 0x30, 0x01}, {0x75, 0x00, 0x2f, 0x01}, {0x61, 0x00, 0x71, 0x01},
2620 {0x65, 0x00, 0x88, 0x01}, {0x68, 0x0f, 0x56, 0x01}, {0x69, 0x00, 0x74, 0x01},
2621 {0x6f, 0x00, 0x8b, 0x01}, {0x75, 0x00, 0x80, 0x01}, {0x79, 0x10, 0xff, 0x00},
2622 {0x61, 0x00, 0x75, 0x01}, {0x6f, 0x00, 0x77, 0x01}, {0x75, 0x00, 0x76, 0x01},
2623 {0x61, 0x00, 0x42, 0x00}, {0x65, 0x00, 0x41, 0x00}, {0x69, 0x00, 0x40, 0x01},
2624 {0x6a, 0x11, 0x56, 0x01}, {0x6f, 0x00, 0x44, 0x00}, {0x75, 0x00, 0x43, 0x00},
2625 {0x79, 0x12, 0xff, 0x00}, {0x61, 0x00, 0x42, 0x01}, {0x6f, 0x00, 0x44, 0x01},
2626 {0x75, 0x00, 0x43, 0x01}, {0x61, 0x00, 0x27, 0x01}, {0x65, 0x00, 0x35, 0x01},
2627 {0x69, 0x00, 0x29, 0x01}, {0x6b, 0x13, 0x56, 0x01}, {0x6f, 0x00, 0x37, 0x01},
2628 {0x75, 0x00, 0x31, 0x01}, {0x77, 0x14, 0xff, 0x00}, {0x79, 0x15, 0xff, 0x00},
2629 {0x61, 0x00, 0x32, 0x01}, {0x61, 0x00, 0x2a, 0x01}, {0x6f, 0x00, 0x2c, 0x01},
2630 {0x75, 0x00, 0x2b, 0x01}, {0x61, 0x00, 0x00, 0x01}, {0x65, 0x00, 0x23, 0x01},
2631 {0x69, 0x00, 0x02, 0x01}, {0x6b, 0x17, 0xff, 0x01}, {0x6c, 0x16, 0x56, 0x01},
2632 {0x6f, 0x00, 0x25, 0x01}, {0x74, 0x18, 0xff, 0x01}, {0x75, 0x00, 0x05, 0x01},
2633 {0x77, 0x1a, 0xff, 0x01}, {0x79, 0x1b, 0xff, 0x01}, {0x61, 0x00, 0xb0, 0x01},
2634 {0x65, 0x00, 0xb1, 0x01}, {0x73, 0x19, 0xff, 0x00}, {0x75, 0x00, 0x56, 0x01},
2635 {0x75, 0x00, 0x56, 0x01}, {0x61, 0x00, 0xa4, 0x01}, {0x61, 0x00, 0x96, 0x01},
2636 {0x65, 0x00, 0x23, 0x01}, {0x69, 0x00, 0x02, 0x01}, {0x6f, 0x00, 0x9a, 0x01},
2637 {0x75, 0x00, 0x98, 0x01}, {0x61, 0x00, 0x8e, 0x01}, {0x65, 0x00, 0x94, 0x01},
2638 {0x69, 0x00, 0x8f, 0x01}, {0x6d, 0x1c, 0x56, 0x01}, {0x6f, 0x00, 0x95, 0x01},
2639 {0x75, 0x00, 0x93, 0x01}, {0x79, 0x1d, 0xff, 0x00}, {0x61, 0x00, 0x90, 0x01},
2640 {0x6f, 0x00, 0x92, 0x01}, {0x75, 0x00, 0x91, 0x01}, {0x00, 0x00, 0xa9, 0x01},
2641 {0x27, 0x00, 0xa9, 0x00}, {0x2d, 0x00, 0xaa, 0x00}, {0x61, 0x00, 0x67, 0x01},
2642 {0x62, 0x01, 0xa9, 0x00}, {0x63, 0x03, 0xa9, 0x00}, {0x64, 0x06, 0xa9, 0x00},
2643 {0x65, 0x00, 0x6f, 0x01}, {0x66, 0x0a, 0xa9, 0x00}, {0x67, 0x0c, 0xa9, 0x00},
2644 {0x68, 0x0f, 0xa9, 0x00}, {0x69, 0x00, 0x68, 0x01}, {0x6a, 0x11, 0xa9, 0x00},
2645 {0x6b, 0x13, 0xa9, 0x00}, {0x6c, 0x16, 0xa9, 0x00}, {0x6d, 0x1c, 0xa9, 0x00},
2646 {0x6e, 0x00, 0xa9, 0x00}, {0x6f, 0x00, 0x70, 0x01}, {0x70, 0x20, 0xa9, 0x00},
2647 {0x72, 0x22, 0xa9, 0x00}, {0x73, 0x24, 0xa9, 0x00}, {0x74, 0x27, 0xa9, 0x00},
2648 {0x75, 0x00, 0x6e, 0x01}, {0x76, 0x2c, 0xa9, 0x00}, {0x77, 0x2d, 0xa9, 0x00},
2649 {0x78, 0x2f, 0xa9, 0x00}, {0x79, 0x1f, 0xff, 0x00}, {0x7a, 0x36, 0xa9, 0x00},
2650 {0xe3, 0x38, 0xa9, 0x00}, {0x00, 0x00, 0xa9, 0x01}, {0x61, 0x00, 0x6b, 0x01},
2651 {0x65, 0x00, 0x6a, 0x01}, {0x69, 0x00, 0x69, 0x01}, {0x6f, 0x00, 0x6d, 0x01},
2652 {0x75, 0x00, 0x6c, 0x01}, {0x61, 0x00, 0x73, 0x01}, {0x65, 0x00, 0x8a, 0x01},
2653 {0x69, 0x00, 0x7c, 0x01}, {0x6f, 0x00, 0x8d, 0x01}, {0x70, 0x20, 0x56, 0x01},
2654 {0x75, 0x00, 0x87, 0x01}, {0x79, 0x21, 0xff, 0x00}, {0x61, 0x00, 0x7d, 0x01},
2655 {0x6f, 0x00, 0x7f, 0x01}, {0x75, 0x00, 0x7e, 0x01}, {0x61, 0x00, 0x9c, 0x01},
2656 {0x65, 0x00, 0xa2, 0x01}, {0x69, 0x00, 0x9d, 0x01}, {0x6f, 0x00, 0xa3, 0x01},
2657 {0x72, 0x22, 0x56, 0x01}, {0x75, 0x00, 0xa1, 0x01}, {0x79, 0x23, 0xff, 0x00},
2658 {0x61, 0x00, 0x9e, 0x01}, {0x6f, 0x00, 0xa0, 0x01}, {0x75, 0x00, 0x9f, 0x01},
2659 {0x61, 0x00, 0x39, 0x01}, {0x65, 0x00, 0x47, 0x01}, {0x68, 0x25, 0xff, 0x00},
2660 {0x69, 0x00, 0x3b, 0x01}, {0x6f, 0x00, 0x49, 0x01}, {0x73, 0x24, 0x56, 0x01},
2661 {0x75, 0x00, 0x45, 0x01}, {0x79, 0x26, 0xff, 0x00}, {0x61, 0x00, 0x3d, 0x00},
2662 {0x65, 0x00, 0x3c, 0x00}, {0x69, 0x00, 0x3b, 0x01}, {0x6f, 0x00, 0x3f, 0x00},
2663 {0x75, 0x00, 0x3e, 0x00}, {0x61, 0x00, 0x3d, 0x01}, {0x65, 0x00, 0x3c, 0x01},
2664 {0x6f, 0x00, 0x3f, 0x01}, {0x75, 0x00, 0x3e, 0x01}, {0x61, 0x00, 0x4b, 0x01},
2665 {0x65, 0x00, 0x5d, 0x01}, {0x68, 0x28, 0xff, 0x00}, {0x69, 0x00, 0x4d, 0x01},
2666 {0x6f, 0x00, 0x63, 0x01}, {0x73, 0x29, 0xff, 0x00}, {0x74, 0x27, 0x56, 0x01},
2667 {0x75, 0x00, 0x57, 0x01}, {0x77, 0x2a, 0xff, 0x00}, {0x79, 0x2b, 0xff, 0x00},
2668 {0x69, 0x00, 0x5e, 0x01}, {0x75, 0x00, 0x5f, 0x01}, {0x61, 0x00, 0x58, 0x00},
2669 {0x65, 0x00, 0x5a, 0x00}, {0x69, 0x00, 0x59, 0x00}, {0x6f, 0x00, 0x5b, 0x00},
2670 {0x75, 0x00, 0x57, 0x01}, {0x75, 0x00, 0x64, 0x01}, {0x61, 0x00, 0x4f, 0x01},
2671 {0x65, 0x00, 0x4e, 0x01}, {0x6f, 0x00, 0x51, 0x01}, {0x75, 0x00, 0x50, 0x01},
2672 {0x61, 0x00, 0xac, 0x00}, {0x65, 0x00, 0xae, 0x00}, {0x69, 0x00, 0xad, 0x00},
2673 {0x6f, 0x00, 0xaf, 0x00}, {0x75, 0x00, 0xab, 0x01}, {0x76, 0x2c, 0x56, 0x01},
2674 {0x61, 0x00, 0xa5, 0x01}, {0x65, 0x00, 0x0b, 0x01}, {0x69, 0x00, 0x08, 0x01},
2675 {0x6f, 0x00, 0xa8, 0x01}, {0x77, 0x2d, 0x56, 0x01}, {0x79, 0x2e, 0xff, 0x01},
2676 {0x65, 0x00, 0xa7, 0x01}, {0x69, 0x00, 0xa6, 0x01}, {0x61, 0x00, 0x00, 0x01},
2677 {0x65, 0x00, 0x23, 0x01}, {0x69, 0x00, 0x02, 0x01}, {0x6b, 0x30, 0xff, 0x01},
2678 {0x6f, 0x00, 0x25, 0x01}, {0x74, 0x31, 0xff, 0x01}, {0x75, 0x00, 0x05, 0x01},
2679 {0x77, 0x33, 0xff, 0x01}, {0x78, 0x2f, 0x56, 0x01}, {0x79, 0x34, 0xff, 0x01},
2680 {0x61, 0x00, 0xb0, 0x01}, {0x65, 0x00, 0xb1, 0x01}, {0x73, 0x32, 0xff, 0x00},
2681 {0x75, 0x00, 0x56, 0x01}, {0x75, 0x00, 0x56, 0x01}, {0x61, 0x00, 0xa4, 0x01},
2682 {0x61, 0x00, 0x96, 0x01}, {0x65, 0x00, 0x23, 0x01}, {0x69, 0x00, 0x02, 0x01},
2683 {0x6f, 0x00, 0x9a, 0x01}, {0x75, 0x00, 0x98, 0x01}, {0x61, 0x00, 0x97, 0x01},
2684 {0x65, 0x00, 0x04, 0x01}, {0x6f, 0x00, 0x9b, 0x01}, {0x75, 0x00, 0x99, 0x01},
2685 {0x79, 0x35, 0x56, 0x01}, {0x61, 0x00, 0x3a, 0x01}, {0x65, 0x00, 0x48, 0x01},
2686 {0x69, 0x00, 0x40, 0x01}, {0x6f, 0x00, 0x4a, 0x01}, {0x75, 0x00, 0x46, 0x01},
2687 {0x79, 0x37, 0xff, 0x00}, {0x7a, 0x36, 0x56, 0x01}, {0x61, 0x00, 0x42, 0x01},
2688 {0x65, 0x00, 0x41, 0x01}, {0x6f, 0x00, 0x44, 0x01}, {0x75, 0x00, 0x43, 0x01},
2689 {0x81, 0x39, 0xff, 0x01}, {0x82, 0x3d, 0xff, 0x01}, {0x81, 0x00, 0x00, 0x01},
2690 {0x82, 0x00, 0x01, 0x01}, {0x83, 0x00, 0x02, 0x01}, {0x84, 0x00, 0x03, 0x01},
2691 {0x85, 0x00, 0x05, 0x01}, {0x86, 0x3a, 0xff, 0x01}, {0x87, 0x00, 0x23, 0x01},
2692 {0x88, 0x00, 0x24, 0x01}, {0x89, 0x00, 0x25, 0x01}, {0x8a, 0x00, 0x26, 0x01},
2693 {0x8b, 0x00, 0x27, 0x01}, {0x8c, 0x00, 0x28, 0x01}, {0x8d, 0x00, 0x29, 0x01},
2694 {0x8e, 0x00, 0x2d, 0x01}, {0x8f, 0x00, 0x31, 0x01}, {0x90, 0x00, 0x33, 0x01},
2695 {0x91, 0x00, 0x35, 0x01}, {0x92, 0x00, 0x36, 0x01}, {0x93, 0x00, 0x37, 0x01},
2696 {0x94, 0x00, 0x38, 0x01}, {0x95, 0x00, 0x39, 0x01}, {0x96, 0x00, 0x3a, 0x01},
2697 {0x97, 0x00, 0x3b, 0x01}, {0x98, 0x00, 0x40, 0x01}, {0x99, 0x00, 0x45, 0x01},
2698 {0x9a, 0x00, 0x46, 0x01}, {0x9b, 0x00, 0x47, 0x01}, {0x9c, 0x00, 0x48, 0x01},
2699 {0x9d, 0x00, 0x49, 0x01}, {0x9e, 0x00, 0x4a, 0x01}, {0x9f, 0x00, 0x4b, 0x01},
2700 {0xa0, 0x00, 0x4c, 0x01}, {0xa1, 0x00, 0x4d, 0x01}, {0xa2, 0x00, 0x52, 0x01},
2701 {0xa3, 0x00, 0x56, 0x01}, {0xa4, 0x00, 0x57, 0x01}, {0xa5, 0x00, 0x5c, 0x01},
2702 {0xa6, 0x00, 0x5d, 0x01}, {0xa7, 0x00, 0x60, 0x01}, {0xa8, 0x00, 0x63, 0x01},
2703 {0xa9, 0x00, 0x65, 0x01}, {0xaa, 0x00, 0x67, 0x01}, {0xab, 0x00, 0x68, 0x01},
2704 {0xac, 0x00, 0x6e, 0x01}, {0xad, 0x00, 0x6f, 0x01}, {0xae, 0x00, 0x70, 0x01},
2705 {0xaf, 0x00, 0x71, 0x01}, {0xb0, 0x00, 0x72, 0x01}, {0xb1, 0x00, 0x73, 0x01},
2706 {0xb2, 0x00, 0x74, 0x01}, {0xb3, 0x00, 0x78, 0x01}, {0xb4, 0x00, 0x7c, 0x01},
2707 {0xb5, 0x00, 0x80, 0x01}, {0xb6, 0x00, 0x86, 0x01}, {0xb7, 0x00, 0x87, 0x01},
2708 {0xb8, 0x00, 0x88, 0x01}, {0xb9, 0x00, 0x89, 0x01}, {0xba, 0x00, 0x8a, 0x01},
2709 {0xbb, 0x00, 0x8b, 0x01}, {0xbc, 0x00, 0x8c, 0x01}, {0xbd, 0x00, 0x8d, 0x01},
2710 {0xbe, 0x00, 0x8e, 0x01}, {0xbf, 0x00, 0x8f, 0x01}, {0x00, 0x00, 0x06, 0x00},
2711 {0x2d, 0x00, 0x22, 0x00}, {0x61, 0x00, 0x07, 0x00}, {0x62, 0x01, 0x06, 0x00},
2712 {0x63, 0x03, 0x06, 0x00}, {0x64, 0x06, 0x06, 0x00}, {0x65, 0x00, 0x0c, 0x00},
2713 {0x66, 0x0a, 0x06, 0x00}, {0x67, 0x0c, 0x06, 0x00}, {0x68, 0x0f, 0x06, 0x00},
2714 {0x69, 0x00, 0x09, 0x00}, {0x6a, 0x11, 0x06, 0x00}, {0x6b, 0x13, 0x06, 0x00},
2715 {0x6c, 0x16, 0x06, 0x00}, {0x6d, 0x1c, 0x06, 0x00}, {0x6e, 0x1e, 0x06, 0x00},
2716 {0x6f, 0x00, 0x0d, 0x00}, {0x70, 0x20, 0x06, 0x00}, {0x72, 0x22, 0x06, 0x00},
2717 {0x73, 0x24, 0x06, 0x00}, {0x74, 0x27, 0x06, 0x00}, {0x75, 0x00, 0x0a, 0x00},
2718 {0x76, 0x2c, 0x06, 0x00}, {0x77, 0x2d, 0x06, 0x00}, {0x78, 0x2f, 0x06, 0x00},
2719 {0x79, 0x35, 0x06, 0x00}, {0x7a, 0x36, 0x06, 0x00}, {0xe3, 0x3b, 0xff, 0x01},
2720 {0x00, 0x00, 0x06, 0x00}, {0x81, 0x39, 0x06, 0x00}, {0x82, 0x3c, 0xff, 0x01},
2721 {0x00, 0x00, 0x06, 0x01}, {0x80, 0x00, 0x0e, 0x00}, {0x81, 0x00, 0x0f, 0x00},
2722 {0x82, 0x00, 0x10, 0x00}, {0x83, 0x00, 0x11, 0x00}, {0x84, 0x00, 0x12, 0x00},
2723 {0x85, 0x00, 0x13, 0x00}, {0x86, 0x00, 0x14, 0x00}, {0x87, 0x00, 0x15, 0x00},
2724 {0x88, 0x00, 0x16, 0x00}, {0x89, 0x00, 0x17, 0x00}, {0x8a, 0x00, 0x18, 0x00},
2725 {0x8b, 0x00, 0x19, 0x00}, {0x8c, 0x00, 0x1a, 0x00}, {0x8d, 0x00, 0x1b, 0x00},
2726 {0x8e, 0x00, 0x1c, 0x00}, {0x8f, 0x00, 0x1d, 0x00}, {0x90, 0x00, 0x1e, 0x00},
2727 {0x91, 0x00, 0x1f, 0x00}, {0x92, 0x00, 0x20, 0x00}, {0x93, 0x00, 0x21, 0x00},
2728 {0x9b, 0x00, 0xab, 0x01}, {0x80, 0x00, 0x93, 0x01}, {0x81, 0x00, 0x94, 0x01},
2729 {0x82, 0x00, 0x95, 0x01}, {0x83, 0x00, 0x96, 0x01}, {0x84, 0x00, 0x97, 0x01},
2730 {0x85, 0x00, 0x98, 0x01}, {0x86, 0x00, 0x99, 0x01}, {0x87, 0x00, 0x9a, 0x01},
2731 {0x88, 0x00, 0x9b, 0x01}, {0x89, 0x00, 0x9c, 0x01}, {0x8a, 0x00, 0x9d, 0x01},
2732 {0x8b, 0x00, 0xa1, 0x01}, {0x8c, 0x00, 0xa2, 0x01}, {0x8d, 0x00, 0xa3, 0x01},
2733 {0x8e, 0x00, 0xa4, 0x01}, {0x8f, 0x00, 0xa5, 0x01}, {0x90, 0x00, 0xa6, 0x01},
2734 {0x91, 0x00, 0xa7, 0x01}, {0x92, 0x00, 0xa8, 0x01}, {0x93, 0x00, 0xa9, 0x01}
2738 rk_lookup(uint8_t state, uint8_t code)
2740 if (state <
sizeof(rk_tree_idx)/
sizeof(uint16_t)) {
2741 uint16_t ns = state ? rk_tree_idx[state - 1] : 0;
2742 uint16_t ne = rk_tree_idx[state];
2744 uint16_t m = (ns + ne)>>1;
2746 if (rn->
code == code) {
return rn; }
2747 if (rn->
code < code) {
2760 if (rn && rn->
emit != 0xff) {
2761 uint16_t pos = rn->
emit ? rk_str_idx[rn->
emit - 1] : 0;
2762 *str = &rk_str[pos];
2763 return (uint32_t)(rk_str_idx[rn->
emit] - pos);
2770 #define RK_OUTPUT(e,l) do {\
2772 uint32_t l_ = (oc + (l) < oe) ? (l) : (oe - oc);\
2773 memcpy(oc, (e), l_);\
2780 rk_conv(
const char *str, uint32_t str_len, uint8_t *buf, uint32_t buf_size, uint8_t *statep)
2786 uint8_t *oc = buf, *oe = oc + buf_size;
2787 const uint8_t *ic = (uint8_t *)str, *ic_ = ic, *ie = ic + str_len;
2789 if ((rn = rk_lookup(state, *ic))) {
2791 if ((l = rk_emit(rn, &e))) {
RK_OUTPUT(e, l); }
2794 if (!state) { ic++; }
2795 if (ic_ < ic) {
RK_OUTPUT(ic_, ic - ic_); }
2799 #ifdef FLUSH_UNRESOLVED_INPUT
2800 if ((rn = rk_lookup(state, 0))) {
2801 if ((l = rk_emit(rn, &e))) {
RK_OUTPUT(e, l); }
2804 if (ic_ < ic) {
RK_OUTPUT(ic_, ic - ic_); }
2813 int *c0, uint8_t *key, uint32_t key_len)
2816 uint32_t len = key_len * 16;
2817 if (!key_len) {
return id; }
2822 if (*c0 < ch && ch < len - 1) {
2824 id = (ch + 1 < len) ? pn->
lr[1] : pn->
lr[0];
2831 const uint8_t *k = pat_node_get_key(ctx, pat, pn);
2832 return (k && key_len <=
PAT_LEN(pn) && !memcmp(k, key, key_len)) ?
id :
GRN_ID_NIL;
2840 uint8_t *key, uint32_t key_len, uint8_t state,
grn_id id,
int c0,
int flags)
2845 if (flags & GRN_CURSOR_DESCENDING) {
2846 ns = rk_tree_idx[state - 1];
2847 ne = rk_tree_idx[state];
2850 ns = rk_tree_idx[state] - 1;
2851 ne = rk_tree_idx[state - 1] - 1;
2854 for (; ns != ne; ns += step) {
2858 uint32_t l = rk_emit(rn, &e);
2863 memcpy(key + key_len, e, l);
2864 if ((i = sub_search(ctx, pat,
id, &ch, key, key_len + l))) {
2865 search_push(ctx, pat, c, key, key_len + l, rn->
next, i, ch, flags);
2869 search_push(ctx, pat, c, key, key_len, rn->
next,
id, c0, flags);
2878 uint32_t len = key_len * 16;
2880 if (flags & GRN_CURSOR_DESCENDING) {
2881 if ((ch > len - 1) || !(flags & GRN_CURSOR_GT)) {
push(c, pn->
lr[0], ch); }
2885 if ((ch > len - 1) || !(flags & GRN_CURSOR_GT)) {
push(c, pn->
lr[0], ch); }
2888 if (
PAT_LEN(pn) * 16 > len || !(flags & GRN_CURSOR_GT)) {
push(c,
id, ch); }
2896 const void *key, uint32_t key_len,
int flags)
2902 uint32_t len, byte_len;
2906 len = byte_len * 16;
2909 if ((
id = sub_search(ctx, pat,
id, &c0, keybuf, byte_len))) {
2910 search_push(ctx, pat, c, keybuf, byte_len, state,
id, c0, flags);