private bool TryReadStringPart(StringBuilder builder) { var lineLength = _line.Length; if (_columnIndex >= lineLength || _line[_columnIndex] != '"') { AddError(DiagnosticCodes.ExpectedToken, new TextLocation(_lineIndex, _columnIndex >= 0 ? _columnIndex : lineLength), '"'); return(false); } var startIndex = ++_columnIndex; for (; _columnIndex < lineLength; _columnIndex++) { if (_line[_columnIndex] == '"' && !IsEscaped(startIndex)) { var endIndex = _columnIndex++; _columnIndex = FindNextTokenInLine(); if (_columnIndex >= 0) { AddError(DiagnosticCodes.UnexpectedToken, new TextLocation(_lineIndex, lineLength)); return(false); } var index = POString.Decode(builder, _line, startIndex, endIndex - startIndex); if (index >= 0) { AddError(DiagnosticCodes.InvalidEscapeSequence, new TextLocation(_lineIndex, index)); return(false); } _columnIndex = lineLength; return(true); } } AddError(DiagnosticCodes.ExpectedToken, new TextLocation(_lineIndex, lineLength), '"'); return(false); bool IsEscaped(int si) { bool result = false; for (var i = _columnIndex - 1; i >= si; i--) { if (_line[i] == '\\') { result = !result; } else { break; } } return(result); } }
public static bool TryParse(string value, out POPreviousValueComment result) { if (value == null) { throw new ArgumentNullException(nameof(value)); } string idKindToken = null; value = value.Trim(); var index = value.FindIndex(char.IsWhiteSpace); if (index >= 0) { idKindToken = value.Remove(index); value = value.Substring(index + 1).TrimStart(); } int length; POIdKind idKind; StringBuilder sb; if (index < 0 || (length = value.Length) < 2 || value[0] != '"' || value[length - 1] != '"' || (idKind = POKey.GetIdKind(idKindToken)) == POIdKind.Unknown || POString.Decode(sb = new StringBuilder(), value, 1, length - 2) >= 0) { result = null; return(false); } result = new POPreviousValueComment { IdKind = idKind, Value = sb.ToString() }; return(true); }