示例#1
0
        public unsafe int CommonPrefixSearch(char *key, int len, DoubleArray.ResultPair *result, int rLen)
        {
            int   maxByteCount = this.encoding.GetMaxByteCount(len);
            byte *ptr          = stackalloc byte[(int)(uint)maxByteCount];
            int   bytes        = this.encoding.GetBytes(key, len, ptr, maxByteCount);
            int   num          = this.da.CommonPrefixSearch(ptr, result, rLen, bytes, 0);

            for (int i = 0; i < num; i++)
            {
                result[i].Length = this.encoding.GetCharCount(ptr, result[i].Length);
            }
            return(num);
        }
示例#2
0
        public unsafe int CommonPrefixSearch(char *key, int len, DoubleArray.ResultPair *result, int rLen)
        {
            //エンコード
            int   maxByteLen = this.encoding.GetMaxByteCount(len);
            byte *bytes      = stackalloc byte[maxByteLen];
            int   bytesLen   = this.encoding.GetBytes(key, len, bytes, maxByteLen);

            int n = this.da.CommonPrefixSearch(bytes, result, rLen, bytesLen);

            //文字数をデコードしたものに変換
            for (int i = 0; i < n; i++)
            {
                result[i].Length = this.encoding.GetCharCount(bytes, result[i].Length);
            }

            return(n);
        }
示例#3
0
		public unsafe MeCabNode Lookup(char* begin, char* end)
		{
			MeCabNode meCabNode = null;
			if (end - begin > 65535)
			{
				end = begin + 65535;
			}
			CharInfo charInfo = default(CharInfo);
			int num = default(int);
			char* ptr = this.property.SeekToOtherType(begin, end, this.space, &charInfo, &num);
			DoubleArray.ResultPair* ptr2 = stackalloc DoubleArray.ResultPair[512];
			MeCabDictionary[] array = this.dic;
			foreach (MeCabDictionary meCabDictionary in array)
			{
				int num2 = meCabDictionary.CommonPrefixSearch(ptr, (int)(end - ptr), ptr2, 512);
				for (int j = 0; j < num2; j++)
				{
					Token[] token = meCabDictionary.GetToken(ptr2[j]);
					for (int k = 0; k < token.Length; k++)
					{
						MeCabNode newNode = this.GetNewNode();
						this.ReadNodeInfo(meCabDictionary, token[k], newNode);
						newNode.Length = ptr2[j].Length;
						newNode.RLength = (int)(ptr - begin) + ptr2[j].Length;
						newNode.Surface = new string(ptr, 0, ptr2[j].Length);
						newNode.Stat = MeCabNodeStat.Nor;
						newNode.CharType = charInfo.DefaultType;
						newNode.BNext = meCabNode;
						meCabNode = newNode;
					}
				}
			}
			if (meCabNode != null && !charInfo.Invoke)
			{
				return meCabNode;
			}
			char* ptr3 = ptr + 1;
			char* ptr4 = null;
			if (ptr3 > end)
			{
				this.AddUnknown(ref meCabNode, charInfo, begin, ptr, ptr3);
				return meCabNode;
			}
			if (charInfo.Group)
			{
				char* ptr5 = ptr3;
				CharInfo charInfo2 = default(CharInfo);
				ptr3 = this.property.SeekToOtherType(ptr3, end, charInfo, &charInfo2, &num);
				if (num <= this.maxGroupingSize)
				{
					this.AddUnknown(ref meCabNode, charInfo, begin, ptr, ptr3);
				}
				ptr4 = ptr3;
				ptr3 = ptr5;
			}
			for (int l = 1; l <= charInfo.Length; l++)
			{
				if (ptr3 > end)
				{
					break;
				}
				if (ptr3 != ptr4)
				{
					num = l;
					this.AddUnknown(ref meCabNode, charInfo, begin, ptr, ptr3);
					if (!charInfo.IsKindOf(this.property.GetCharInfo(*ptr3)))
					{
						break;
					}
					ptr3++;
				}
			}
			if (meCabNode == null)
			{
				this.AddUnknown(ref meCabNode, charInfo, begin, ptr, ptr3);
			}
			return meCabNode;
		}
示例#4
0
        public unsafe MeCabNode Lookup(char *begin, char *end)
        {
            CharInfo  cInfo;
            MeCabNode resultNode = null;
            int       cLen;

            if (end - begin > ushort.MaxValue)
            {
                end = begin + ushort.MaxValue;
            }
            char *begin2 = property.SeekToOtherType(begin, end, this.space, &cInfo, &cLen);

            DoubleArray.ResultPair *daResults = stackalloc DoubleArray.ResultPair[DAResultSize];

            foreach (MeCabDictionary it in this.dic)
            {
                int n = it.CommonPrefixSearch(begin2, (int)(end - begin2), daResults, DAResultSize);

                for (int i = 0; i < n; i++)
                {
                    Token[] token = it.GetToken(daResults[i]);
                    for (int j = 0; j < token.Length; j++)
                    {
                        MeCabNode newNode = this.GetNewNode();
                        this.ReadNodeInfo(it, token[j], newNode);
                        //newNode.Token = token[j];
                        newNode.Length   = daResults[i].Length;
                        newNode.RLength  = (int)(begin2 - begin) + daResults[i].Length;
                        newNode.Surface  = new string(begin2, 0, daResults[i].Length);
                        newNode.Stat     = MeCabNodeStat.Nor;
                        newNode.CharType = cInfo.DefaultType;
                        newNode.BNext    = resultNode;
                        resultNode       = newNode;
                    }
                }
            }

            if (resultNode != null && !cInfo.Invoke)
            {
                return(resultNode);
            }

            char *begin3      = begin2 + 1;
            char *groupBegin3 = null;

            if (begin3 > end)
            {
                this.AddUnknown(ref resultNode, cInfo, begin, begin2, begin3);
                return(resultNode);
            }

            if (cInfo.Group)
            {
                char *   tmp = begin3;
                CharInfo fail;
                begin3 = this.property.SeekToOtherType(begin3, end, cInfo, &fail, &cLen);
                if (cLen <= maxGroupingSize)
                {
                    this.AddUnknown(ref resultNode, cInfo, begin, begin2, begin3);
                }
                groupBegin3 = begin3;
                begin3      = tmp;
            }

            for (int i = 1; i <= cInfo.Length; i++)
            {
                if (begin3 > end)
                {
                    break;
                }
                if (begin3 == groupBegin3)
                {
                    continue;
                }
                cLen = i;
                this.AddUnknown(ref resultNode, cInfo, begin, begin2, begin3);
                if (!cInfo.IsKindOf(this.property.GetCharInfo(*begin3)))
                {
                    break;
                }
                begin3 += 1;
            }

            if (resultNode == null)
            {
                this.AddUnknown(ref resultNode, cInfo, begin, begin2, begin3);
            }

            return(resultNode);
        }
示例#5
0
 public unsafe int CommonPrefixSearch(byte *key, int len, DoubleArray.ResultPair *result, int rLen)
 {
     return(this.da.CommonPrefixSearch(key, result, rLen, len));
 }