Ejemplo n.º 1
0
        /// <summary>
        /// Attempts to parse a method call with format MethodId(Args)
        /// </summary>
        static public bool TryParse(StringSlice inData, out MethodCall outMethodCall)
        {
            int openParenIdx  = inData.IndexOf('(');
            int closeParenIdx = inData.LastIndexOf(')');

            if (openParenIdx <= 0 || closeParenIdx <= 0 || closeParenIdx <= openParenIdx)
            {
                outMethodCall = default(MethodCall);
                return(false);
            }

            StringSlice methodSlice = inData.Substring(0, openParenIdx).Trim();

            if (!VariantUtils.IsValidIdentifier(methodSlice))
            {
                outMethodCall = default(MethodCall);
                return(false);
            }

            StringSlice afterMethod = inData.Substring(closeParenIdx + 1);

            if (!afterMethod.IsWhitespace)
            {
                outMethodCall = default(MethodCall);
                return(false);
            }

            int argsLength = closeParenIdx - 1 - openParenIdx;

            outMethodCall.Id   = methodSlice.Hash32();
            outMethodCall.Args = inData.Substring(openParenIdx + 1, argsLength).Trim();

            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Attempts to parse the string slice into a color.
        /// </summary>
        static public bool TryParseColor(StringSlice inSlice, out Color outColor)
        {
            StringSlice colorData = inSlice;
            StringSlice alphaData = StringSlice.Empty;

            int dotIdx = inSlice.IndexOf('.');

            if (dotIdx >= 0)
            {
                colorData = inSlice.Substring(0, dotIdx);
                alphaData = inSlice.Substring(dotIdx + 1);
            }

            Color color   = default(Color);
            bool  bParsed = false;

            if (colorData.StartsWith('#'))
            {
                ulong       hex;
                StringSlice hexString = colorData.Substring(1);
                if (hexString.Length <= 6 && TryParseHex(colorData, 6, out hex))
                {
                    color   = Colors.RGBA((uint)hex << 8);
                    bParsed = true;
                }
                else if (TryParseHex(colorData, 8, out hex))
                {
                    color   = Colors.RGBA((uint)hex);
                    bParsed = true;
                }
            }

            if (!bParsed)
            {
                bParsed = ColorUtility.TryParseHtmlString(colorData.ToString(), out color);
                if (!bParsed)
                {
                    outColor = default(Color);
                    return(false);
                }
            }

            if (!alphaData.IsEmpty)
            {
                float alphaMult;
                if (!TryParseFloat(alphaData, out alphaMult))
                {
                    outColor = default(Color);
                    return(false);
                }

                color.a *= alphaMult / 100f;
            }

            outColor = color;
            return(bParsed);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Attempts to parse a string slice into a ulong.
        /// </summary>
        static public bool TryParseULong(StringSlice inSlice, out ulong outULong)
        {
            inSlice = inSlice.Trim();

            if (inSlice.StartsWith("0x"))
            {
                return(TryParseHex(inSlice.Substring(2), 16, out outULong));
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits64))
            {
                outULong = 0;
                return(false);
            }

            decimal accum = 0;
            char    c;

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

                if (c == Negative)
                {
                    outULong = 0;
                    return(false);
                }
                if (c == Positive)
                {
                    if (i > 0)
                    {
                        outULong = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outULong = 0;
                    return(false);
                }

                accum = (accum * 10) + (ulong)(c - '0');
            }

            if (accum > ulong.MaxValue)
            {
                outULong = 0;
                return(false);
            }

            outULong = (uint)accum;
            return(true);
        }
Ejemplo n.º 4
0
        static public bool TryParse(StringSlice inSlice, out StringHash64 outHash)
        {
            if (inSlice.StartsWith(StringHashing.CustomHashPrefix))
            {
                ulong hexVal;
                if (StringParser.TryParseHex(inSlice.Substring(1), 16, out hexVal))
                {
                    outHash = new StringHash64(hexVal);
                    return(true);
                }
            }
            else if (inSlice.StartsWith("0x"))
            {
                ulong hexVal;
                if (StringParser.TryParseHex(inSlice.Substring(2), 16, out hexVal))
                {
                    outHash = new StringHash64(hexVal);
                    return(true);
                }

                outHash = default(StringHash64);
                return(false);
            }
            else if (inSlice.StartsWith(StringHashing.StringPrefix))
            {
                outHash = inSlice.Substring(1).Hash64();
                return(true);
            }
            else if (inSlice.StartsWith('"') && inSlice.EndsWith('"'))
            {
                outHash = inSlice.Substring(1, inSlice.Length - 2).Hash64();
                return(true);
            }

            outHash = inSlice.Hash64();
            return(true);
        }
Ejemplo n.º 5
0
                public StringSlice Process(StringSlice inSlice)
                {
                    StringSlice slice = inSlice.Trim();

                    if (slice.Length >= 2 && slice.StartsWith('"') && slice.EndsWith('"'))
                    {
                        slice = slice.Substring(1, slice.Length - 2);
                    }

                    // if this contains escaped CSV sequences, unescape it here
                    if (m_Unescape && (slice.Contains("\\") || slice.Contains("\\\"")))
                    {
                        return(slice.Unescape(Escaper.Instance));
                    }
                    return(slice);
                }
Ejemplo n.º 6
0
        /// <summary>
        /// Attempts to parse a string slice into a byte.
        /// </summary>
        static public bool TryParseByte(StringSlice inSlice, out byte outByte)
        {
            inSlice = inSlice.Trim();

            if (inSlice.StartsWith("0x"))
            {
                ulong hex;
                if (TryParseHex(inSlice.Substring(2), 2, out hex))
                {
                    outByte = (byte)hex;
                    return(true);
                }

                outByte = 0;
                return(false);
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits8))
            {
                outByte = 0;
                return(false);
            }

            int  accum = 0;
            char c;

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

                if (c == Negative)
                {
                    outByte = 0;
                    return(false);
                }
                if (c == Positive)
                {
                    if (i > 0)
                    {
                        outByte = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outByte = 0;
                    return(false);
                }

                accum = (accum * 10) + (c - '0');
            }

            if (accum > byte.MaxValue)
            {
                outByte = 0;
                return(false);
            }

            outByte = (byte)accum;
            return(true);
        }
