Example #1
0
        public IEnumerable <ReadOnlyListEx <char> > ReadLine()
        {
            var list = new ListEx <char>();

            using var memoryOwner = MemoryPool <char> .Shared.Rent(10 * 1024);

            using var fileStream = File.Open(_filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
            using var sr         = new StreamReader(fileStream);

            var memory = memoryOwner.Memory;

            var tmpMemory   = ArraySegment <char> .Empty;
            var parseResult = new ParseLineResult(ParseLineStatus.Success, 0);

            while (true)
            {
                tmpMemory = ReadSpan(sr, memory.AsArraySegment());
                if (!parseResult.Status.HasFlag(ParseLineStatus.EndlRequired))
                {
                    parseResult = new ParseLineResult(ParseLineStatus.Success, 0);
                }

                if (tmpMemory.Count == 0)
                {
                    if (list.Count != 0)
                    {
                        yield return(list.AsReadonlyEx());

                        list.Clear();
                    }
                    yield break;
                }

                while (parseResult.Status.HasFlag(ParseLineStatus.Success) || (parseResult.Status.HasFlag(ParseLineStatus.EndlRequired) && tmpMemory.Count > 0))
                {
                    parseResult = ParseLine(tmpMemory, list, parseResult.Status);
                    tmpMemory   = tmpMemory.Slice(parseResult.Index);

                    // Faster hasflags...i guess
                    if ((parseResult.Status & ParseLineStatus.Success) != 0)
                    {
                        yield return(list.AsReadonlyEx());

                        list.Clear();
                    }
                }
            }
        }
Example #2
0
        public static Result <Variable, string> ParseLine(string line)
        {
            if (String.IsNullOrWhiteSpace(line))
            {
                return(ParseLineResult.WithFailure(EMPTY_LINE));
            }

            if (line[0] == '#')
            {
                return(ParseLineResult.WithFailure(COMMENT_LINE));
            }

            var match = Regex.Match(line);

            if (match.Success)
            {
                var result = new Variable(match.Groups["key"].Value, match.Groups["value"].Value);
                return(ParseLineResult.WithSuccess(result));
            }

            return(ParseLineResult.WithFailure(E_COULD_NOT_PARSE_LINE));
        }