예제 #1
0
        /// <summary>
        ///     A CSStreamReader extension method that reads a tag.
        /// </summary>
        /// <param name="stream">  The stream to act on. </param>
        /// <param name="content"> The content. </param>
        /// <exception cref="CSReaderException">
        ///     Thrown when a Create struct Reader error condition
        ///     occurs.
        /// </exception>
        internal static void ReadTag(this CSStreamReader stream, string content)
        {
            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case '[':
                {
                    stream.ReadTagInner(content);
                    return;
                }

                case '/':
                    throw new CSReaderException($"ERROR: INVALID TAG! -> invalid char '{c}'!");

                case '\n':
                case '\r':
                case '\t':
                case ' ':
                    break;

                default:
                    Console.WriteLine(
                        $"WARNING: invalid char '{c}' found near line {stream.Line} -> index {stream.Index}!");
                    break;
                }
            }
            throw new CSReaderException($"ERROR: NO TAG FOUND -> '{content}'");
        }
예제 #2
0
        /// <summary>
        ///     A CSStreamReader extension method that reads tag inner.
        /// </summary>
        /// <param name="stream">  The stream to act on. </param>
        /// <param name="content"> The content. </param>
        /// <exception cref="CSReaderException">
        ///     Thrown when a Create struct Reader error condition
        ///     occurs.
        /// </exception>
        private static void ReadTagInner(this CSStreamReader stream, string content)
        {
            StringBuilder sb = new StringBuilder(128);

            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case ']':
                {
                    string buffer = sb.ToString();
                    if (buffer == content)
                    {
                        return;
                    }
                    throw new CSReaderException($"ERROR: INVALID TAG DEFINITION! -> '{buffer}' != '{content}'");
                }

                case '\n':
                case '[':
                case '\r':
                case '\t':
                    throw new CSReaderException($"ERROR: INVALID TAG DEFINITION! -> invalid char '{c}'");
                }
                sb.Append(c);
            }
            throw new CSReaderException($"ERROR: NO KEY FOUND! -> '{sb}'");
        }
예제 #3
0
        /// <summary>
        ///     A CSStreamReader extension method that reads start tag.
        /// </summary>
        /// <param name="stream">        The stream to act on. </param>
        /// <param name="key">           [out] The key. </param>
        /// <param name="dimensionInfo"> [out] Information describing the dimension. </param>
        /// <exception cref="CSReaderException">
        ///     Thrown when a Create struct Reader error condition
        ///     occurs.
        /// </exception>
        internal static void ReadStartTag(this CSStreamReader stream, out string key, out string dimensionInfo)
        {
            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case '[':
                {
                    stream.ReadStartTagInner(out key, out dimensionInfo);
                    return;
                }

                case '/':
                    throw new CSReaderException($"ERROR: INVALID TAG! -> invalid char '{c}'!");

                case '\n':
                case '\r':
                case '\t':
                case ' ':
                    break;

                default:
                    Console.WriteLine(
                        $"WARNING: invalid char '{c}' found near line {stream.Line} -> index {stream.Index}!");
                    break;
                }
            }
            throw new CSReaderException("ERROR: NO START TAG FOUND -> \'[:]\'");
        }
예제 #4
0
        /// <summary>
        ///     A CSStreamReader extension method that reads object start tag.
        /// </summary>
        /// <param name="stream"> The stream to act on. </param>
        /// <param name="key">    [out] The key. </param>
        /// <exception cref="CSReaderException">
        ///     Thrown when a Create struct Reader error condition
        ///     occurs.
        /// </exception>
        internal static void ReadObjectStartTag(this CSStreamReader stream, string key)
        {
            StringBuilder sb = new StringBuilder(128);

            while (stream.ReadChar(out char c))
            {
                sb.Append(c);
                switch (c)
                {
                case ']':
                {
                    string buffer = sb.ToString();
                    if (buffer == $"[{key}]")
                    {
                        return;
                    }
                    throw new CSReaderException($"ERROR: INVALID START TAG FOUND! -> '{buffer}' != '[{key}]'");
                }

                case '\n':
                case '\r':
                case '\t':
                    throw new CSReaderException($"ERROR: INVALID KEY:INFO DEFINITION! -> invalid char '{c}'");
                }
            }
            throw new CSReaderException($"ERROR: NO KEY FOUND! -> {sb}");
        }
