Beispiel #1
0
        private void WriteEscapedString(string value)
        {
            EnsureWriteBuffer();
            var bufferPool = _arrayPool;

            if (value != null)
            {
                int lastWritePosition = 0;

                for (int i = 0; i < value.Length; i++)
                {
                    var c = value[i];

                    if (c < _charEscapeFlags.Length && !_charEscapeFlags[c])
                    {
                        continue;
                    }

                    string escapedValue = null;

                    if (c < _charEscapeFlags.Length)
                    {
                        escapedValue = $"{Grammar.ReleaseCharacter.Value}{c}";
                    }
                    else
                    {
                        escapedValue = null;
                    }

                    if (escapedValue == null)
                    {
                        continue;
                    }

                    if (i > lastWritePosition)
                    {
                        int length = i - lastWritePosition;
                        int start  = 0;

                        if (_writeBuffer == null || _writeBuffer.Length < length)
                        {
                            char[] newBuffer = BufferUtils.RentBuffer(bufferPool, length);

                            BufferUtils.ReturnBuffer(bufferPool, _writeBuffer);

                            _writeBuffer = newBuffer;
                        }

                        value.CopyTo(lastWritePosition, _writeBuffer, start, length - start);

                        // write unchanged chars before writing escaped text
                        _writer.Write(_writeBuffer, start, length - start);
                    }

                    lastWritePosition = i + 1;
                    _writer.Write(escapedValue);
                }

                if (lastWritePosition == 0)
                {
                    // no escaped text, write entire string
                    _writer.Write(value);
                }
                else
                {
                    int length = value.Length - lastWritePosition;

                    if (_writeBuffer == null || _writeBuffer.Length < length)
                    {
                        _writeBuffer = BufferUtils.EnsureBufferSize(bufferPool, length, _writeBuffer);
                    }

                    value.CopyTo(lastWritePosition, _writeBuffer, 0, length);

                    // write remaining text
                    _writer.Write(_writeBuffer, 0, length);
                }
            }
            else
            {
                WriteNull();
            }
        }