mirror of https://gitee.com/bigwinds/arangodb
100 lines
4.4 KiB
C
100 lines
4.4 KiB
C
/* zcode.c - the Z-string code and hash module */
|
|
/* R. A. Parker 13.11.2012 */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
|
|
#include "FulltextIndex/zstr.h"
|
|
|
|
/* zcutf code for storing letters in words */
|
|
uint64_t zcutfX[]={0,1,2,3,4,5,6,7,8,9,10,12,16,24,88,65624};
|
|
uint64_t zcutfC[]={0x0,0x8,0x4,0xC,0x2,0x6,0xA,0xE,
|
|
0x1,0x3,0xA,0x1C,0x48,0x2C0,0xD0000,0xF00000000};
|
|
uint8_t zcutfL[]={4,4,4,4,4,4,4,4,4,4,5,6,7,10,20,36};
|
|
uint8_t zcutfS[]={0,8,4,9,2,10,5,11,1,12,6,13,3,14,7,15};
|
|
uint8_t zcutfTX[]={0x00,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,
|
|
0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,
|
|
0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,
|
|
0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,
|
|
0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,
|
|
0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,
|
|
0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,
|
|
0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,
|
|
0x74,0x1D,0x2E,0x27,0x24,0x1B,0x29,0x2F,
|
|
0x22,0x1F,0x32,0x30,0x25,0x28,0x20,0x1E,
|
|
0x2C,0x31,0x23,0x21,0x1C,0x26,0x2D,0x2A,
|
|
0x33,0x2B,0x34,0x75,0x76,0x77,0x78,0x79,
|
|
0x7A,0x03,0x14,0x0D,0x0A,0x01,0x0F,0x15,
|
|
0x08,0x05,0x18,0x16,0x0B,0x0E,0x06,0x04,
|
|
0x12,0x17,0x09,0x07,0x02,0x0C,0x13,0x10,
|
|
0x19,0x11,0x1A,0x7B,0x7C,0x7D,0x7E,0x7F};
|
|
uint8_t zcutfUX[]={0x00,0x65,0x74,0x61,0x6F,0x69,0x6E,0x73,
|
|
0x68,0x72,0x64,0x6C,0x75,0x63,0x6D,0x66,
|
|
0x77,0x79,0x70,0x76,0x62,0x67,0x6B,0x71,
|
|
0x6A,0x78,0x7A,0x45,0x54,0x41,0x4F,0x49,
|
|
0x4E,0x53,0x48,0x52,0x44,0x4C,0x55,0x43,
|
|
0x4D,0x46,0x57,0x59,0x50,0x56,0x42,0x47,
|
|
0x4B,0x51,0x4A,0x58,0x5A,0x01,0x02,0x03,
|
|
0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,
|
|
0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,
|
|
0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,
|
|
0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,
|
|
0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,
|
|
0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,
|
|
0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,
|
|
0x3C,0x3D,0x3E,0x3F,0x40,0x5B,0x5C,0x5D,
|
|
0x5E,0x5F,0x60,0x7B,0x7C,0x7D,0x7E,0x7F};
|
|
ZCOD zcutf = {2,16,127,4,zcutfX,zcutfC,zcutfL,zcutfS,zcutfTX,zcutfUX};
|
|
|
|
/* zcbky code for storing a B_KEY */
|
|
uint64_t zcbkyX[]={0,1,2,3,4,20,276};
|
|
uint64_t zcbkyC[]={0,4,6,10,0xB0,0xE00,0xF0000};
|
|
uint8_t zcbkyL[]={1,3,3,4,8,12,20};
|
|
uint8_t zcbkyS[]={0,0,0,0, 0,0,0,0, 1,1,3,4, 2,2,5,6};
|
|
ZCOD zcbky = {1,7,0,4,zcbkyX,zcbkyC,zcbkyL,zcbkyS,NULL,NULL};
|
|
|
|
/* zcdelt code for storing UTF-8 deltas */
|
|
uint64_t zcdeltX[]={0,1,2,3,4,5,6,7,8,10,14,22,86,65622};
|
|
uint64_t zcdeltC[]={0,0x4,0x4,0xC,0x2,0x6,0xA,0xE,0x6,0x14,
|
|
0x38,0x2C0, 0xD0000,0xF00000000};
|
|
uint8_t zcdeltL[]={3,3,4,4,4,4,4,4,5,6,7,10,20,36};
|
|
uint8_t zcdeltS[]={0,0,4,8,2,9,5,10,1,1,6,11,3,12,7,13};
|
|
ZCOD zcdelt = {3,14,0,4,zcdeltX,zcdeltC,zcdeltL,zcdeltS,NULL,NULL};
|
|
|
|
/* zcdoc code for storing document handle deltas */
|
|
uint64_t zcdocX[]={0,1,3,11,43,171,1195,1049771};
|
|
uint64_t zcdocC[]={0,0x8,0x10,0xC0,0x80,0xC00,0x500000,0x38000000000};
|
|
uint8_t zcdocL[]={3,4,6,8,10,13,23,42};
|
|
uint8_t zcdocS[]={0,4,2,5,1,6,3,7};
|
|
ZCOD zcdoc = {3,8,0,3,zcdocX,zcdocC,zcdocL,zcdocS,NULL,NULL};
|
|
|
|
/* zckk code for storing direct K-KEY values */
|
|
uint64_t zckkX[]={0,65536,1114112,17891328};
|
|
uint64_t zckkC[]={0,0x200000,0x1000000,0x18000000000};
|
|
uint8_t zckkL[]={18,22,26,41};
|
|
uint8_t zckkS[]={0,2,1,3};
|
|
ZCOD zckk = {1,4,0,2,zckkX,zckkC,zckkL,zckkS,NULL,NULL};
|
|
|
|
/* zcdh code for putting doc handles into a stex */
|
|
uint64_t zcdhX[]={0,8192,134225920};
|
|
uint64_t zcdhC[]={0,0x10000000,0xC0000000000};
|
|
uint8_t zcdhL[]={14,29,44};
|
|
uint8_t zcdhS[]={0,0,1,2};
|
|
ZCOD zcdh = {1,4,0,2,zcdhX,zcdhC,zcdhL,zcdhS,NULL,NULL};
|
|
|
|
uint64_t ZStrTuberK(TUBER * t, uint64_t d1,
|
|
uint64_t d2, uint64_t keyb)
|
|
{
|
|
uint64_t keya;
|
|
if(d2<3) keya= (d1+5*d2) % t->kmax;
|
|
else keya = ( d1*(d1+d2) + 2*d2*d2 ) % t->kmax;
|
|
if(keyb==0) return keya;
|
|
if(keyb==1) return (keya+19)%t->kmax;
|
|
if(keyb==2) return (keya+43)%t->kmax;
|
|
if(keyb<47) return ((keya+3)*keyb)%t->kmax;
|
|
return ZStrTuberK(t,ZStrTuberK(t,d1,d2,keyb%47),0,keyb/47);
|
|
}
|
|
|
|
/* end of zcode.c */
|