Ejemplo n.º 7
0
        static private bool TryParseLongInternal(StringSlice inSlice, bool inbCheckHex, out long outLong)
        {
            inSlice = inSlice.Trim();

            if (inbCheckHex && inSlice.StartsWith("0x"))
            {
                ulong hex;
                if (TryParseHex(inSlice.Substring(2), 16, out hex))
                {
                    outLong = (long)hex;
                    return(true);
                }

                outLong = 0;
                return(false);
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits64))
            {
                outLong = 0;
                return(false);
            }

            decimal accum = 0;
            char    c;
            int     sign = 1;

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

                if (c == Negative)
                {
                    if (i > 0)
                    {
                        outLong = 0;
                        return(false);
                    }

                    sign = -1;
                    continue;
                }
                else if (c == Positive)
                {
                    if (i > 0)
                    {
                        outLong = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outLong = 0;
                    return(false);
                }

                accum = (accum * 10) + (c - '0');
            }

            accum *= sign;

            if (accum > long.MaxValue || accum < long.MinValue)
            {
                outLong = 0;
                return(false);
            }

            outLong = (long)accum;
            return(true);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Attempts to parse a string slice into an int.
        /// </summary>
        static public bool TryParseInt(StringSlice inSlice, out int outInt)
        {
            inSlice = inSlice.Trim();

            if (inSlice.StartsWith("0x"))
            {
                ulong hex;
                if (TryParseHex(inSlice.Substring(2), 8, out hex))
                {
                    outInt = (int)hex;
                    return(true);
                }

                outInt = 0;
                return(false);
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits32))
            {
                outInt = 0;
                return(false);
            }

            long accum = 0;
            char c;
            int  sign = 1;

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

                if (c == Negative)
                {
                    if (i > 0)
                    {
                        outInt = 0;
                        return(false);
                    }

                    sign = -1;
                    continue;
                }
                else if (c == Positive)
                {
                    if (i > 0)
                    {
                        outInt = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outInt = 0;
                    return(false);
                }

                accum = (accum * 10) + (c - '0');
            }

            accum *= sign;

            if (accum > int.MaxValue || accum < int.MinValue)
            {
                outInt = 0;
                return(false);
            }

            outInt = (int)accum;
            return(true);
        }