コード例 #1
0
        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());
        }
コード例 #2
0
        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);
        }