31 #define MAX_PSEG 0x20000
32 #define S_CHUNK (1 << GRN_II_W_CHUNK)
34 #define S_SEGMENT (1 << W_SEGMENT)
35 #define N_CHUNKS_PER_FILE (GRN_IO_FILE_SIZE >> W_SEGMENT)
36 #define W_ARRAY_ELEMENT 3
37 #define S_ARRAY_ELEMENT (1 << W_ARRAY_ELEMENT)
38 #define W_ARRAY (W_SEGMENT - W_ARRAY_ELEMENT)
39 #define ARRAY_MASK_IN_A_SEGMENT ((1 << W_ARRAY) - 1)
40 #define NOT_ASSIGNED 0xffffffff
42 #define S_GARBAGE (1<<12)
44 #define CHUNK_SPLIT 0x80000000
45 #define CHUNK_SPLIT_THRESHOLD 0x60000
47 #define MAX_N_ELEMENTS 5
49 #define LSEG(pos) ((pos) >> 16)
50 #define LPOS(pos) (((pos) & 0xffff) << 2)
51 #define SEG2POS(seg,pos) ((((uint32_t)(seg)) << 16) + (((uint32_t)(pos)) >> 2))
53 #define NEXT_ADDR(p) (((byte *)(p)) + sizeof(*(p)))
64 inline static uint32_t
73 #ifndef CUT_OFF_COMPATIBILITY
81 if (pseg > pmax) { pmax = pseg; }
85 if (pseg > pmax) { pmax = pseg; }
89 for (pseg = 0; used[pseg] && pseg <
MAX_PSEG; pseg++) ;
102 uint32_t seg = segment_get(ctx, ii);
117 buffer_segment_new(
grn_ctx *ctx,
grn_ii *ii, uint32_t *segno)
132 pseg = segment_get(ctx, ii);
144 uint32_t *lseg0, uint32_t *pseg0,
145 uint32_t *lseg1, uint32_t *pseg1)
185 #define BGQENQUE(lseg) do {\
186 if (ii->header->binfo[lseg] != NOT_ASSIGNED) {\
187 ii->header->bgqbody[ii->header->bgqhead] = ii->header->binfo[lseg];\
188 ii->header->bgqhead = (ii->header->bgqhead + 1) & (GRN_II_BGQSIZE - 1);\
189 GRN_ASSERT(ii->header->bgqhead != ii->header->bgqtail);\
194 buffer_segment_update(
grn_ii *ii, uint32_t lseg, uint32_t pseg)
203 buffer_segment_clear(
grn_ii *ii, uint32_t lseg)
212 #define HEADER_CHUNK_AT(ii,offset) \
213 ((((ii)->header->chunks[((offset) >> 3)]) >> ((offset) & 7)) & 1)
215 #define HEADER_CHUNK_ON(ii,offset) \
216 (((ii)->header->chunks[((offset) >> 3)]) |= (1 << ((offset) & 7)))
218 #define HEADER_CHUNK_OFF(ii,offset) \
219 (((ii)->header->chunks[((offset) >> 3)]) &= ~(1 << ((offset) & 7)))
221 #define N_GARBAGES_TH 1
223 #define N_GARBAGES ((S_GARBAGE - (sizeof(uint32_t) * 4))/(sizeof(uint32_t)))
233 #define WIN_MAP2(chunk,ctx,iw,seg,pos,size,mode)\
234 grn_io_win_map2(chunk, ctx, iw,\
235 ((seg) >> GRN_II_N_CHUNK_VARIATION),\
236 (((seg) & ((1 << GRN_II_N_CHUNK_VARIATION) - 1)) << GRN_II_W_LEAST_CHUNK) + (pos),\
243 chunk_new(
grn_ctx *ctx,
grn_ii *ii, uint32_t *res, uint32_t size)
332 chunk_free(
grn_ctx *ctx,
grn_ii *ii, uint32_t offset, uint32_t dummy, uint32_t size)
344 uint32_t seg, m, *gseg;
374 if ((rc = chunk_new(ctx, ii, gseg,
S_GARBAGE))) {
441 #define UNIT_SIZE 0x80
442 #define UNIT_MASK (UNIT_SIZE - 1)
446 pack_1(uint32_t *p, uint8_t *rp)
460 unpack_1(uint32_t *p, uint8_t *dp)
463 *p++ = ((*dp >> 6) & 0x1);
464 *p++ = ((*dp >> 5) & 0x1);
465 *p++ = ((*dp >> 4) & 0x1);
466 *p++ = ((*dp >> 3) & 0x1);
467 *p++ = ((*dp >> 2) & 0x1);
468 *p++ = ((*dp >> 1) & 0x1);
469 *p++ = (*dp++ & 0x1);
473 pack_2(uint32_t *p, uint8_t *rp)
487 unpack_2(uint32_t *p, uint8_t *dp)
490 *p++ = ((*dp >> 4) & 0x3);
491 *p++ = ((*dp >> 2) & 0x3);
492 *p++ = (*dp++ & 0x3);
494 *p++ = ((*dp >> 4) & 0x3);
495 *p++ = ((*dp >> 2) & 0x3);
496 *p++ = (*dp++ & 0x3);
500 pack_3(uint32_t *p, uint8_t *rp)
505 *rp++ = v + (*p >> 1); v = *p++ << 7;
508 *rp++ = v + (*p >> 2); v = *p++ << 6;
514 unpack_3(uint32_t *p, uint8_t *dp)
518 *p++ = ((*dp >> 2) & 0x7);
519 v = ((*dp++ << 1) & 0x7); *p++ = v + (*dp >> 7);
520 *p++ = ((*dp >> 4) & 0x7);
521 *p++ = ((*dp >> 1) & 0x7);
522 v = ((*dp++ << 2) & 0x7); *p++ = v + (*dp >> 6);
523 *p++ = ((*dp >> 3) & 0x7);
524 *p++ = (*dp++ & 0x7);
528 pack_4(uint32_t *p, uint8_t *rp)
542 unpack_4(uint32_t *p, uint8_t *dp)
545 *p++ = (*dp++ & 0xf);
547 *p++ = (*dp++ & 0xf);
549 *p++ = (*dp++ & 0xf);
551 *p++ = (*dp++ & 0xf);
555 pack_5(uint32_t *p, uint8_t *rp)
559 *rp++ = v + (*p >> 2); v = *p++ << 6;
561 *rp++ = v + (*p >> 4); v = *p++ << 4;
562 *rp++ = v + (*p >> 1); v = *p++ << 7;
564 *rp++ = v + (*p >> 3); v = *p++ << 5;
569 unpack_5(uint32_t *p, uint8_t *dp)
573 v = ((*dp++ << 2) & 0x1f); *p++ = v + (*dp >> 6);
574 *p++ = ((*dp >> 1) & 0x1f);
575 v = ((*dp++ << 4) & 0x1f); *p++ = v + (*dp >> 4);
576 v = ((*dp++ << 1) & 0x1f); *p++ = v + (*dp >> 7);
577 *p++ = ((*dp >> 2) & 0x1f);
578 v = ((*dp++ << 3) & 0x1f); *p++ = v + (*dp >> 5);
579 *p++ = (*dp++ & 0x1f);
583 pack_6(uint32_t *p, uint8_t *rp)
587 *rp++ = v + (*p >> 4); v = *p++ << 4;
588 *rp++ = v + (*p >> 2); v = *p++ << 6;
591 *rp++ = v + (*p >> 4); v = *p++ << 4;
592 *rp++ = v + (*p >> 2); v = *p++ << 6;
597 unpack_6(uint32_t *p, uint8_t *dp)
601 v = ((*dp++ << 4) & 0x3f); *p++ = v + (*dp >> 4);
602 v = ((*dp++ << 2) & 0x3f); *p++ = v + (*dp >> 6);
603 *p++ = (*dp++ & 0x3f);
605 v = ((*dp++ << 4) & 0x3f); *p++ = v + (*dp >> 4);
606 v = ((*dp++ << 2) & 0x3f); *p++ = v + (*dp >> 6);
607 *p++ = (*dp++ & 0x3f);
611 pack_7(uint32_t *p, uint8_t *rp)
615 *rp++ = v + (*p >> 6); v = *p++ << 2;
616 *rp++ = v + (*p >> 5); v = *p++ << 3;
617 *rp++ = v + (*p >> 4); v = *p++ << 4;
618 *rp++ = v + (*p >> 3); v = *p++ << 5;
619 *rp++ = v + (*p >> 2); v = *p++ << 6;
620 *rp++ = v + (*p >> 1); v = *p++ << 7;
625 unpack_7(uint32_t *p, uint8_t *dp)
629 v = ((*dp++ << 6) & 0x7f); *p++ = v + (*dp >> 2);
630 v = ((*dp++ << 5) & 0x7f); *p++ = v + (*dp >> 3);
631 v = ((*dp++ << 4) & 0x7f); *p++ = v + (*dp >> 4);
632 v = ((*dp++ << 3) & 0x7f); *p++ = v + (*dp >> 5);
633 v = ((*dp++ << 2) & 0x7f); *p++ = v + (*dp >> 6);
634 v = ((*dp++ << 1) & 0x7f); *p++ = v + (*dp >> 7);
635 *p++ = (*dp++ & 0x7f);
639 pack_8(uint32_t *p, uint8_t *rp)
652 unpack_8(uint32_t *p, uint8_t *dp)
665 pack_9(uint32_t *p, uint8_t *rp)
668 *rp++ = (*p >> 1); v = *p++ << 7;
669 *rp++ = v + (*p >> 2); v = *p++ << 6;
670 *rp++ = v + (*p >> 3); v = *p++ << 5;
671 *rp++ = v + (*p >> 4); v = *p++ << 4;
672 *rp++ = v + (*p >> 5); v = *p++ << 3;
673 *rp++ = v + (*p >> 6); v = *p++ << 2;
674 *rp++ = v + (*p >> 7); v = *p++ << 1;
675 *rp++ = v + (*p >> 8); *rp++ = *p++;
679 unpack_9(uint32_t *p, uint8_t *dp)
682 v = *dp++ << 1; *p++ = v + (*dp >> 7);
683 v = ((*dp++ << 2) & 0x1ff); *p++ = v + (*dp >> 6);
684 v = ((*dp++ << 3) & 0x1ff); *p++ = v + (*dp >> 5);
685 v = ((*dp++ << 4) & 0x1ff); *p++ = v + (*dp >> 4);
686 v = ((*dp++ << 5) & 0x1ff); *p++ = v + (*dp >> 3);
687 v = ((*dp++ << 6) & 0x1ff); *p++ = v + (*dp >> 2);
688 v = ((*dp++ << 7) & 0x1ff); *p++ = v + (*dp >> 1);
689 v = ((*dp++ << 8) & 0x1ff); *p++ = v + *dp++;
693 pack_10(uint32_t *p, uint8_t *rp)
696 *rp++ = (*p >> 2); v = *p++ << 6;
697 *rp++ = v + (*p >> 4); v = *p++ << 4;
698 *rp++ = v + (*p >> 6); v = *p++ << 2;
699 *rp++ = v + (*p >> 8); *rp++ = *p++;
700 *rp++ = (*p >> 2); v = *p++ << 6;
701 *rp++ = v + (*p >> 4); v = *p++ << 4;
702 *rp++ = v + (*p >> 6); v = *p++ << 2;
703 *rp++ = v + (*p >> 8); *rp++ = *p++;
707 unpack_10(uint32_t *p, uint8_t *dp)
710 v = *dp++ << 2; *p++ = v + (*dp >> 6);
711 v = ((*dp++ << 4) & 0x3ff); *p++ = v + (*dp >> 4);
712 v = ((*dp++ << 6) & 0x3ff); *p++ = v + (*dp >> 2);
713 v = ((*dp++ << 8) & 0x3ff); *p++ = v + *dp++;
714 v = *dp++ << 2; *p++ = v + (*dp >> 6);
715 v = ((*dp++ << 4) & 0x3ff); *p++ = v + (*dp >> 4);
716 v = ((*dp++ << 6) & 0x3ff); *p++ = v + (*dp >> 2);
717 v = ((*dp++ << 8) & 0x3ff); *p++ = v + *dp++;
721 pack_11(uint32_t *p, uint8_t *rp)
724 *rp++ = (*p >> 3); v = *p++ << 5;
725 *rp++ = v + (*p >> 6); v = *p++ << 2;
726 *rp++ = v + (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
727 *rp++ = v + (*p >> 4); v = *p++ << 4;
728 *rp++ = v + (*p >> 7); v = *p++ << 1;
729 *rp++ = v + (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
730 *rp++ = v + (*p >> 5); v = *p++ << 3;
731 *rp++ = v + (*p >> 8); *rp++ = *p++;
735 unpack_11(uint32_t *p, uint8_t *dp)
738 v = *dp++ << 3; *p++ = v + (*dp >> 5);
739 v = ((*dp++ << 6) & 0x7ff); *p++ = v + (*dp >> 2);
740 v = ((*dp++ << 9) & 0x7ff); v += *dp++ << 1; *p++ = v + (*dp >> 7);
741 v = ((*dp++ << 4) & 0x7ff); *p++ = v + (*dp >> 4);
742 v = ((*dp++ << 7) & 0x7ff); *p++ = v + (*dp >> 1);
743 v = ((*dp++ << 10) & 0x7ff); v += *dp++ << 2; *p++ = v + (*dp >> 6);
744 v = ((*dp++ << 5) & 0x7ff); *p++ = v + (*dp >> 3);
745 v = ((*dp++ << 8) & 0x7ff); *p++ = v + *dp++;
749 pack_12(uint32_t *p, uint8_t *rp)
752 *rp++ = (*p >> 4); v = *p++ << 4;
753 *rp++ = v + (*p >> 8); *rp++ = *p++;
754 *rp++ = (*p >> 4); v = *p++ << 4;
755 *rp++ = v + (*p >> 8); *rp++ = *p++;
756 *rp++ = (*p >> 4); v = *p++ << 4;
757 *rp++ = v + (*p >> 8); *rp++ = *p++;
758 *rp++ = (*p >> 4); v = *p++ << 4;
759 *rp++ = v + (*p >> 8); *rp++ = *p++;
763 unpack_12(uint32_t *p, uint8_t *dp)
766 v = *dp++ << 4; *p++ = v + (*dp >> 4);
767 v = ((*dp++ << 8) & 0xfff); *p++ = v + *dp++;
768 v = *dp++ << 4; *p++ = v + (*dp >> 4);
769 v = ((*dp++ << 8) & 0xfff); *p++ = v + *dp++;
770 v = *dp++ << 4; *p++ = v + (*dp >> 4);
771 v = ((*dp++ << 8) & 0xfff); *p++ = v + *dp++;
772 v = *dp++ << 4; *p++ = v + (*dp >> 4);
773 v = ((*dp++ << 8) & 0xfff); *p++ = v + *dp++;
777 pack_13(uint32_t *p, uint8_t *rp)
780 *rp++ = (*p >> 5); v = *p++ << 3;
781 *rp++ = v + (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
782 *rp++ = v + (*p >> 7); v = *p++ << 1;
783 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
784 *rp++ = v + (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
785 *rp++ = v + (*p >> 6); v = *p++ << 2;
786 *rp++ = v + (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
787 *rp++ = v + (*p >> 8); *rp++ = *p++;
791 unpack_13(uint32_t *p, uint8_t *dp)
794 v = *dp++ << 5; *p++ = v + (*dp >> 3);
795 v = ((*dp++ << 10) & 0x1fff); v += *dp++ << 2; *p++ = v + (*dp >> 6);
796 v = ((*dp++ << 7) & 0x1fff); *p++ = v + (*dp >> 1);
797 v = ((*dp++ << 12) & 0x1fff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
798 v = ((*dp++ << 9) & 0x1fff); v += *dp++ << 1; *p++ = v + (*dp >> 7);
799 v = ((*dp++ << 6) & 0x1fff); *p++ = v + (*dp >> 2);
800 v = ((*dp++ << 11) & 0x1fff); v += *dp++ << 3; *p++ = v + (*dp >> 5);
801 v = ((*dp++ << 8) & 0x1fff); *p++ = v + *dp++;
805 pack_14(uint32_t *p, uint8_t *rp)
808 *rp++ = (*p >> 6); v = *p++ << 2;
809 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
810 *rp++ = v + (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
811 *rp++ = v + (*p >> 8); *rp++ = *p++;
812 *rp++ = (*p >> 6); v = *p++ << 2;
813 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
814 *rp++ = v + (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
815 *rp++ = v + (*p >> 8); *rp++ = *p++;
819 unpack_14(uint32_t *p, uint8_t *dp)
822 v = *dp++ << 6; *p++ = v + (*dp >> 2);
823 v = ((*dp++ << 12) & 0x3fff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
824 v = ((*dp++ << 10) & 0x3fff); v += *dp++ << 2; *p++ = v + (*dp >> 6);
825 v = ((*dp++ << 8) & 0x3fff); *p++ = v + *dp++;
826 v = *dp++ << 6; *p++ = v + (*dp >> 2);
827 v = ((*dp++ << 12) & 0x3fff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
828 v = ((*dp++ << 10) & 0x3fff); v += *dp++ << 2; *p++ = v + (*dp >> 6);
829 v = ((*dp++ << 8) & 0x3fff); *p++ = v + *dp++;
833 pack_15(uint32_t *p, uint8_t *rp)
836 *rp++ = (*p >> 7); v = *p++ << 1;
837 *rp++ = v + (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
838 *rp++ = v + (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
839 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
840 *rp++ = v + (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
841 *rp++ = v + (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
842 *rp++ = v + (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
843 *rp++ = v + (*p >> 8); *rp++ = *p++;
847 unpack_15(uint32_t *p, uint8_t *dp)
850 v = *dp++ << 7; *p++ = v + (*dp >> 1);
851 v = ((*dp++ << 14) & 0x7fff); v += *dp++ << 6; *p++ = v + (*dp >> 2);
852 v = ((*dp++ << 13) & 0x7fff); v += *dp++ << 5; *p++ = v + (*dp >> 3);
853 v = ((*dp++ << 12) & 0x7fff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
854 v = ((*dp++ << 11) & 0x7fff); v += *dp++ << 3; *p++ = v + (*dp >> 5);
855 v = ((*dp++ << 10) & 0x7fff); v += *dp++ << 2; *p++ = v + (*dp >> 6);
856 v = ((*dp++ << 9) & 0x7fff); v += *dp++ << 1; *p++ = v + (*dp >> 7);
857 v = ((*dp++ << 8) & 0x7fff); *p++ = v + *dp++;
861 pack_16(uint32_t *p, uint8_t *rp)
863 *rp++ = (*p >> 8); *rp++ = *p++;
864 *rp++ = (*p >> 8); *rp++ = *p++;
865 *rp++ = (*p >> 8); *rp++ = *p++;
866 *rp++ = (*p >> 8); *rp++ = *p++;
867 *rp++ = (*p >> 8); *rp++ = *p++;
868 *rp++ = (*p >> 8); *rp++ = *p++;
869 *rp++ = (*p >> 8); *rp++ = *p++;
870 *rp++ = (*p >> 8); *rp++ = *p++;
874 unpack_16(uint32_t *p, uint8_t *dp)
877 v = *dp++ << 8; *p++ = v + *dp++;
878 v = *dp++ << 8; *p++ = v + *dp++;
879 v = *dp++ << 8; *p++ = v + *dp++;
880 v = *dp++ << 8; *p++ = v + *dp++;
881 v = *dp++ << 8; *p++ = v + *dp++;
882 v = *dp++ << 8; *p++ = v + *dp++;
883 v = *dp++ << 8; *p++ = v + *dp++;
884 v = *dp++ << 8; *p++ = v + *dp++;
888 pack_17(uint32_t *p, uint8_t *rp)
891 *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
892 *rp++ = v + (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
893 *rp++ = v + (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
894 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
895 *rp++ = v + (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
896 *rp++ = v + (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
897 *rp++ = v + (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
898 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
902 unpack_17(uint32_t *p, uint8_t *dp)
905 v = *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
906 v = ((*dp++ << 10) & 0x1ffff); v += *dp++ << 2; *p++ = v + (*dp >> 6);
907 v = ((*dp++ << 11) & 0x1ffff); v += *dp++ << 3; *p++ = v + (*dp >> 5);
908 v = ((*dp++ << 12) & 0x1ffff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
909 v = ((*dp++ << 13) & 0x1ffff); v += *dp++ << 5; *p++ = v + (*dp >> 3);
910 v = ((*dp++ << 14) & 0x1ffff); v += *dp++ << 6; *p++ = v + (*dp >> 2);
911 v = ((*dp++ << 15) & 0x1ffff); v += *dp++ << 7; *p++ = v + (*dp >> 1);
912 v = ((*dp++ << 16) & 0x1ffff); v += *dp++ << 8; *p++ = v + *dp++;
916 pack_18(uint32_t *p, uint8_t *rp)
919 *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
920 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
921 *rp++ = v + (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
922 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
923 *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
924 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
925 *rp++ = v + (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
926 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
930 unpack_18(uint32_t *p, uint8_t *dp)
933 v = *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
934 v = ((*dp++ << 12) & 0x3ffff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
935 v = ((*dp++ << 14) & 0x3ffff); v += *dp++ << 6; *p++ = v + (*dp >> 2);
936 v = ((*dp++ << 16) & 0x3ffff); v += *dp++ << 8; *p++ = v + *dp++;
937 v = *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
938 v = ((*dp++ << 12) & 0x3ffff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
939 v = ((*dp++ << 14) & 0x3ffff); v += *dp++ << 6; *p++ = v + (*dp >> 2);
940 v = ((*dp++ << 16) & 0x3ffff); v += *dp++ << 8; *p++ = v + *dp++;
944 pack_19(uint32_t *p, uint8_t *rp)
947 *rp++ = (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
948 *rp++ = v + (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
949 *rp++ = v + (*p >> 17); *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
950 *rp++ = v + (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
951 *rp++ = v + (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
952 *rp++ = v + (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
953 *rp++ = v + (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
954 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
958 unpack_19(uint32_t *p, uint8_t *dp)
961 v = *dp++ << 11; v += *dp++ << 3; *p++ = v + (*dp >> 5);
962 v = ((*dp++ << 14) & 0x7ffff); v += *dp++ << 6; *p++ = v + (*dp >> 2);
963 v = ((*dp++ << 17) & 0x7ffff); v += *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
964 v = ((*dp++ << 12) & 0x7ffff); v += *dp++ << 4; *p++ = v + (*dp >> 4);
965 v = ((*dp++ << 15) & 0x7ffff); v += *dp++ << 7; *p++ = v + (*dp >> 1);
966 v = ((*dp++ << 18) & 0x7ffff); v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
967 v = ((*dp++ << 13) & 0x7ffff); v += *dp++ << 5; *p++ = v + (*dp >> 3);
968 v = ((*dp++ << 16) & 0x7ffff); v += *dp++ << 8; *p++ = v + *dp++;
972 pack_20(uint32_t *p, uint8_t *rp)
975 *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
976 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
977 *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
978 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
979 *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
980 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
981 *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
982 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
986 unpack_20(uint32_t *p, uint8_t *dp)
989 v = *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
990 v = ((*dp++ << 16) & 0xfffff); v += *dp++ << 8; *p++ = v + *dp++;
991 v = *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
992 v = ((*dp++ << 16) & 0xfffff); v += *dp++ << 8; *p++ = v + *dp++;
993 v = *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
994 v = ((*dp++ << 16) & 0xfffff); v += *dp++ << 8; *p++ = v + *dp++;
995 v = *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
996 v = ((*dp++ << 16) & 0xfffff); v += *dp++ << 8; *p++ = v + *dp++;
1000 pack_21(uint32_t *p, uint8_t *rp)
1003 *rp++ = (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
1004 *rp++ = v + (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1005 *rp++ = v + (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
1006 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1007 *rp++ = v + (*p >> 17); *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
1008 *rp++ = v + (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1009 *rp++ = v + (*p >> 19); *rp++ = (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
1010 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1014 unpack_21(uint32_t *p, uint8_t *dp)
1017 v = *dp++ << 13; v += *dp++ << 5; *p++ = v + (*dp >> 3);
1018 v = ((*dp++ << 18) & 0x1fffff); v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1019 v = ((*dp++ << 15) & 0x1fffff); v += *dp++ << 7; *p++ = v + (*dp >> 1);
1020 v = ((*dp++ << 20) & 0x1fffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1021 v = ((*dp++ << 17) & 0x1fffff); v += *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
1022 v = ((*dp++ << 14) & 0x1fffff); v += *dp++ << 6; *p++ = v + (*dp >> 2);
1023 v = ((*dp++ << 19) & 0x1fffff); v += *dp++ << 11; v += *dp++ << 3; *p++ = v + (*dp >> 5);
1024 v = ((*dp++ << 16) & 0x1fffff); v += *dp++ << 8; *p++ = v + *dp++;
1028 pack_22(uint32_t *p, uint8_t *rp)
1031 *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1032 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1033 *rp++ = v + (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1034 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1035 *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1036 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1037 *rp++ = v + (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1038 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1042 unpack_22(uint32_t *p, uint8_t *dp)
1045 v = *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1046 v = ((*dp++ << 20) & 0x3fffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1047 v = ((*dp++ << 18) & 0x3fffff); v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1048 v = ((*dp++ << 16) & 0x3fffff); v += *dp++ << 8; *p++ = v + *dp++;
1049 v = *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1050 v = ((*dp++ << 20) & 0x3fffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1051 v = ((*dp++ << 18) & 0x3fffff); v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1052 v = ((*dp++ << 16) & 0x3fffff); v += *dp++ << 8; *p++ = v + *dp++;
1056 pack_23(uint32_t *p, uint8_t *rp)
1059 *rp++ = (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
1060 *rp++ = v + (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1061 *rp++ = v + (*p >> 21); *rp++ = (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
1062 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1063 *rp++ = v + (*p >> 19); *rp++ = (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
1064 *rp++ = v + (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1065 *rp++ = v + (*p >> 17); *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
1066 *rp++ = v + (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1070 unpack_23(uint32_t *p, uint8_t *dp)
1073 v = *dp++ << 15; v += *dp++ << 7; *p++ = v + (*dp >> 1);
1074 v = ((*dp++ << 22) & 0x7fffff); v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1075 v = ((*dp++ << 21) & 0x7fffff); v += *dp++ << 13; v += *dp++ << 5; *p++ = v + (*dp >> 3);
1076 v = ((*dp++ << 20) & 0x7fffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1077 v = ((*dp++ << 19) & 0x7fffff); v += *dp++ << 11; v += *dp++ << 3; *p++ = v + (*dp >> 5);
1078 v = ((*dp++ << 18) & 0x7fffff); v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1079 v = ((*dp++ << 17) & 0x7fffff); v += *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
1080 v = ((*dp++ << 16) & 0x7fffff); v += *dp++ << 8; *p++ = v + *dp++;
1084 pack_24(uint32_t *p, uint8_t *rp)
1086 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1087 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1088 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1089 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1090 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1091 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1092 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1093 *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1097 unpack_24(uint32_t *p, uint8_t *dp)
1100 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1101 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1102 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1103 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1104 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1105 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1106 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1107 v = *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1111 pack_25(uint32_t *p, uint8_t *rp)
1114 *rp++ = (*p >> 17); *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
1115 *rp++ = v + (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1116 *rp++ = v + (*p >> 19); *rp++ = (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
1117 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1118 *rp++ = v + (*p >> 21); *rp++ = (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
1119 *rp++ = v + (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1120 *rp++ = v + (*p >> 23); *rp++ = (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
1121 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1125 unpack_25(uint32_t *p, uint8_t *dp)
1128 v = *dp++ << 17; v += *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
1129 v = ((*dp++ << 18) & 0x1ffffff); v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1130 v = ((*dp++ << 19) & 0x1ffffff); v += *dp++ << 11; v += *dp++ << 3; *p++ = v + (*dp >> 5);
1131 v = ((*dp++ << 20) & 0x1ffffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1132 v = ((*dp++ << 21) & 0x1ffffff); v += *dp++ << 13; v += *dp++ << 5; *p++ = v + (*dp >> 3);
1133 v = ((*dp++ << 22) & 0x1ffffff); v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1134 v = ((*dp++ << 23) & 0x1ffffff); v += *dp++ << 15; v += *dp++ << 7; *p++ = v + (*dp >> 1);
1135 v = ((*dp++ << 24) & 0x1ffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1139 pack_26(uint32_t *p, uint8_t *rp)
1142 *rp++ = (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1143 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1144 *rp++ = v + (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1145 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1146 *rp++ = (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1147 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1148 *rp++ = v + (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1149 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1153 unpack_26(uint32_t *p, uint8_t *dp)
1156 v = *dp++ << 18; v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1157 v = ((*dp++ << 20) & 0x3ffffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1158 v = ((*dp++ << 22) & 0x3ffffff); v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1159 v = ((*dp++ << 24) & 0x3ffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1160 v = *dp++ << 18; v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1161 v = ((*dp++ << 20) & 0x3ffffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1162 v = ((*dp++ << 22) & 0x3ffffff); v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1163 v = ((*dp++ << 24) & 0x3ffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1167 pack_27(uint32_t *p, uint8_t *rp)
1170 *rp++ = (*p >> 19); *rp++ = (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
1171 *rp++ = v + (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1172 *rp++ = v + (*p >> 25); *rp++ = (*p >> 17); *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
1173 *rp++ = v + (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1174 *rp++ = v + (*p >> 23); *rp++ = (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
1175 *rp++ = v + (*p >> 26); *rp++ = (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1176 *rp++ = v + (*p >> 21); *rp++ = (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
1177 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1181 unpack_27(uint32_t *p, uint8_t *dp)
1184 v = *dp++ << 19; v += *dp++ << 11; v += *dp++ << 3; *p++ = v + (*dp >> 5);
1185 v = ((*dp++ << 22) & 0x7ffffff); v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1186 v = ((*dp++ << 25) & 0x7ffffff); v += *dp++ << 17; v += *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
1187 v = ((*dp++ << 20) & 0x7ffffff); v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1188 v = ((*dp++ << 23) & 0x7ffffff); v += *dp++ << 15; v += *dp++ << 7; *p++ = v + (*dp >> 1);
1189 v = ((*dp++ << 26) & 0x7ffffff); v += *dp++ << 18; v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1190 v = ((*dp++ << 21) & 0x7ffffff); v += *dp++ << 13; v += *dp++ << 5; *p++ = v + (*dp >> 3);
1191 v = ((*dp++ << 24) & 0x7ffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1195 pack_28(uint32_t *p, uint8_t *rp)
1198 *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1199 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1200 *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1201 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1202 *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1203 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1204 *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1205 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1209 unpack_28(uint32_t *p, uint8_t *dp)
1212 v = *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1213 v = ((*dp++ << 24) & 0xfffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1214 v = *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1215 v = ((*dp++ << 24) & 0xfffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1216 v = *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1217 v = ((*dp++ << 24) & 0xfffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1218 v = *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1219 v = ((*dp++ << 24) & 0xfffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1223 pack_29(uint32_t *p, uint8_t *rp)
1226 *rp++ = (*p >> 21); *rp++ = (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
1227 *rp++ = v + (*p >> 26); *rp++ = (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1228 *rp++ = v + (*p >> 23); *rp++ = (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
1229 *rp++ = v + (*p >> 28); *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1230 *rp++ = v + (*p >> 25); *rp++ = (*p >> 17); *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
1231 *rp++ = v + (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1232 *rp++ = v + (*p >> 27); *rp++ = (*p >> 19); *rp++ = (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
1233 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1237 unpack_29(uint32_t *p, uint8_t *dp)
1240 v = *dp++ << 21; v += *dp++ << 13; v += *dp++ << 5; *p++ = v + (*dp >> 3);
1241 v = ((*dp++ << 26) & 0x1fffffff); v += *dp++ << 18; v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1242 v = ((*dp++ << 23) & 0x1fffffff); v += *dp++ << 15; v += *dp++ << 7; *p++ = v + (*dp >> 1);
1243 v = ((*dp++ << 28) & 0x1fffffff); v += *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1244 v = ((*dp++ << 25) & 0x1fffffff); v += *dp++ << 17; v += *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
1245 v = ((*dp++ << 22) & 0x1fffffff); v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1246 v = ((*dp++ << 27) & 0x1fffffff); v += *dp++ << 19; v += *dp++ << 11; v += *dp++ << 3; *p++ = v + (*dp >> 5);
1247 v = ((*dp++ << 24) & 0x1fffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1251 pack_30(uint32_t *p, uint8_t *rp)
1254 *rp++ = (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1255 *rp++ = v + (*p >> 28); *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1256 *rp++ = v + (*p >> 26); *rp++ = (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1257 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1258 *rp++ = (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1259 *rp++ = v + (*p >> 28); *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1260 *rp++ = v + (*p >> 26); *rp++ = (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1261 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1265 unpack_30(uint32_t *p, uint8_t *dp)
1268 v = *dp++ << 22; v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1269 v = ((*dp++ << 28) & 0x3fffffff); v += *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1270 v = ((*dp++ << 26) & 0x3fffffff); v += *dp++ << 18; v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1271 v = ((*dp++ << 24) & 0x3fffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1272 v = *dp++ << 22; v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1273 v = ((*dp++ << 28) & 0x3fffffff); v += *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1274 v = ((*dp++ << 26) & 0x3fffffff); v += *dp++ << 18; v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1275 v = ((*dp++ << 24) & 0x3fffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1279 pack_31(uint32_t *p, uint8_t *rp)
1282 *rp++ = (*p >> 23); *rp++ = (*p >> 15); *rp++ = (*p >> 7); v = *p++ << 1;
1283 *rp++ = v + (*p >> 30); *rp++ = (*p >> 22); *rp++ = (*p >> 14); *rp++ = (*p >> 6); v = *p++ << 2;
1284 *rp++ = v + (*p >> 29); *rp++ = (*p >> 21); *rp++ = (*p >> 13); *rp++ = (*p >> 5); v = *p++ << 3;
1285 *rp++ = v + (*p >> 28); *rp++ = (*p >> 20); *rp++ = (*p >> 12); *rp++ = (*p >> 4); v = *p++ << 4;
1286 *rp++ = v + (*p >> 27); *rp++ = (*p >> 19); *rp++ = (*p >> 11); *rp++ = (*p >> 3); v = *p++ << 5;
1287 *rp++ = v + (*p >> 26); *rp++ = (*p >> 18); *rp++ = (*p >> 10); *rp++ = (*p >> 2); v = *p++ << 6;
1288 *rp++ = v + (*p >> 25); *rp++ = (*p >> 17); *rp++ = (*p >> 9); *rp++ = (*p >> 1); v = *p++ << 7;
1289 *rp++ = v + (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1293 unpack_31(uint32_t *p, uint8_t *dp)
1296 v = *dp++ << 23; v += *dp++ << 15; v += *dp++ << 7; *p++ = v + (*dp >> 1);
1297 v = ((*dp++ << 30) & 0x7fffffff); v += *dp++ << 22; v += *dp++ << 14; v += *dp++ << 6; *p++ = v + (*dp >> 2);
1298 v = ((*dp++ << 29) & 0x7fffffff); v += *dp++ << 21; v += *dp++ << 13; v += *dp++ << 5; *p++ = v + (*dp >> 3);
1299 v = ((*dp++ << 28) & 0x7fffffff); v += *dp++ << 20; v += *dp++ << 12; v += *dp++ << 4; *p++ = v + (*dp >> 4);
1300 v = ((*dp++ << 27) & 0x7fffffff); v += *dp++ << 19; v += *dp++ << 11; v += *dp++ << 3; *p++ = v + (*dp >> 5);
1301 v = ((*dp++ << 26) & 0x7fffffff); v += *dp++ << 18; v += *dp++ << 10; v += *dp++ << 2; *p++ = v + (*dp >> 6);
1302 v = ((*dp++ << 25) & 0x7fffffff); v += *dp++ << 17; v += *dp++ << 9; v += *dp++ << 1; *p++ = v + (*dp >> 7);
1303 v = ((*dp++ << 24) & 0x7fffffff); v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1307 pack_32(uint32_t *p, uint8_t *rp)
1309 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1310 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1311 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1312 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1313 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1314 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1315 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1316 *rp++ = (*p >> 24); *rp++ = (*p >> 16); *rp++ = (*p >> 8); *rp++ = *p++;
1320 unpack_32(uint32_t *p, uint8_t *dp)
1323 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1324 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1325 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1326 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1327 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1328 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1329 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1330 v = *dp++ << 24; v += *dp++ << 16; v += *dp++ << 8; *p++ = v + *dp++;
1336 pack_(uint32_t *p, uint32_t i,
int w, uint8_t *rp)
1341 case 1 : rp = pack_1(p, rp);
break;
1342 case 2 : rp = pack_2(p, rp);
break;
1343 case 3 : rp = pack_3(p, rp);
break;
1344 case 4 : rp = pack_4(p, rp);
break;
1345 case 5 : rp = pack_5(p, rp);
break;
1346 case 6 : rp = pack_6(p, rp);
break;
1347 case 7 : rp = pack_7(p, rp);
break;
1348 case 8 : rp = pack_8(p, rp);
break;
1349 case 9 : rp = pack_9(p, rp);
break;
1350 case 10 : rp = pack_10(p, rp);
break;
1351 case 11 : rp = pack_11(p, rp);
break;
1352 case 12 : rp = pack_12(p, rp);
break;
1353 case 13 : rp = pack_13(p, rp);
break;
1354 case 14 : rp = pack_14(p, rp);
break;
1355 case 15 : rp = pack_15(p, rp);
break;
1356 case 16 : rp = pack_16(p, rp);
break;
1357 case 17 : rp = pack_17(p, rp);
break;
1358 case 18 : rp = pack_18(p, rp);
break;
1359 case 19 : rp = pack_19(p, rp);
break;
1360 case 20 : rp = pack_20(p, rp);
break;
1361 case 21 : rp = pack_21(p, rp);
break;
1362 case 22 : rp = pack_22(p, rp);
break;
1363 case 23 : rp = pack_23(p, rp);
break;
1364 case 24 : rp = pack_24(p, rp);
break;
1365 case 25 : rp = pack_25(p, rp);
break;
1366 case 26 : rp = pack_26(p, rp);
break;
1367 case 27 : rp = pack_27(p, rp);
break;
1368 case 28 : rp = pack_28(p, rp);
break;
1369 case 29 : rp = pack_29(p, rp);
break;
1370 case 30 : rp = pack_30(p, rp);
break;
1371 case 31 : rp = pack_31(p, rp);
break;
1372 case 32 : rp = pack_32(p, rp);
break;
1380 uint32_t *pe = p +
i;
1381 for (b = 8 - w, v = 0; p < pe;) {
1386 *rp++ = v + (*p >> -
b);
1395 if (b + w != 8) { *rp++ = v; }
1401 pack(uint32_t *p, uint32_t i, uint8_t *freq, uint8_t *rp)
1405 uint32_t s, *pe = p +
i, r, th = i - (i >> 3);
1406 for (w = 0, s = 0; w <= 32; w++) {
1407 if ((s += freq[w]) >= th) {
break; }
1411 return pack_(p, i, w, rp);
1417 uint32_t first, *last = &first;
1418 for (k = 0; p < pe; p++, k++) {
1426 *rp++ = (uint8_t) first;
1428 for (k = 0; p < pe; p++, k++) {
1436 rp = pack_(p - i, i, w, rp);
1437 memcpy(rp, ebuf, ep - ebuf);
1438 return rp + (ep - ebuf);
1444 uint8_t *rp, freq[33];
1445 uint32_t j, *dp, *dpe, d, w, buf[
UNIT_SIZE];
1446 *res = rp =
GRN_MALLOC(data_size *
sizeof(uint32_t) * 2);
1448 memset(freq, 0, 33);
1449 for (j = 0, dp = data, dpe = dp + data_size; dp < dpe; j++, dp++) {
1451 rp = pack(buf, j, freq, rp);
1452 memset(freq, 0, 33);
1455 if ((d = buf[j] = *dp)) {
1462 if (j) { rp = pack(buf, j, freq, rp); }
1466 #define USE_P_ENC (1<<0)
1467 #define CUT_OFF (1<<1)
1478 size_t unitsize,
size_t totalsize)
1481 if (!dv[0].data || dv[dvlen].data < dv[0].data + totalsize) {
1482 if (dv[0].data) {
GRN_FREE(dv[0].data); }
1483 if (!(dv[0].data =
GRN_MALLOC(totalsize *
sizeof(uint32_t)))) {
1486 dv[dvlen].
data = dv[0].
data + totalsize;
1488 for (i = 1; i < dvlen; i++) {
1496 size_t unitsize,
size_t totalsize)
1500 memset(dv, 0,
sizeof(
datavec) * (dvlen + 1));
1503 if (!(dv[0].data =
GRN_MALLOC(totalsize *
sizeof(uint32_t)))) {
1506 dv[dvlen].
data = dv[0].
data + totalsize;
1507 for (i = 1; i < dvlen; i++) {
1516 if (dv[0].data) {
GRN_FREE(dv[0].data); }
1522 uint8_t *rp = res, freq[33];
1523 uint32_t pgap, usep, l, df, data_size, *dp, *dpe;
1524 if (!dvlen || !(df = dv[0].data_size)) {
return 0; }
1525 for (usep = 0, data_size = 0, l = 0; l < dvlen; l++) {
1527 if (dl < df || ((dl > df) && (l != dvlen - 1))) {
1534 pgap = data_size - df * dvlen;
1537 for (l = 0; l < dvlen; l++) {
1538 for (dp = dv[l].data, dpe = dp + dv[l].data_size; dp < dpe; dp++) {
1546 if (dv[dvlen - 1].flags &
ODD) {
1551 for (l = 0; l < dvlen; l++) {
1556 memset(freq, 0, 33);
1559 rp = pack(buf, j, freq, rp);
1560 memset(freq, 0, 33);
1563 if ((d = buf[j++] = *dp++)) {
1571 if (j) { rp = pack(buf, j, freq, rp); }
1573 while (dp < dpe) {
GRN_B_ENC(*dp++, rp); }
1580 #define GRN_B_DEC_CHECK(v,p,pe) do { \
1581 uint8_t *_p = (uint8_t *)p; \
1583 if (_p >= pe) { return 0; } \
1585 switch (_v >> 4) { \
1588 if (_p + sizeof(uint32_t) > pe) { return 0; } \
1589 memcpy(&_v, _p, sizeof(uint32_t)); \
1590 _p += sizeof(uint32_t); \
1594 if (_p + 3 > pe) { return 0; } \
1595 _v = (_v - 0x90) * 0x100 + *_p++; \
1596 _v = _v * 0x100 + *_p++; \
1597 _v = _v * 0x100 + *_p++ + 0x20408f; \
1601 if (_p + 2 > pe) { return 0; } \
1602 _v = (_v - 0xa0) * 0x100 + *_p++; \
1603 _v = _v * 0x100 + *_p++ + 0x408f; \
1609 if (_p + 1 > pe) { return 0; } \
1610 _v = (_v - 0xc0) * 0x100 + *_p++ + 0x8f; \
1618 unpack(uint8_t *dp, uint8_t *dpe,
int i, uint32_t *rp)
1620 uint8_t ne = 0, k = 0, w = *dp++;
1621 uint32_t m, *p = rp;
1632 if (dp + w > dpe) {
return NULL; }
1634 case 1 : dp = unpack_1(p, dp);
break;
1635 case 2 : dp = unpack_2(p, dp);
break;
1636 case 3 : dp = unpack_3(p, dp);
break;
1637 case 4 : dp = unpack_4(p, dp);
break;
1638 case 5 : dp = unpack_5(p, dp);
break;
1639 case 6 : dp = unpack_6(p, dp);
break;
1640 case 7 : dp = unpack_7(p, dp);
break;
1641 case 8 : dp = unpack_8(p, dp);
break;
1642 case 9 : dp = unpack_9(p, dp);
break;
1643 case 10 : dp = unpack_10(p, dp);
break;
1644 case 11 : dp = unpack_11(p, dp);
break;
1645 case 12 : dp = unpack_12(p, dp);
break;
1646 case 13 : dp = unpack_13(p, dp);
break;
1647 case 14 : dp = unpack_14(p, dp);
break;
1648 case 15 : dp = unpack_15(p, dp);
break;
1649 case 16 : dp = unpack_16(p, dp);
break;
1650 case 17 : dp = unpack_17(p, dp);
break;
1651 case 18 : dp = unpack_18(p, dp);
break;
1652 case 19 : dp = unpack_19(p, dp);
break;
1653 case 20 : dp = unpack_20(p, dp);
break;
1654 case 21 : dp = unpack_21(p, dp);
break;
1655 case 22 : dp = unpack_22(p, dp);
break;
1656 case 23 : dp = unpack_23(p, dp);
break;
1657 case 24 : dp = unpack_24(p, dp);
break;
1658 case 25 : dp = unpack_25(p, dp);
break;
1659 case 26 : dp = unpack_26(p, dp);
break;
1660 case 27 : dp = unpack_27(p, dp);
break;
1661 case 28 : dp = unpack_28(p, dp);
break;
1662 case 29 : dp = unpack_29(p, dp);
break;
1663 case 30 : dp = unpack_30(p, dp);
break;
1664 case 31 : dp = unpack_31(p, dp);
break;
1665 case 32 : dp = unpack_32(p, dp);
break;
1673 for (b = 8 - w, v = 0, pe = p + i; p < pe && dp < dpe;) {
1675 *p++ = v + ((*dp >>
b) & m);
1679 v += (*dp++ << -
b) & m;
1682 *p++ = v + (*dp++ & m);
1687 if (b + w != 8) { dp++; }
1690 memset(p, 0,
sizeof(uint32_t) * i);
1715 uint8_t *dp = data, *dpe = data + data_size;
1716 uint32_t rest, orig_size, *rp, *rpe;
1719 if (!nreq || nreq > data_size) { nreq = data_size; }
1721 for (rpe = rp + nreq; dp < data + data_size && rp < rpe; rp++) {
1727 if (!(*res = rp =
GRN_MALLOC(orig_size *
sizeof(uint32_t)))) {
1730 if (!nreq || nreq > orig_size) { nreq = orig_size; }
1732 if (!(dp = unpack(dp, dpe,
UNIT_SIZE, rp))) {
return 0; }
1735 if (rest) {
if (!(dp = unpack(dp, dpe, rest, rp))) {
return 0; } }
1745 uint32_t df, l,
i, *rp, nreq;
1746 uint8_t *dp = data, *dpe = data + data_size;
1751 for (nreq = 0; nreq < dvlen; nreq++) {
1752 if (dv[nreq].flags &
CUT_OFF) {
break; }
1754 if (!nreq) {
return 0; }
1758 size = nreq == dvlen ? data_size : df * nreq;
1759 if (dv[dvlen].data < dv[0].data + size) {
1760 if (dv[0].data) {
GRN_FREE(dv[0].data); }
1761 if (!(rp =
GRN_MALLOC(size *
sizeof(uint32_t)))) {
return 0; }
1762 dv[dvlen].
data = rp + size;
1766 for (l = 0; l < dvlen; l++) {
1767 if (dv[l].flags &
CUT_OFF) {
break; }
1769 if (l < dvlen - 1) {
1777 uint32_t n, rest, usep = df >> 1;
1779 if (dv[dvlen -1].flags &
ODD) {
1784 size = df * nreq + (nreq == dvlen ? rest : 0);
1785 if (dv[dvlen].data < dv[0].data + size) {
1786 if (dv[0].data) {
GRN_FREE(dv[0].data); }
1787 if (!(rp =
GRN_MALLOC(size *
sizeof(uint32_t)))) {
return 0; }
1788 dv[dvlen].
data = rp + size;
1792 for (l = 0; l < dvlen; l++) {
1793 if (dv[l].flags &
CUT_OFF) {
break; }
1795 dv[l].
data_size = n = (l < dvlen - 1) ? df : df + rest;
1796 if (usep & (1 << l)) {
1798 if (!(dp = unpack(dp, dpe,
UNIT_SIZE, rp))) {
return 0; }
1802 if (!(dp = unpack(dp, dpe, n, rp))) {
return 0; }
1807 for (; n; n--, rp++) {
1815 data_size, (
long long int)(dpe - dp));
1818 return rp - dv[0].
data;
1826 *res = rp =
GRN_MALLOC(data_size *
sizeof(uint32_t) * 2);
1828 for (i = data_size, dp = data;
i; i--, dp++) {
1837 uint32_t
i, *rp, orig_size;
1840 *res = rp =
GRN_MALLOC(orig_size *
sizeof(uint32_t));
1841 for (i = orig_size;
i; i--, rp++) {
1877 inline static uint32_t
1881 uint16_t lseg = (uint16_t) (
LSEG(pos));
1886 if (b) { *b = (
buffer *)p; }
1903 inline static uint32_t
1906 uint32_t pseg, pos =
SEG2POS(seg, 0);
1907 if ((pseg = buffer_open(ctx, ii, pos, NULL, b)) !=
NOT_ASSIGNED) {
1908 uint16_t nterms = (*b)->header.nterms - (*b)->header.nterms_void;
1909 if (!((nterms < 4096 ||
1911 > (*b)->header.chunk_size) &&
1912 ((*b)->header.buffer_free >= size +
sizeof(
buffer_term)))) {
1913 buffer_close(ctx, ii, pseg);
1925 #define BUFFER_REC_DEL(r) ((r)->jump = 1)
1926 #define BUFFER_REC_DELETED(r) ((r)->jump == 1)
1928 #define BUFFER_REC_AT(b,pos) ((buffer_rec *)(b) + (pos))
1929 #define BUFFER_REC_POS(b,rec) ((uint16_t)((rec) - (buffer_rec *)(b)))
1981 if (r2->
step == i) {
1985 if (id2.
rid <
id.rid || (id2.
rid ==
id.rid && id2.
sid <=
id.sid)) {
1986 GRN_LOG(ctx,
GRN_LOG_CRIT,
"invalid jump! %d(%d:%d)(%d:%d)->%d(%d:%d)(%d:%d)", i, r->
jump, r->
step,
id.rid,
id.sid, j, r2->
jump, r2->
step, id2.
rid, id2.
sid);
1995 int i, j, max_jump = 100;
1999 if (r == r2) {
break; }
2001 if (j == (i = r->
jump)) {
break; }
2002 if (j == r->
step) {
break; }
2003 if (check_jump(ctx, ii, b, r, j)) {
2014 #define GET_NUM_BITS(x,n) do {\
2016 n = (n & 0x55555555) + ((n >> 1) & 0x55555555);\
2017 n = (n & 0x33333333) + ((n >> 2) & 0x33333333);\
2018 n = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F);\
2019 n = (n & 0x00FF00FF) + ((n >> 8) & 0x00FF00FF);\
2020 n = (n & 0x0000FFFF) + ((n >>16) & 0x0000FFFF);\
2029 docid id_curr = {0, 0}, id_start = {0, 0}, id_post = {0, 0};
2032 int vdelta = 0, delta, delta0 = 0, vhops = 0, nhops = 0, reset = 1;
2047 while (n-- && (r->
jump > 1)) {
2052 if (r != rnew) { set_jump_r(ctx, ii, b, r, last); }
2065 if (id_curr.
rid < id_post.rid ||
2066 (id_curr.
rid == id_post.rid && id_curr.
sid < id_post.sid)) {
2069 id_post.rid, id_post.sid, id_curr.
rid, id_curr.
sid);
2070 buffer_term_dump(ctx, ii, b, bt);
2076 id_post.rid = id_curr.
rid;
2077 id_post.sid = id_curr.
sid;
2079 uint16_t step = *lastp, jump = r_curr->
jump;
2080 if (u->
rid == id_curr.
rid) {
2082 while (id_curr.
rid == u->
rid) {
2084 if (!(step = r_curr->
step)) {
break; }
2094 }
else if (u->
sid == id_curr.
sid) {
2096 step = r_curr->
step;
2100 rnew->
jump = check_jump(ctx, ii, b, rnew, jump) ? 0 : jump;
2108 id_start.rid = id_curr.
rid;
2109 id_start.sid = id_curr.
sid;
2110 if (!(delta0 = u->
rid - id_start.rid)) { delta0 = u->
sid - id_start.sid; }
2113 vdelta = delta0 >> 1;
2115 if (!(delta = id_curr.
rid - id_start.rid)) { delta = id_curr.
sid - id_start.sid; }
2116 if (vdelta < delta) {
2117 vdelta += (delta0 >> ++vhops);
2120 if (nhops > vhops) {
2121 set_jump_r(ctx, ii, b, r_start, *lastp);
2128 lastp = &r_curr->
step;
2131 uint16_t posj = r_curr->
jump;
2158 inline static uint32_t *
2167 if (!p) {
return NULL; }
2171 inline static uint32_t *
2180 if (segment_get_clear(ctx, ii, &pseg)) {
return NULL; }
2185 if (!p) {
return NULL; }
2190 array_unref(
grn_ii *ii, uint32_t
id)
2213 #define GRN_II_MAX_TF 0x1ffff
2244 if (a->
tf != b->
tf) {
return a->
tf - b->
tf; }
2245 for (pa = a->
pos, pb = b->
pos; pa && pb; pa = pa->
next, pb = pb->
next) {
2248 if (pa) {
return 1; }
2249 if (pb) {
return -1; }
2266 inline static uint8_t *
2271 uint32_t lpos, tf, weight;
2292 for (lpos = 0, pp = u->
pos; pp && tf--; lpos = pp->
pos, pp = pp->
next) {
2296 while (((intptr_t)p & 0x03)) { *p++ = 0; }
2297 *size = (
unsigned int) ((p - br) +
sizeof(
buffer_rec));
2306 #ifdef CASCADE_DELETE_LEXICON
2313 if (!h) {
return 0; }
2314 if ((a = array_at(ctx, ii, tid))) {
2316 array_unref(ii, tid);
2319 array_unref(ii, tid);
2326 if (!(*u)->tf || !(*u)->sid) {
return 1; }
2335 #ifdef CASCADE_DELETE_LEXICON
2350 #define GETNEXTC() do {\
2352 uint32_t dgap = *srp++;\
2354 if (dgap) { cid.sid = 0; }\
2356 cid.tf = 1 + *stp++;\
2357 if ((ii->header->flags & GRN_OBJ_WITH_WEIGHT)) { cid.weight = *sop++; }\
2358 if ((ii->header->flags & GRN_OBJ_WITH_SECTION)) {\
2359 cid.sid += 1 + *ssp++;\
2369 #define PUTNEXT_(id) do {\
2370 uint32_t dgap = id.rid - lid.rid;\
2371 uint32_t sgap = (dgap ? id.sid : id.sid - lid.sid) - 1;\
2373 if ((ii->header->flags & GRN_OBJ_WITH_SECTION)) {\
2376 *tfp++ = id.tf - 1;\
2377 if ((ii->header->flags & GRN_OBJ_WITH_WEIGHT)) { *weightp++ = id.weight; }\
2382 #define PUTNEXTC() do {\
2385 if (lid.rid > cid.rid || (lid.rid == cid.rid && lid.sid >= cid.sid)) {\
2386 GRN_LOG(ctx, GRN_LOG_CRIT, "brokenc!! (%d:%d) -> (%d:%d)", lid.rid, lid.sid, bid.rid, bid.sid);\
2387 rc = GRN_FILE_CORRUPT;\
2391 if ((ii->header->flags & GRN_OBJ_WITH_POSITION)) {\
2393 for (i = 0; i < cid.tf; i++) {\
2399 GRN_LOG(ctx, GRN_LOG_CRIT, "invalid chunk(%d,%d)", bt->tid, cid.rid);\
2400 rc = GRN_FILE_CORRUPT;\
2407 #define GETNEXTB() do {\
2409 uint32_t lrid = bid.rid, lsid = bid.sid;\
2410 buffer_rec *br = BUFFER_REC_AT(sb, nextb);\
2411 sbp = NEXT_ADDR(br);\
2412 GRN_B_DEC(bid.rid, sbp);\
2413 if ((ii->header->flags & GRN_OBJ_WITH_SECTION)) {\
2414 GRN_B_DEC(bid.sid, sbp);\
2418 if (lrid > bid.rid || (lrid == bid.rid && lsid >= bid.sid)) {\
2419 GRN_LOG(ctx, GRN_LOG_CRIT, "brokeng!! (%d:%d) -> (%d:%d)", lrid, lsid, bid.rid, bid.sid);\
2420 rc = GRN_FILE_CORRUPT;\
2429 #define PUTNEXTB() do {\
2430 if (bid.rid && bid.sid) {\
2431 GRN_B_DEC(bid.tf, sbp);\
2433 if (lid.rid > bid.rid || (lid.rid == bid.rid && lid.sid >= bid.sid)) {\
2434 GRN_LOG(ctx, GRN_LOG_CRIT, "brokenb!! (%d:%d) -> (%d:%d)", lid.rid, lid.sid, bid.rid, bid.sid);\
2435 rc = GRN_FILE_CORRUPT;\
2438 if ((ii->header->flags & GRN_OBJ_WITH_WEIGHT)) { GRN_B_DEC(bid.weight, sbp); }\
2440 if ((ii->header->flags & GRN_OBJ_WITH_POSITION)) {\
2441 while (bid.tf--) { GRN_B_DEC(*posp, sbp); spos += *posp++; }\
2448 #define MERGE_BC(cond) do {\
2451 if (cid.rid < bid.rid) {\
2454 if (bid.rid < cid.rid) {\
2458 if (cid.sid < bid.sid) {\
2461 if (bid.sid == cid.sid) { GETNEXTC(); }\
2494 if (!(rc = chunk_new(ctx, ii, &dcn, encsize))) {
2496 memcpy(dc, enc, encsize);
2499 cinfo->
size = encsize;
2502 chunk_free(ctx, ii, dcn, 0, encsize);
2512 uint16_t *nextbp, uint8_t **sbpp,
docinfo *bidp, int32_t *balance)
2517 uint32_t segno = cinfo->
segno, size = cinfo->
size, sdf = 0, ndf = 0;
2518 uint32_t *ridp = NULL, *sidp = NULL, *tfp, *weightp = NULL, *posp = NULL;
2519 docinfo cid = {0, 0, 0, 0, 0}, lid = {0, 0, 0, 0, 0}, bid = *bidp;
2522 uint16_t nextb = *nextbp;
2523 uint32_t snn = 0, *srp, *ssp = NULL, *stp, *sop = NULL, *snp;
2524 uint8_t *sbp = *sbpp;
2527 datavec_init(ctx, rdv, ii->
n_elements, 0, 0);
2536 srp = rdv[j++].
data;
2538 stp = rdv[j++].
data;
2546 ridp = dv[j++].
data;
2558 ndf = ridp - dv[0].
data;
2560 datavec_fin(ctx, rdv);
2570 uint32_t f_s = (ndf < 3) ? 0 :
USE_P_ENC;
2571 uint32_t f_d = ((ndf < 16) || (ndf <= (lid.rid >> 8))) ? 0 :
USE_P_ENC;
2581 uint32_t f_p = ((np < 32) || (np <= (spos >> 13))) ? 0 :
USE_P_ENC;
2584 if ((enc =
GRN_MALLOC((ndf * 4 + np) * 2))) {
2586 if (!(rc = chunk_flush(ctx, ii, cinfo, enc, encsize))) {
2587 chunk_free(ctx, ii, segno, 0, size);
2594 *balance += (ndf - sdf);
2604 uint8_t *sbp = NULL, *dcp = dc;
2610 size_t totalsize = unitsize * ii->
n_elements;
2612 if ((rc = datavec_init(ctx, dv, ii->
n_elements, unitsize, totalsize))) {
2615 datavec_init(ctx, rdv, ii->
n_elements, 0, 0);
2619 for (bt = db->
terms; n; n--, bt++) {
2622 int32_t balance = 0;
2623 uint32_t *ridp, *sidp = NULL, *tfp, *weightp = NULL, *posp, nchunks = 0;
2626 docinfo cid = {0, 0, 0, 0, 0}, lid = {0, 0, 0, 0, 0}, bid = {0, 0};
2627 uint32_t sdf = 0, snn = 0, ndf;
2628 uint32_t *srp = NULL, *ssp = NULL, *stp = NULL, *sop = NULL, *snp = NULL;
2652 datavec_fin(ctx, dv);
2653 datavec_fin(ctx, rdv);
2656 for (i = 0; i < nchunks; i++) {
2660 crid += cinfo[
i].
dgap;
2661 if (bid.rid <= crid) {
2662 rc = chunk_merge(ctx, ii, sb, bt, &cinfo[i], crid, dv,
2663 &nextb, &sbp, &bid, &balance);
2665 datavec_fin(ctx, dv);
2666 datavec_fin(ctx, rdv);
2677 srp = rdv[j++].
data;
2679 stp = rdv[j++].
data;
2685 datavec_fin(ctx, dv);
2686 datavec_fin(ctx, rdv);
2693 ridp = dv[j++].
data;
2702 ndf = ridp - dv[0].
data;
2736 uint32_t *a = array_at(ctx, ii, tid);
2742 if (!ndf && !nchunks) {
2745 lexicon_delete(ctx, ii, tid, h);
2749 && !nchunks && ndf == 1 && lid.rid < 0x100000 &&
2750 lid.sid < 0x800 && lid.tf == 1 && lid.weight == 0) {
2751 a[0] = (lid.rid << 12) + (lid.sid << 1) + 1;
2756 && !nchunks && ndf == 1 && lid.tf == 1 && lid.weight == 0) {
2757 a[0] = (lid.rid << 1) + 1;
2765 uint32_t f_s = (ndf < 3) ? 0 :
USE_P_ENC;
2766 uint32_t f_d = ((ndf < 16) || (ndf <= (lid.rid >> 8))) ? 0 :
USE_P_ENC;
2777 uint32_t f_p = ((np < 32) || (np <= (spos >> 13))) ? 0 :
USE_P_ENC;
2781 a[1] = (bt->
size_in_chunk ? a[1] : 0) + (ndf - sdf) + balance;
2785 for (i = 0; i < nchunks; i++) {
2795 char buf[255], *bufp;
2799 (
long long int)(dcp - dc), encsize, (
long long int)((dcp - dc) + encsize));
2802 j, rdv[j].data_size, rdv[j].flags);
2803 for (i = 0, bufp = buf; i < rdv[j].
data_size;) {
2804 bufp += sprintf(bufp,
" %d", rdv[j].data[i]);
2806 if (!(i % 32) || i == rdv[j].data_size) {
2815 j, dv[j].data_size, dv[j].flags);
2816 for (i = 0, bufp = buf; i < dv[j].
data_size;) {
2817 bufp += sprintf(bufp,
" %d", dv[j].data[i]);
2819 if (!(i % 32) || i == dv[j].data_size) {
2830 !chunk_flush(ctx, ii, &cinfo[nchunks], dcp, encsize)) {
2832 cinfo[nchunks].
dgap = lid.rid - crid;
2836 for (i = 0; i < nchunks; i++) {
2851 array_unref(ii, tid);
2856 datavec_fin(ctx, rdv);
2857 datavec_fin(ctx, dv);
2872 iw->
segment = ((seg) >> GRN_II_N_CHUNK_VARIATION);
2885 uint8_t *dc, *sc = NULL;
2886 uint32_t ds, pseg, scn, dcn = 0;
2889 pseg = buffer_open(ctx, ii,
SEG2POS(seg, 0), NULL, &sb);
2893 uint32_t actual_chunk_size = 0;
2895 if ((dc =
GRN_MALLOC(max_dest_chunk_size * 2))) {
2903 if (!(rc = buffer_merge(ctx, ii, seg, h, sb, sc, db, dc))) {
2905 if (actual_chunk_size >= max_dest_chunk_size) {
2907 actual_chunk_size, max_dest_chunk_size);
2909 if (!actual_chunk_size || !(rc = chunk_new(ctx, ii, &dcn, actual_chunk_size))) {
2911 fake_map2(ctx, ii->
chunk, &dw, dc, dcn, actual_chunk_size);
2913 buffer_segment_update(ii, seg, ds);
2922 if (actual_chunk_size) {
2923 chunk_free(ctx, ii, dcn, 0, actual_chunk_size);
2946 buffer_close(ctx, ii, pseg);
2960 uint32_t pseg, scn, nterms_with_corrupt_chunk = 0, nterm_with_chunk = 0;
2961 uint32_t ndeleted_terms_with_value = 0;
2963 uint8_t *sbp = NULL;
2966 int nterms_void = 0;
2967 int size_in_buffer = 0;
2970 int64_t nloops = 0, nviolations = 0;
2975 pseg = buffer_open(ctx, ii,
SEG2POS(seg, 0), NULL, &sb);
2983 datavec_init(ctx, rdv, ii->
n_elements, 0, 0);
3011 uint32_t nchunks = 0;
3015 uint32_t sdf = 0, snn = 0;
3016 uint32_t *srp = NULL, *ssp = NULL, *stp = NULL, *sop = NULL, *snp = NULL;
3032 ndeleted_terms_with_value++;
3045 datavec_fin(ctx, rdv);
3049 for (i = 0; i < nchunks; i++) {
3053 crid += cinfo[
i].
dgap;
3062 srp = rdv[j++].
data;
3064 if (sdf != rdv[j].data_size) {
3065 nterms_with_corrupt_chunk++;
3067 stp = rdv[j++].
data;
3078 grn_id rid, sid, rid_ = 0, sid_ = 0;
3082 if (pos < lower_bound) {
3093 if (rid < rid_ || (rid == rid_ && sid < sid_)) {
3118 if (nterms_with_corrupt_chunk) {
3122 if (ndeleted_terms_with_value) {
3135 datavec_fin(ctx, rdv);
3137 buffer_close(ctx, ii, pseg);
3147 term_compar(
const void *t1,
const void *t2)
3152 return (r = memcmp(x->
key, y->key, y->key_size)) ? r : x->
key_size - y->key_size;
3174 qsort(ts, i,
sizeof(
term_sort), term_compar);
3178 for (s = 0; n + 1 < i && s <= th; n++, bt++) {
3186 for (; n <
i; n++, bt++) {
3204 if ((a = array_at(ctx, ii, tid))) {
3206 array_unref(ii, tid);
3220 buffer *sb, *db0 = NULL, *db1 = NULL;
3221 uint8_t *sc = NULL, *dc0, *dc1;
3222 uint32_t dps0, dps1, dls0, dls1, sps, scn, dcn0 = 0, dcn1 = 0;
3224 if ((rc = buffer_segment_reserve(ctx, ii, &dls0, &dps0, &dls1, &dps1))) {
3227 sps = buffer_open(ctx, ii,
SEG2POS(seg, 0), NULL, &sb);
3233 uint32_t actual_db0_chunk_size = 0;
3234 uint32_t actual_db1_chunk_size = 0;
3236 if ((dc0 =
GRN_MALLOC(max_dest_chunk_size * 2))) {
3237 if ((dc1 =
GRN_MALLOC(max_dest_chunk_size * 2))) {
3241 term_split(ctx, ii->
lexicon, sb, db0, db1);
3242 if (!(rc = buffer_merge(ctx, ii, seg, h, sb, sc, db0, dc0))) {
3244 if (actual_db0_chunk_size >= max_dest_chunk_size) {
3246 "actual_db0_chunk_size(%d) >= max_dest_chunk_size(%d)",
3247 actual_db0_chunk_size, max_dest_chunk_size);
3249 if (!actual_db0_chunk_size ||
3250 !(rc = chunk_new(ctx, ii, &dcn0, actual_db0_chunk_size))) {
3252 fake_map2(ctx, ii->
chunk, &dw0, dc0, dcn0, actual_db0_chunk_size);
3254 if (!(rc = buffer_merge(ctx, ii, seg, h, sb, sc, db1, dc1))) {
3255 actual_db1_chunk_size = db1->header.chunk_size;
3256 if (actual_db1_chunk_size >= max_dest_chunk_size) {
3258 "actual_db1_chunk_size(%d) >= max_dest_chunk_size(%d)",
3259 actual_db1_chunk_size, max_dest_chunk_size);
3261 if (!actual_db1_chunk_size ||
3262 !(rc = chunk_new(ctx, ii, &dcn1, actual_db1_chunk_size))) {
3263 fake_map2(ctx, ii->
chunk, &dw1, dc1, dcn1, actual_db1_chunk_size);
3265 db1->header.chunk = actual_db1_chunk_size ? dcn1 :
NOT_ASSIGNED;
3266 buffer_segment_update(ii, dls0, dps0);
3267 buffer_segment_update(ii, dls1, dps1);
3268 array_update(ctx, ii, dls0, db0);
3269 array_update(ctx, ii, dls1, db1);
3270 buffer_segment_clear(ii, seg);
3279 if (actual_db1_chunk_size) {
3280 chunk_free(ctx, ii, dcn1, 0, actual_db1_chunk_size);
3282 if (actual_db0_chunk_size) {
3283 chunk_free(ctx, ii, dcn0, 0, actual_db0_chunk_size);
3289 if (actual_db0_chunk_size) {
3290 chunk_free(ctx, ii, dcn0, 0, actual_db0_chunk_size);
3296 if (actual_db0_chunk_size) {
3297 chunk_free(ctx, ii, dcn0, 0, actual_db0_chunk_size);
3303 if (actual_db0_chunk_size) {
3304 chunk_free(ctx, ii, dcn0, 0, actual_db0_chunk_size);
3340 buffer_close(ctx, ii, sps);
3347 #define SCALE_FACTOR 2048
3348 #define MAX_NTERMS 8192
3349 #define SPLIT_COND (b->header.nterms > 1024 ||\
3350 (b->header.nterms > 1 &&\
3351 b->header.chunk_size * 100 > ii->header->total_chunk_size))
3353 inline static uint32_t
3354 buffer_new(
grn_ctx *ctx,
grn_ii *ii,
int size, uint32_t *pos,
3380 if ((a = array_at(ctx, ii, tid))) {
3382 uint32_t pos = a[0];
3383 if (!pos || (pos & 1)) {
break; }
3384 if ((pseg = buffer_open(ctx, ii, pos, NULL, &b)) ==
NOT_ASSIGNED) {
break; }
3389 buffer_close(ctx, ii, pseg);
3400 if (buffer_split(ctx, ii,
LSEG(pos), h)) {
break; }
3402 if (buffer_flush(ctx, ii,
LSEG(pos), h)) {
break; }
3405 array_unref(ii, tid);
3411 if (buffer_segment_new(ctx, ii, &lseg) ||
3420 for (offset = 0; offset < b->
header.
nterms; offset++) {
3421 if (!b->
terms[offset].
tid) {
break; }
3437 *bt = &b->
terms[offset];
3464 if (path && strlen(path) + 6 >=
PATH_MAX) {
return NULL; }
3467 if (!seg) {
return NULL; }
3469 strcpy(path2, path);
3470 strcat(path2,
".c");
3512 if (!_grn_ii_create(ctx, ii, path, lexicon, flags)) {
3526 snprintf(buffer,
PATH_MAX,
"%s.c", path);
3536 const char *io_segpath, *io_chunkpath;
3537 char *segpath, *chunkpath = NULL;
3540 if ((io_segpath =
grn_io_path(ii->
seg)) && *io_segpath !=
'\0') {
3546 if (!(chunkpath =
GRN_STRDUP(io_chunkpath))) {
3562 if (segpath && (rc =
grn_io_remove(ctx, segpath))) {
goto exit; }
3563 if (chunkpath && (rc =
grn_io_remove(ctx, chunkpath))) {
goto exit; }
3564 if (!_grn_ii_create(ctx, ii, segpath, lexicon, flags)) {
3568 if (segpath) {
GRN_FREE(segpath); }
3569 if (chunkpath) {
GRN_FREE(chunkpath); }
3586 if (strlen(path) + 6 >=
PATH_MAX) {
return NULL; }
3587 strcpy(path2, path);
3588 strcat(path2,
".c");
3590 if (!seg) {
return NULL; }
3672 #define BIT11_01(x) ((x >> 1) & 0x7ff)
3673 #define BIT31_12(x) (x >> 12)
3683 uint32_t pseg = 0, pos = 0, size, *a;
3684 if (!tid) {
return rc; }
3688 if (!(bs = encode_rec(ctx, ii, u, &size, 0))) {
3695 if ((pseg = buffer_open(ctx, ii, pos, &bt, &b)) ==
NOT_ASSIGNED) {
3703 buffer_close(ctx, ii, pseg);
3714 if ((rc = buffer_split(ctx, ii,
LSEG(pos), h))) {
goto exit; }
3717 if ((rc = buffer_flush(ctx, ii,
LSEG(pos), h))) {
goto exit; }
3722 if ((pseg = buffer_open(ctx, ii, pos, &bt, &b)) ==
NOT_ASSIGNED) {
3731 buffer_close(ctx, ii, pseg);
3744 uint32_t size2 = 0, v = a[0];
3759 uint8_t *bs2 = encode_rec(ctx, ii, &u2, &size2, 0);
3765 pseg = buffer_new(ctx, ii, size + size2, &pos, &bt, &br, &b, tid, h);
3775 if ((rc = buffer_put(ctx, ii, b, bt, br, bs2, &u2, size2))) {
3777 buffer_close(ctx, ii, pseg);
3788 if (u->
tf == 1 && u->
weight == 0) {
3790 if (u->
rid < 0x100000 && u->
sid < 0x800) {
3791 a[0] = (u->
rid << 12) + (u->
sid << 1) + 1;
3796 a[0] = (u->
rid << 1) + 1;
3801 pseg = buffer_new(ctx, ii, size, &pos, &bt, &br, &b, tid, h);
3809 rc = buffer_put(ctx, ii, b, bt, br, bs, u, size);
3810 buffer_close(ctx, ii, pseg);
3811 if (!a[0] || (a[0] & 1)) { a[0] =
pos; }
3813 array_unref(ii, tid);
3815 if (u->
tf != u->
atf) {
3821 "too many postings(%d). %d postings are discarded. "
3822 "term: <%d>(<%.*s>)",
3824 tid, term_size, term);
3838 uint32_t pseg, size, *a;
3839 if (!tid) {
return rc; }
3842 if (!a[0]) {
goto exit; }
3847 if (u->
rid == rid && (!u->
sid || u->
sid == sid)) {
3849 lexicon_delete(ctx, ii, tid, h);
3852 uint32_t rid = a[0] >> 1;
3853 if (u->
rid == rid) {
3855 lexicon_delete(ctx, ii, tid, h);
3860 if (!(bs = encode_rec(ctx, ii, u, &size, 1))) {
3864 if ((pseg = buffer_open(ctx, ii, a[0], &bt, &b)) ==
NOT_ASSIGNED) {
3871 buffer_close(ctx, ii, pseg);
3872 if ((rc = buffer_flush(ctx, ii,
LSEG(a[0]), h))) {
goto exit; }
3877 if ((pseg = buffer_open(ctx, ii, a[0], &bt, &b)) ==
NOT_ASSIGNED) {
3886 buffer_close(ctx, ii, pseg);
3893 rc = buffer_put(ctx, ii, b, bt, br, bs, u, size);
3894 buffer_close(ctx, ii, pseg);
3898 array_unref(ii, tid);
3903 #define CHUNK_USED 1
3904 #define BUFFER_USED 2
3905 #define SOLE_DOC_USED 4
3906 #define SOLE_POS_USED 8
3964 uint32_t
i, m, gseg;
3965 if (size >
S_CHUNK) {
return 1; }
3977 if (!ginfo) {
break; }
3978 for (i = 0; i < ginfo->
nrecs; i++) {
3979 if (ginfo->
recs[i] == offset) {
3992 #define GRN_II_CURSOR_CMP(c1,c2) \
3993 (((c1)->post->rid > (c2)->post->rid) || \
3994 (((c1)->post->rid == (c2)->post->rid) && \
3995 (((c1)->post->sid > (c2)->post->sid) || \
3996 (((c1)->post->sid == (c2)->post->sid) && \
3997 ((c1)->post->pos > (c2)->post->pos)))))
4005 if (!(a = array_at(ctx, ii, tid))) {
return NULL; }
4007 if (!(pos = a[0])) {
goto exit; }
4023 c->
pb.
rid = pos >> 1;
4046 if (buffer_is_reused(ctx, ii, c)) {
4085 if (pos == a[0]) {
break; }
4089 array_unref(ii, tid);
4098 uint32_t pos, *a = array_at(ctx, ii, tid);
4099 if (!a) {
return NULL; }
4100 if (!(pos = a[0])) {
goto exit; }
4110 c->
pb.
rid = pos >> 1;
4133 array_unref(ii, tid);
4145 for (i = 0; i < ncursors; i++) {
4152 for (i = 0; i < ncursors; i++) {
4174 uint32_t dgap = *c->
crp++;
4176 if (dgap) { c->
pc.
sid = 0; }
4217 if (c->
cp < c->
cpe) {
4232 if (chunk_is_reused(ctx, c->
ii, c,
4235 "chunk(%d) is reused by another thread",
4274 if (buffer_is_reused(ctx, c->
ii, c)) {
4365 }
else if (c->
post == &c->
pb) {
4366 if (buffer_is_reused(ctx, c->
ii, c)) {
4402 datavec_fin(ctx, c->
rdv);
4413 uint32_t res, pos, *a;
4414 a = array_at(ctx, ii, tid);
4415 if (!a) {
return 0; }
4423 if ((pseg = buffer_open(ctx, ii, pos, &bt, &buf)) ==
NOT_ASSIGNED) {
4427 buffer_close(ctx, ii, pseg);
4433 array_unref(ii, tid);
4440 uint32_t res, pos, *a;
4441 a = array_at(ctx, ii, tid);
4442 if (!a) {
return 0; }
4450 if ((pseg = buffer_open(ctx, ii, pos, &bt, &buf)) ==
NOT_ASSIGNED) {
4454 buffer_close(ctx, ii, pseg);
4460 array_unref(ii, tid);
4466 unsigned int *chunk,
unsigned int *chunk_size,
unsigned int *buffer_free,
4467 unsigned int *nterms,
unsigned int *nterms_void,
unsigned int *bt_tid,
4468 unsigned int *size_in_chunk,
unsigned int *pos_in_chunk,
4469 unsigned int *size_in_buffer,
unsigned int *pos_in_buffer)
4475 ap = array_at(ctx, ii, tid);
4476 if (!ap) {
return 0; }
4478 array_unref(ii, tid);
4479 if (!a[0]) {
return 1; }
4480 if (a[0] & 1) {
return 2; }
4481 if ((pseg = buffer_open(ctx, ii, a[0], &bt, &b)) ==
NOT_ASSIGNED) {
return 3; }
4491 buffer_close(ctx, ii, pseg);
4524 cursor_heap_open(
grn_ctx *ctx,
int max)
4527 if (!h) {
return NULL; }
4552 if (grn_aio_enabled) {
4593 if (grn_aio_enabled) {
4599 for (i = 0, j = 0; i < h->
n_entries; i++) {
4636 int n = 0, n1, n2, m;
4642 c1 = n1 < m ? h->
bins[n1] : NULL;
4643 c2 = n2 < m ? h->
bins[n2] : NULL;
4678 if (h->
n_entries > 1) { cursor_heap_recalc_min(h); }
4697 if (h->
n_entries > 1) { cursor_heap_recalc_min(h); }
4716 const char *value,
size_t value_len)
4719 unsigned int token_flags = 0;
4724 grn_vgram_buf *sbuf = NULL;
4730 if (vgram) { sbuf = grn_vgram_buf_open(value_len); }
4735 if (sbuf) { grn_vgram_buf_close(sbuf); }
4752 if (sbuf) { grn_vgram_buf_add(sbuf, tid); }
4763 if (sbuf) { grn_vgram_buf_close(sbuf); }
4768 if (sbuf) { grn_vgram_buf_close(sbuf); }
4774 const char *value,
size_t value_len)
4777 unsigned int token_flags = 0;
4818 const char *oldvalue,
unsigned int oldvalue_len,
4819 const char *newvalue,
unsigned int newvalue_len)
4824 if (oldvalue && *oldvalue) {
4825 if ((rc = index_del(ctx, rid, lexicon, ii, vgram, oldvalue, oldvalue_len))) {
4830 if (newvalue && *newvalue) {
4831 rc = index_add(ctx, rid, lexicon, ii, vgram, newvalue, newvalue_len);
4838 grn_ii_update(
grn_ctx *ctx,
grn_ii *ii,
grn_id rid, grn_vgram *vgram,
unsigned int section,
4839 grn_values *oldvalues, grn_values *newvalues)
4843 unsigned int token_flags = 0;
4850 if (!lexicon || !ii || !rid) {
4861 for (j = newvalues->n_values, v = newvalues->values; j; j--, v++) {
4905 for (j = oldvalues->n_values, v = oldvalues->values; j; j--, v++) {
4984 for (j = in->
u.
v.n_sections, v = in->
u.
v.sections; j; j--, v++) {
4985 unsigned int token_flags = 0;
4988 mode, token_flags))) {
5025 for (j = 0; rp < re; j++, rp++) {
5051 grn_obj *old_, *old = oldvalue, *new_, *
new = newvalue, oldv, newv, buf, *post = NULL;
5052 if (!ii || !ii->
lexicon || !rid) {
5073 newv.u.v.body =
new;
5088 rc = grn_vector2updspecs(ctx, ii, rid, section, new_,
new,
GRN_TOKEN_ADD, post);
5091 if (rc) {
goto exit; }
5102 rc = grn_uvector2updspecs(ctx, ii, rid, section, new_,
new);
5105 if (rc) {
goto exit; }
5116 uint32_t offset = 0;
5117 grn_id tid_ = 0, gap, tid, *tpe;
5138 GRN_TEXT_PUT(ctx, posting, &(*u)->offset,
sizeof(int32_t));
5155 oldv.u.v.body = old;
5170 rc = grn_vector2updspecs(ctx, ii, rid, section, old_, old,
GRN_TOKEN_DEL, NULL);
5173 if (rc) {
goto exit; }
5184 rc = grn_uvector2updspecs(ctx, ii, rid, section, old_, old);
5187 if (rc) {
goto exit; }
5250 const char *key,
unsigned int key_size,
token_info *ti)
5268 if (!key2) {
break; }
5273 cursor_heap_push(ctx, ti->
cursors, ii, *tp, 0);
5282 cursor_heap_push(ctx, ti->
cursors, ii, *tq, 0);
5302 cursor_heap_close(ctx, ti->
cursors);
5309 const char *key,
unsigned int key_size, uint32_t offset,
int mode)
5316 if (!key) {
return NULL; }
5324 token_info_expand_both(ctx, lexicon, ii, key, key_size, ti);
5329 (ti->
cursors = cursor_heap_open(ctx, 1))) {
5330 cursor_heap_push(ctx, ti->
cursors, ii, tid, 0);
5343 cursor_heap_push(ctx, ti->
cursors, ii, *tp, 0);
5362 cursor_heap_push(ctx, ti->
cursors, ii, *tp, 0);
5373 if (cursor_heap_push2(ti->
cursors)) {
5374 token_info_close(ctx, ti);
5384 token_info_close(ctx, ti);
5399 if (p->
rid > rid || (p->
rid == rid && p->
sid >= sid)) {
break; }
5400 cursor_heap_pop(ctx, ti->
cursors);
5408 token_info_skip_pos(
grn_ctx *ctx,
token_info *ti, uint32_t rid, uint32_t sid, uint32_t pos)
5416 if (p->
rid != rid || p->
sid != sid || p->
pos >= pos) {
break; }
5417 cursor_heap_pop_pos(ctx, ti->
cursors);
5425 token_compare(
const void *a,
const void *b)
5428 return t1->
size - t2->size;
5432 token_info_build(
grn_ctx *ctx,
grn_obj *lexicon,
grn_ii *ii,
const char *
string,
unsigned int string_len,
5444 if ((ti = token_info_open(ctx, lexicon, ii, (
char *)token->
orig, token->
orig_blen, 0,
EX_BOTH))) {
5470 ti = token_info_open(ctx, lexicon, ii, key, size, token->
pos, ef &
EX_SUFFIX);
5473 ti = token_info_open(ctx, lexicon, ii, (
const char *)token->
curr,
5483 ti = token_info_open(ctx, lexicon, ii, (
char *)token->
orig,
5489 if (!ti) {
goto exit ; }
5496 ti = token_info_open(ctx, lexicon, ii, key, size, token->
pos,
EX_NONE);
5501 ti = token_info_open(ctx, lexicon, ii, key, size, token->
pos, ef &
EX_PREFIX);
5505 ti = token_info_open(ctx, lexicon, ii, (
char *)token->
curr,
5509 if (!ti) {
goto exit; }
5520 token_info_clear_offset(
token_info **tis, uint32_t n)
5523 for (tie = tis + n; tis < tie; tis++) { (*tis)->
offset = 0; }
5608 bt_open(
grn_ctx *ctx,
int size)
5624 if (!bt) {
return; }
5632 int pos = ti->
pos, minp = 1, maxp = 1;
5634 new = bt->
nodes + bt->
n++;
5638 for (last = &bt->
root; (node = *last);) {
5639 if (pos < node->ti->
pos) {
5648 if (minp) { bt->
min = ti; }
5649 if (maxp) { bt->
max = ti; }
5656 for (last = &bt->
root; (min = *last) && min->
car; last = &min->
car) ;
5658 int pos = min->
ti->
pos, minp = 1, maxp = 1;
5661 for (last = &bt->
root; (node = *last);) {
5662 if (pos < node->ti->
pos) {
5671 if (maxp) { bt->
max = min->
ti; }
5673 for (newmin = bt->
root; newmin->
car; newmin = newmin->
car) ;
5674 bt->
min = newmin->
ti;
5707 return optarg->
func(ctx, (
void *)s, (
void *)(intptr_t)rid, sid, optarg->
func_arg);
5717 const char *
string,
unsigned int string_len,
5721 grn_id tid, *tp, max_size;
5727 if (!lexicon || !ii || !
string || !string_len || !s || !optarg) {
return GRN_INVALID_ARGUMENT; }
5736 if (!(max_size = optarg->
max_size)) { max_size = 1048576; }
5764 *w1 += max_size / es;
5799 for (j = 1; j <= limit; j++) {
5812 if ((w2 = get_weight(ctx, s, pos->
rid, pos->
sid, wvm, optarg))) {
5821 if ((w2 = get_weight(ctx, s, pos->
rid, pos->
sid, wvm, optarg))) {
5836 #define TERM_EXTRACT_EACH_POST 0
5837 #define TERM_EXTRACT_EACH_TERM 1
5841 unsigned int string_len,
grn_hash *s,
5848 const char *normalized;
5849 unsigned int normalized_length_in_bytes;
5852 int skip, rep, policy;
5855 if (!ii || !
string || !string_len || !s || !optarg) {
5876 for (p = normalized, pe = p + normalized_length_in_bytes; p < pe; p += skip) {
5881 if (!(skip = (
int)
grn_charlen(ctx, p, pe))) {
break; }
5895 get_weight(ctx, s, pos->
rid, pos->
sid, wvm, optarg), op);
5902 pi.
sid = p - normalized;
5903 res_add(ctx, s, &pi, pi.
sid + 1, op);
5907 get_weight(ctx, s, pos->
rid, pos->
sid, wvm, optarg), op);
5928 int rep, orp, weight, max_interval = 0;
5930 uint32_t n = 0, rid, sid, nrid, nsid;
5936 mode = optarg->
mode;
5955 if (!string_len) {
goto exit; }
5959 if (token_info_build(ctx, lexicon, ii,
string, string_len, tis, &n, mode) || !n) {
goto exit; }
5962 token_info_clear_offset(tis, n);
5972 qsort(tis, n,
sizeof(
token_info *), token_compare);
6001 rid = (*tis)->p->rid;
6002 sid = (*tis)->p->sid;
6003 for (tip = tis + 1, nrid = rid, nsid = sid + 1; tip < tie; tip++) {
6005 if (token_info_skip(ctx, ti, rid, sid)) {
goto exit; }
6006 if (ti->
p->
rid != rid || ti->
p->
sid != sid) {
6012 weight = get_weight(ctx, s, rid, sid, wvm, optarg);
6013 if (tip == tie && weight) {
6016 int count = 0, noccur = 0, pos = 0, score = 0, tscore = 0, min, max;
6018 #define SKIP_OR_BREAK(pos) {\
6019 if (token_info_skip_pos(ctx, ti, rid, sid, pos)) { break; } \
6020 if (ti->p->rid != rid || ti->p->sid != sid) { \
6021 nrid = ti->p->rid; \
6022 nsid = ti->p->sid; \
6026 if (n == 1 && !rep) {
6027 noccur = (*tis)->p->tf;
6028 tscore = (*tis)->p->weight;
6031 for (tip = tis; tip < tie; tip++) {
6039 if (min > max) { exit(0); }
6040 if (max - min <= max_interval) {
6041 if (rep) { pi.
pos = min; res_add(ctx, s, &pi, weight, op); }
6043 if (ti->
pos == max + 1) {
6048 if (ti->
pos == max - max_interval) {
6057 for (tip = tis; ; tip++) {
6058 if (tip == tie) { tip = tis; }
6061 if (ti->
pos == pos) {
6062 score += ti->
p->
weight; count++;
6064 score = ti->
p->
weight; count = 1; pos = ti->
pos;
6067 if (rep) { pi.
pos = pos; res_add(ctx, s, &pi, (score + 1) * weight, op); }
6069 score = 0; count = 0; pos++;
6074 if (noccur && !rep) { res_add(ctx, s, &pi, (noccur + tscore) * weight, op); }
6075 #undef SKIP_OR_BREAK
6078 if (token_info_skip(ctx, *tis, nrid, nsid)) {
goto exit; }
6081 for (tip = tis; tip < tis + n; tip++) {
6082 if (*tip) { token_info_close(ctx, *tip); }
6092 for (; segno; segno--, info++) {
if (info->
nref) { nnref++; } }
6109 switch (optarg->
mode) {
6129 if (
grn_ii_select(ctx, ii,
string, string_len, s, op, &arg)) {
6137 if (
grn_ii_select(ctx, ii,
string, string_len, s, op, &arg)) {
6145 if (
grn_ii_select(ctx, ii,
string, string_len, s, op, &arg)) {
6204 uint32_t dgap = *c->
crp++;
6206 if (dgap) { c->
pc.
sid = 0; }
6247 if (c->
cp < c->
cpe) {
6296 if (buffer_is_reused(ctx, c->
ii, c)) {
6396 while (grn_ii_cursor_next_all(ctx, c)) {
6403 if (pos->
tf && pos->
sid) {
6457 #ifdef II_BUFFER_ORDER_BY_ID
6533 if (!(ii_buffer->nblocks & 0x3ff)) {
6536 (ii_buffer->nblocks + 0x400) *
6540 ii_buffer->blocks = blocks;
6542 block = &ii_buffer->blocks[ii_buffer->nblocks];
6543 block->
head = ii_buffer->filepos;
6553 size_t bufsize = 0, bufsize_ = 0;
6554 uint32_t flags = ii_buffer->ii->
header->flags;
6557 for (tid = 1; tid <= tid_max; counter++, tid++) {
6565 if ((flags & GRN_OBJ_WITH_SECTION)) {
6569 if ((flags & GRN_OBJ_WITH_WEIGHT)) {
6575 if (bufsize_ + II_BUFFER_BLOCK_READ_UNIT_SIZE < bufsize) {
6576 bufsize +=
sizeof(uint32_t);
6581 ii_buffer->nblocks, bufsize);
6590 uint8_t *outbufp = outbuf;
6591 uint8_t *outbufp_ = outbuf;
6593 uint8_t *pnext = (uint8_t *)&block->
nextsize;
6594 uint32_t flags = ii_buffer->ii->
header->flags;
6596 NULL, 0, NULL, 0, 0, -1, II_BUFFER_ORDER);
6603 if (counter->
nrecs) {
6606 uint32_t offset_tf = counter->
offset_tf;
6612 ii_buffer->total_size += counter->
nrecs + counter->
nposts;
6614 outbufp += offset_rid;
6615 if ((flags & GRN_OBJ_WITH_SECTION)) {
6617 outbufp += offset_sid;
6620 outbufp += offset_tf;
6621 if ((flags & GRN_OBJ_WITH_WEIGHT)) {
6623 outbufp += offset_weight;
6625 if ((flags & GRN_OBJ_WITH_POSITION)) {
6627 outbufp += offset_pos;
6630 if (outbufp_ + II_BUFFER_BLOCK_READ_UNIT_SIZE < outbufp) {
6631 uint32_t size = outbufp - outbufp_ +
sizeof(uint32_t);
6632 memcpy(pnext, &size,
sizeof(uint32_t));
6634 outbufp +=
sizeof(uint32_t);
6639 if (outbufp_ < outbufp) {
6640 uint32_t size = outbufp - outbufp_;
6641 memcpy(pnext, &size,
sizeof(uint32_t));
6643 return outbufp - outbuf;
6650 unsigned int sid = 1;
6651 unsigned int weight = 0;
6654 grn_id *bp = ii_buffer->block_buf;
6655 uint32_t flags = ii_buffer->ii->
header->flags;
6656 for (rest = ii_buffer->block_pos; rest; bp++, rest--) {
6658 if (
id & II_BUFFER_RID_FLAG) {
6660 if ((flags & GRN_OBJ_WITH_SECTION) && rest) {
6666 }
else if (
id & II_BUFFER_WEIGHT_FLAG) {
6675 uint8_t *p = outbuf + counter->
offset_tf;
6678 if (flags & GRN_OBJ_WITH_WEIGHT) {
6689 if (flags & GRN_OBJ_WITH_SECTION) {
6704 if (flags & GRN_OBJ_WITH_POSITION) {
6720 for (tid = 1; tid <= tid_max; counter++, tid++) {
6721 uint8_t *p = outbuf + counter->
offset_tf;
6724 if ((ii_buffer->ii->
header->flags & GRN_OBJ_WITH_WEIGHT)) {
6725 for (tid = 1; tid <= tid_max; counter++, tid++) {
6739 ii_buffer->nblocks, ii_buffer->block_pos);
6740 if (!(block = block_new(ctx, ii_buffer))) {
return; }
6741 if (!(outbuf = allocate_outbuf(ctx, ii_buffer))) {
return; }
6742 encsize = encode_terms(ctx, ii_buffer, outbuf, block);
6743 encode_postings(ctx, ii_buffer, outbuf);
6744 encode_last_tf(ctx, ii_buffer, outbuf);
6746 ssize_t r =
GRN_WRITE(ii_buffer->tmpfd, outbuf, encsize);
6749 (
long long int)r, (
unsigned long long int)encsize);
6752 ii_buffer->filepos += r;
6753 block->
tail = ii_buffer->filepos;
6756 memset(ii_buffer->counters, 0,
6761 ii_buffer->nblocks, encsize);
6762 ii_buffer->tmp_lexicon = NULL;
6763 ii_buffer->nblocks++;
6764 ii_buffer->block_pos = 0;
6772 grn_obj *tmp_lexicon = ii_buffer->tmp_lexicon;
6780 &tokenizer, &normalizer);
6784 ii_buffer->tmp_lexicon = tmp_lexicon;
6801 if (tid > ii_buffer->ncounters) {
6803 uint32_t ncounters =
6807 if (!counters) {
return NULL; }
6808 memset(&counters[ii_buffer->ncounters], 0,
6810 ii_buffer->ncounters = ncounters;
6811 ii_buffer->counters = counters;
6813 return &ii_buffer->counters[tid - 1];
6818 unsigned int sid,
unsigned int weight,
6819 const char *value, uint32_t value_len)
6823 uint32_t est_len = value_len + 2;
6824 if (ii_buffer->block_buf_size < ii_buffer->block_pos + est_len) {
6825 grn_ii_buffer_flush(ctx, ii_buffer);
6827 if (ii_buffer->block_buf_size < est_len) {
6829 est_len *
sizeof(
grn_id));
6830 if (!block_buf) {
return; }
6831 ii_buffer->block_buf = block_buf;
6832 ii_buffer->block_buf_size = est_len;
6834 if ((tmp_lexicon = get_tmp_lexicon(ctx, ii_buffer))) {
6835 unsigned int token_flags = 0;
6838 uint32_t block_pos = ii_buffer->block_pos;
6840 if ((ii_buffer->ii->
header->flags & GRN_OBJ_WITH_SECTION)) {
6841 buffer[block_pos++] = sid;
6849 for (pos = 0; !token->
status; pos++) {
6853 counter = get_buffer_counter(ctx, ii_buffer, tmp_lexicon, tid);
6854 if (!counter) {
return; }
6855 buffer[block_pos++] = tid;
6869 }
else if (counter->
last_sid != sid) {
6892 ii_buffer->block_pos = block_pos;
6907 block->
buffer = (uint8_t *)r;
6911 (
unsigned long long int)bytesize);
6915 if (lseek(ii_buffer->tmpfd, block->
head, SEEK_SET) != block->
head) {
6919 if (read(ii_buffer->tmpfd, block->
buffer, bytesize) != bytesize) {
6923 block->
head += bytesize;
6928 "fetch error: %jd > %jd", block->
head, block->
tail);
6935 &block->
buffer[block->
rest],
sizeof(uint32_t));
6940 uint8_t *p = block->
bufcur;
6955 uint32_t chunk_number;
6956 chunk_new(ctx, ii_buffer->ii, &chunk_number, ii_buffer->packed_len);
6958 chunk_number, ii_buffer->packed_len);
6959 fake_map2(ctx, ii_buffer->ii->chunk, &io_win, ii_buffer->packed_buf,
6960 chunk_number, ii_buffer->packed_len);
6962 ii_buffer->term_buffer->
header.
chunk = chunk_number;
6968 buffer_segment_update(ii_buffer->ii, ii_buffer->lseg, ii_buffer->dseg);
6969 ii_buffer->ii->
header->total_chunk_size += ii_buffer->packed_len;
6970 ii_buffer->total_chunk_size += ii_buffer->packed_len;
6975 ii_buffer->ii->
header->total_chunk_size >> 10);
6976 ii_buffer->term_buffer = NULL;
6977 ii_buffer->packed_buf = NULL;
6978 ii_buffer->packed_len = 0;
6979 ii_buffer->packed_buf_size = 0;
6980 ii_buffer->curr_size = 0;
6988 uint64_t nposts = 0;
6990 uint64_t flags = ii_buffer->ii->
header->flags;
6992 for (i = 0; i < nhits; i++) {
6994 nrecs += block->
nrecs;
6997 ii_buffer->curr_size += nrecs + nposts;
6998 max_size = nrecs * (ii_buffer->ii->n_elements);
6999 if (flags & GRN_OBJ_WITH_POSITION) { max_size += nposts - nrecs; }
7000 datavec_reset(ctx, ii_buffer->data_vectors,
7001 ii_buffer->ii->n_elements, nrecs, max_size);
7006 uint32_t *ridp, *sidp = NULL, *tfp, *weightp = NULL, *posp = NULL;
7009 ridp = ii_buffer->data_vectors[j++].data;
7010 if (flags & GRN_OBJ_WITH_SECTION) {
7011 sidp = ii_buffer->data_vectors[j++].data;
7013 tfp = ii_buffer->data_vectors[j++].data;
7014 if (flags & GRN_OBJ_WITH_WEIGHT) {
7015 weightp = ii_buffer->data_vectors[j++].data;
7017 if (flags & GRN_OBJ_WITH_POSITION) {
7018 posp = ii_buffer->data_vectors[j++].data;
7021 for (i = 0; i < nhits; i++) {
7023 uint8_t *p = block->
bufcur;
7024 uint32_t n = block->
nrecs;
7034 if ((flags & GRN_OBJ_WITH_SECTION)) {
7035 for (n = block->
nrecs; n; n--) {
7039 for (n = block->
nrecs; n; n--) {
7042 if ((flags & GRN_OBJ_WITH_WEIGHT)) {
7043 for (n = block->
nrecs; n; n--) {
7047 if ((flags & GRN_OBJ_WITH_POSITION)) {
7048 for (n = block->
nposts; n; n--) {
7055 grn_ii_buffer_fetch(ctx, ii_buffer, block);
7059 uint32_t f_s = (nrecs < 3) ? 0 :
USE_P_ENC;
7060 uint32_t f_d = ((nrecs < 16) || (nrecs <= (lr >> 8))) ? 0 :
USE_P_ENC;
7061 ii_buffer->data_vectors[j].data_size = nrecs;
7062 ii_buffer->data_vectors[j++].flags = f_d;
7063 if ((flags & GRN_OBJ_WITH_SECTION)) {
7064 ii_buffer->data_vectors[j].data_size = nrecs;
7065 ii_buffer->data_vectors[j++].flags = f_s;
7067 ii_buffer->data_vectors[j].data_size = nrecs;
7068 ii_buffer->data_vectors[j++].flags = f_s;
7069 if ((flags & GRN_OBJ_WITH_WEIGHT)) {
7070 ii_buffer->data_vectors[j].data_size = nrecs;
7071 ii_buffer->data_vectors[j++].flags = f_s;
7073 if ((flags & GRN_OBJ_WITH_POSITION)) {
7074 uint32_t f_p = (((nposts < 32) ||
7075 (nposts <= (spos >> 13))) ? 0 :
USE_P_ENC);
7076 ii_buffer->data_vectors[j].data_size = nposts;
7077 ii_buffer->data_vectors[j++].flags = f_p|
ODD;
7081 return (max_size + ii_buffer->ii->n_elements) * 4;
7087 if (!ii_buffer->term_buffer) {
7093 if (lseg == GRN_II_MAX_LSEG) {
7097 ii_buffer->lseg = lseg;
7098 ii_buffer->dseg = segment_get(ctx, ii_buffer->ii);
7099 GRN_IO_SEG_REF(ii_buffer->ii->seg, ii_buffer->dseg, term_buffer);
7100 ii_buffer->term_buffer = (buffer *)term_buffer;
7102 return ii_buffer->term_buffer;
7109 if (nhits == 1 && hits[0]->nrecs == 1 && hits[0]->nposts == 1) {
7111 uint32_t sid = 1, tf, pos = 0, weight = 0;
7113 uint8_t *p = block->
bufcur;
7114 uint32_t flags = ii_buffer->ii->
header->flags;
7116 if (flags & GRN_OBJ_WITH_SECTION) {
7122 if (flags & GRN_OBJ_WITH_WEIGHT) {
GRN_B_DEC(weight, p); }
7123 if (flags & GRN_OBJ_WITH_POSITION) {
GRN_B_DEC(pos, p); }
7125 if (flags & GRN_OBJ_WITH_SECTION) {
7126 if (rid < 0x100000 && sid < 0x800) {
7127 uint32_t *a = array_get(ctx, ii_buffer->ii, tid);
7128 a[0] = (rid << 12) + (sid << 1) + 1;
7134 uint32_t *a = array_get(ctx, ii_buffer->ii, tid);
7135 a[0] = (rid << 1) + 1;
7140 grn_ii_buffer_fetch(ctx, ii_buffer, block);
7151 if (!try_in_place_packing(ctx, ii_buffer, tid, hits, nhits)) {
7152 size_t max_size = merge_hit_blocks(ctx, ii_buffer, hits, nhits);
7153 if (ii_buffer->packed_buf &&
7154 ii_buffer->packed_buf_size < ii_buffer->packed_len + max_size) {
7155 grn_ii_buffer_chunk_flush(ctx, ii_buffer);
7157 if (!ii_buffer->packed_buf) {
7159 ? max_size : II_BUFFER_PACKED_BUF_SIZE;
7160 if ((ii_buffer->packed_buf =
GRN_MALLOC(buf_size))) {
7161 ii_buffer->packed_buf_size = buf_size;
7168 uint32_t *a = array_get(ctx, ii_buffer->ii, tid);
7169 buffer *term_buffer = get_term_buffer(ctx, ii_buffer);
7170 if (!term_buffer) {
return; }
7172 bt = &term_buffer->
terms[nterm];
7173 a[0] =
SEG2POS(ii_buffer->lseg,
7175 packed_len =
grn_p_encv(ctx, ii_buffer->data_vectors,
7176 ii_buffer->ii->n_elements,
7177 ii_buffer->packed_buf +
7178 ii_buffer->packed_len);
7184 ii_buffer->packed_len += packed_len;
7185 if (((ii_buffer->curr_size * ii_buffer->update_buffer_size) +
7186 (ii_buffer->total_size * term_buffer->
header.
nterms * 16)) >=
7187 (ii_buffer->total_size * II_BUFFER_NTERMS_PER_BUFFER * 16)) {
7188 grn_ii_buffer_chunk_flush(ctx, ii_buffer);
7196 long long unsigned int update_buffer_size)
7202 ii_buffer->lexicon = ii->
lexicon;
7203 ii_buffer->tmp_lexicon = NULL;
7204 ii_buffer->nblocks = 0;
7205 ii_buffer->blocks = NULL;
7207 ii_buffer->block_pos = 0;
7208 ii_buffer->filepos = 0;
7209 ii_buffer->curr_size = 0;
7210 ii_buffer->total_size = 0;
7211 ii_buffer->update_buffer_size = update_buffer_size;
7212 ii_buffer->counters =
GRN_CALLOC(ii_buffer->ncounters *
7214 ii_buffer->term_buffer = NULL;
7215 ii_buffer->packed_buf = NULL;
7216 ii_buffer->packed_len = 0;
7217 ii_buffer->packed_buf_size = 0;
7218 ii_buffer->total_chunk_size = 0;
7219 if (ii_buffer->counters) {
7221 if (ii_buffer->block_buf) {
7222 snprintf(ii_buffer->tmpfpath,
PATH_MAX,
7226 O_WRONLY|O_CREAT|O_TRUNC,
7228 if (ii_buffer->tmpfd != -1) {
7255 grn_ii_buffer_tokenize(ctx, ii_buffer, rid, sid, 0,
7263 if (ii_buffer->block_pos) {
7264 grn_ii_buffer_flush(ctx, ii_buffer);
7266 if (ii_buffer->tmpfd != -1) {
7269 if (ii_buffer->block_buf) {
7271 ii_buffer->block_buf = NULL;
7273 if (ii_buffer->counters) {
7275 ii_buffer->counters = NULL;
7278 if (ii_buffer->update_buffer_size &&
7279 ii_buffer->update_buffer_size < 20) {
7280 if (ii_buffer->update_buffer_size < 10) {
7281 ii_buffer->update_buffer_size =
7282 ii_buffer->total_size >> (10 - ii_buffer->update_buffer_size);
7284 ii_buffer->update_buffer_size =
7285 ii_buffer->total_size << (ii_buffer->update_buffer_size - 10);
7291 ii_buffer->nblocks, ii_buffer->update_buffer_size);
7293 datavec_init(ctx, ii_buffer->data_vectors, ii_buffer->ii->n_elements, 0, 0);
7297 ii_buffer->tmpfd =
GRN_OPEN(ii_buffer->tmpfpath, O_RDONLY);
7299 if (ii_buffer->tmpfd == -1) {
7305 for (i = 0; i < ii_buffer->nblocks; i++) {
7306 grn_ii_buffer_fetch(ctx, ii_buffer, &ii_buffer->blocks[i]);
7315 NULL, 0, NULL, 0, 0, -1, II_BUFFER_ORDER);
7321 for (i = 0; i < ii_buffer->nblocks; i++) {
7322 if (ii_buffer->blocks[i].tid == tid) {
7323 hits[nhits++] = &ii_buffer->blocks[
i];
7325 if (ii_buffer->blocks[i].tid) { nrests++; }
7327 if (nhits) { grn_ii_buffer_merge(ctx, ii_buffer, tid, hits, nhits); }
7328 if (!nrests) {
break; }
7330 if (ii_buffer->packed_len) {
7331 grn_ii_buffer_chunk_flush(ctx, ii_buffer);
7338 datavec_fin(ctx, ii_buffer->data_vectors);
7341 ii_buffer->filepos, ii_buffer->total_chunk_size);
7343 unlink(ii_buffer->tmpfpath);
7344 ii_buffer->tmpfd = -1;
7357 if (ii_buffer->tmp_lexicon) {
7360 if (ii_buffer->tmpfd != -1) {
7362 unlink(ii_buffer->tmpfpath);
7364 if (ii_buffer->block_buf) {
7367 if (ii_buffer->counters) {
7370 if (ii_buffer->blocks) {
7371 for (i = 0; i < ii_buffer->nblocks; i++) {
7372 if (ii_buffer->blocks[i].buffer) {
7373 GRN_FREE(ii_buffer->blocks[i].buffer);
7388 NULL, 0, NULL, 0, 0, -1,
7396 for (sid = 1, col = cols; sid <= ncols; sid++, col++) {
7405 grn_ii_buffer_tokenize(ctx, ii_buffer, rid, sid, 0,
7411 int n_sections = rv.
u.
v.n_sections;
7414 for (i = 0; i < n_sections; i++) {
7416 if (section->
length == 0) {
7419 grn_ii_buffer_tokenize(ctx, ii_buffer, rid,
7447 for (i = 0; i < ncols; i++) {
7448 if (!(cols[i] =
grn_ctx_at(ctx, s[i]))) {
break; }
7456 grn_ii_buffer_parse(ctx, ii_buffer, target, ncols, cols);