public static string TryConvertPresentationToValue([NotNull] string value, StringLiteralPresentationForm presentationForm) { var builder = new StringBuilder(value.Length); for (var i = 0; i < value.Length;) { var presentationLength = GetCharPresentationLength(value, i); if (presentationLength == -1) { return(null); } if (presentationLength == 1) { builder.Append(value[i++]); } else { string charResult; var presentation = value.Substring(i, presentationLength); if (!TryConvertPresentationToValue(presentation, presentationForm, out charResult)) { return(null); } builder.Append(charResult); i += presentationLength; } } return(builder.ToString()); }
public static bool TryConvertPresentationToValue( [NotNull] string charPresentation, StringLiteralPresentationForm presentationForm, out string result) { if (charPresentation.Length == 1) { var ch = charPresentation[0]; if (ch == '\\' || ch == '\n') { goto Fail; } if (ch == '\"' && presentationForm == StringLiteralPresentationForm.DOUBLE_QUOTED) { goto Fail; } if (ch == '\'' && presentationForm == StringLiteralPresentationForm.SINGLE_QUOTED) { goto Fail; } result = charPresentation; return(true); } switch (charPresentation) { case @"\'": result = "\'"; return(true); case @"\""": result = "\""; return(true); case @"\\": result = "\\"; return(true); case @"\0": result = "\0"; return(true); case @"\b": result = "\b"; return(true); case @"\f": result = "\f"; return(true); case @"\n": result = "\n"; return(true); case @"\r": result = "\r"; return(true); case @"\t": result = "\t"; return(true); case @"\v": result = "\v"; return(true); } if (charPresentation.StartsWith(@"\x", StringComparison.Ordinal) || charPresentation.StartsWith(@"\u", StringComparison.Ordinal)) { int utf; charPresentation = charPresentation.Substring(2); if (int.TryParse(charPresentation, NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo, out utf)) { if (utf < 0x000000 || utf > 0x10ffff) { goto Fail; } if (utf >= 0x00d800 && utf <= 0x00dfff) { result = new string(Convert.ToChar(utf), 1); return(true); } try { result = Char.ConvertFromUtf32(utf); } catch (ArgumentOutOfRangeException) { goto Fail; } return(true); } } else if (charPresentation.Length == 2) { // \ NonEscapeCharacter result = charPresentation[1].ToString(CultureInfo.InvariantCulture); return(true); } Fail: result = null; return(false); }