public void AddString(String fieldValue)
{
PrefixField();
int bufferedUpto = 0;
while (bufferedUpto < fieldValue.Length)
{
int escapeAt = fieldValue.Length;
byte[] escapeSequence = null;
// choose closest instance of strings to escape in fieldValue
for (int eachEscapeable = 0; eachEscapeable < StringsToEscape.Length; eachEscapeable++)
{
int i = fieldValue.IndexOf(StringsToEscape[eachEscapeable], bufferedUpto);
if (i > -1 && i < escapeAt)
{
escapeAt = i;
escapeSequence = EscapeSequenceBytes[eachEscapeable];
}
}
// some, possibly all of fieldValue string does not require escaping and can be buffered for output
if (escapeAt > bufferedUpto)
{
// int encodedLength = BackendEncoding.UTF8Encoding.GetByteCount(fieldValue.ToCharArray(bufferedUpto, escapeAt));
// MakeRoomForBytes(encodedLength);
// _sendBufferAt += BackendEncoding.UTF8Encoding.GetBytes(fieldValue, bufferedUpto, escapeAt, _sendBuffer, _sendBufferAt);
// bufferedUpto = escapeAt;
int encodedLength = BackendEncoding.UTF8Encoding.GetByteCount(fieldValue.ToCharArray(bufferedUpto, escapeAt - bufferedUpto));
MakeRoomForBytes(encodedLength);
_sendBufferAt += BackendEncoding.UTF8Encoding.GetBytes(fieldValue, bufferedUpto, escapeAt - bufferedUpto, _sendBuffer, _sendBufferAt);
bufferedUpto = escapeAt;
}
// now buffer the escape sequence for output
if (escapeSequence != null)
{
AddBytes(EscapeBytes);
AddBytes(escapeSequence);
bufferedUpto++;
}
}
FieldAdded();
}