예제 #5
0
        /// <summary>
        ///     A CSStreamReader extension method that reads end tag.
        /// </summary>
        /// <param name="stream"> The stream to act on. </param>
        /// <param name="key">    [out] The key. </param>
        /// <exception cref="CSReaderException">
        ///     Thrown when a Create struct Reader error condition
        ///     occurs.
        /// </exception>
        internal static void ReadEndTag(this CSStreamReader stream, string key)
        {
            StringBuilder sb = new StringBuilder(32);

            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case ']':
                {
                    string buffer = sb.ToString();
                    if ($"/{key}" == buffer)
                    {
                        return;
                    }
                    throw new CSReaderException(
                              $"ERROR: INVALID END TAG DEFINITION! -> '{buffer}' != '/{key}'");
                }

                case '\n':
                case '\r':
                case '[':
                case '\t':
                    throw new CSReaderException($"ERROR: INVALID END TAG DEFINITION! -> invalid char '{c}'");
                }
                sb.Append(c);
            }
            throw new CSReaderException($"ERROR: NO END TAG FOUND! -> {sb}");
        }
예제 #6
0
        /// <summary>
        ///     A CSStreamReader extension method that reads start tag.
        /// </summary>
        /// <param name="stream">          The stream to act on. </param>
        /// <param name="key">             [out] The key. </param>
        /// <param name="baseTypeInfo">    [out] Information describing the base type. </param>
        /// <param name="genericTypeInfo"> [out] Information describing the generic type. </param>
        /// <param name="dimensionInfo">   [out] Information describing the dimension. </param>
        /// <returns>
        ///     True if it succeeds, false if it fails.
        /// </returns>
        /// <exception cref="CSReaderException">
        ///     Thrown when a Create struct Reader error condition
        ///     occurs.
        /// </exception>
        internal static bool ReadStartTag(this CSStreamReader stream,
                                          out string key,
                                          out string baseTypeInfo,
                                          out string genericTypeInfo,
                                          out string dimensionInfo)
        {
            StringBuilder sb = new StringBuilder(128);

            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case ']':
                {
                    string buffer = sb.ToString();

                    Match match = s_keyInfoMatcher.Match(buffer);
                    if (!match.Success)
                    {
                        key             = buffer;
                        baseTypeInfo    = string.Empty;
                        genericTypeInfo = string.Empty;
                        dimensionInfo   = string.Empty;
                        return(false);
                    }

                    key = match.Groups[1].Success
                                ? match.Groups[1].Value
                                : throw new CSReaderException(
                                    $"ERROR: KEY:INFO DOES NOT MATCH CONDITIONS! -> '{buffer}'");

                    baseTypeInfo = match.Groups[2].Success
                                ? match.Groups[2].Value
                                : throw new CSReaderException(
                                             $"ERROR: BASE TYPE DOES NOT MATCH CONDITIONS! -> '{buffer}'");

                    genericTypeInfo = match.Groups[3].Success
                                ? match.Groups[3].Value
                                : string.Empty;

                    dimensionInfo = match.Groups[4].Success
                                ? match.Groups[4].Value
                                : string.Empty;
                    return(true);
                }

                case '\n':
                case '[':
                case '\r':
                case '\t':
                    throw new CSReaderException($"ERROR: INVALID KEY:INFO DEFINITION! -> invalid char '{c}'");
                }
                sb.Append(c);
            }
            throw new CSReaderException($"ERROR: NO KEY FOUND! -> {sb}");
        }
예제 #7
0
        /// <summary>
        ///     A CSStreamReader extension method that reads start tag inner.
        /// </summary>
        /// <param name="stream">        The stream to act on. </param>
        /// <param name="key">           [out] The key. </param>
        /// <param name="dimensionInfo"> [out] Information describing the dimension. </param>
        /// <exception cref="CSReaderException">
        ///     Thrown when a Create struct Reader error condition
        ///     occurs.
        /// </exception>
        private static void ReadStartTagInner(this CSStreamReader stream, out string key, out string dimensionInfo)
        {
            StringBuilder sb = new StringBuilder(128);

            while (stream.ReadChar(out char c))
            {
                switch (c)
                {
                case ']':
                {
                    string buffer = sb.ToString();

                    Match match = s_kvInfoMatcher.Match(buffer);
                    if (!match.Success)
                    {
                        dimensionInfo = string.Empty;
                        throw new CSReaderException($"ERROR: INVALID START TAG DEFINITION! -> '{buffer}'");
                    }

                    key = match.Groups[1].Success
                                ? match.Groups[1].Value
                                : string.Empty;

                    dimensionInfo = match.Groups[2].Success
                                ? match.Groups[2].Value
                                : string.Empty;

                    return;
                }

                case '\n':
                case '[':
                case '\r':
                case '\t':
                    throw new CSReaderException($"ERROR: INVALID START DEFINITION! -> invalid char '{c}'");
                }
                sb.Append(c);
            }
            throw new CSReaderException($"ERROR: NO KEY FOUND! -> {sb}");
        }