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; } }
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); } }
internal void SetString(string value) { String.Set(value, 0, value.Length); Type = NodeType.String; }
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); } }