Ejemplo n.º 1
0
        private unsafe void deSerialize(ref SubString value)
        {
            //string stringValue = null;
            //if ((Read = DeSerialize(Read, end, ref stringValue)) == null) State = DeSerializeState.IndexOutOfRange;
            //else value.Set(stringValue, 0, stringValue.Length);
            int length = *(int *)Read;

            if ((length & 1) == 0)
            {
                if (length != 0)
                {
                    int dataLength = (length + (3 + sizeof(int))) & (int.MaxValue - 3);
                    if (dataLength <= (int)(end - Read))
                    {
                        length >>= 1;
                        value.Set(new string((char *)(Read + sizeof(int)), 0, length), 0, length);
                        Read += dataLength;
                    }
                    else
                    {
                        State = DeSerializeState.IndexOutOfRange;
                    }
                }
                else
                {
                    value.Set(string.Empty, 0, 0);
                    Read += sizeof(int);
                }
            }
            else
            {
                length >>= 1;
                int lengthSize = (length <= byte.MaxValue ? 1 : (length <= ushort.MaxValue ? sizeof(ushort) : sizeof(int)));
                if (((lengthSize + length + (3 + sizeof(int))) & (int.MaxValue - 3)) <= (int)(end - Read))
                {
                    value.Set(AutoCSer.Extension.StringExtension.FastAllocateString(length), 0, length);
                    fixed(char *valueFixed = value.String)
                    {
                        byte *read = DeSerialize(Read, end, valueFixed, length, lengthSize);

                        if (read != null)
                        {
                            Read = read;
                            return;
                        }
                    }
                }
                State = DeSerializeState.IndexOutOfRange;
            }
        }
Ejemplo n.º 2
0
        internal void Parse(ref SubString value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value.Set(string.Empty, 0, 0);
            }
            else
            {
                value = header.UnescapeUtf8(bufferStart, indexs->StartIndex, indexs->Length);
            }
        }
Ejemplo n.º 3
0
 internal void SetString(string value)
 {
     String.Set(value, 0, value.Length);
     Type = NodeType.String;
 }
Ejemplo n.º 4
0
        public void CallParse(ref SubString value)
        {
            space();
            if (State != ParseState.Success)
            {
                return;
            }
            if (*current == '<')
            {
                if (*(current + 1) == '!')
                {
                    searchCData2();
                    if (State == ParseState.Success)
                    {
                        if (valueSize == 0)
                        {
                            value.Set(string.Empty, 0, 0);
                        }
                        else
                        {
                            value.Set(xml, (int)(valueStart - xmlFixed), valueSize);
                        }
                    }
                }
                else
                {
                    value.Set(string.Empty, 0, 0);
                }
            }
            else
            {
                valueStart = current;
                valueSize  = 0;
                do
                {
                    if (*current == '<')
                    {
                        int length = (int)(endSpace() - valueStart);
                        if (valueSize == 0)
                        {
                            value.Set(xml, (int)(valueStart - xmlFixed), length);
                        }
                        else if (Config.IsTempString)
                        {
                            value.Set(xml, (int)(valueStart - xmlFixed), length - valueSize);
                            while (*valueStart != '&')
                            {
                                ++valueStart;
                            }
                            decodeString(valueStart, xmlFixed + value.Start + value.Length);
                        }
                        else
                        {
                            string decodeValue = AutoCSer.Extension.StringExtension.FastAllocateString(length - valueSize);

                            fixed(char *valueFixed = decodeValue) decodeString(valueFixed, valueFixed + decodeValue.Length);

                            value.Set(decodeValue, 0, decodeValue.Length);
                        }
                        return;
                    }
                    if (*current == '&')
                    {
                        do
                        {
                            ++valueSize;
                            if (*++current == ';')
                            {
                                break;
                            }
                            if (*current == '<')
                            {
                                State = ParseState.DecodeError;
                                return;
                            }
                        }while (true);
                    }
                    ++current;
                }while (true);
            }
        }