private static IReadOnlyList <FoundEntry> FindEntries(InputParseResult input) { var foundEntries = new List <FoundEntry>(); AhoAutomat ahoAutomat = GetAhoAutomatWithBuildedBohr(input.Entries); Dictionary <string, string> caseSensitiveEntries = input.Entries .ToDictionary(x => x.ToLower(), x => x); for (int lineNumber = 0; lineNumber < input.Lines.Count; lineNumber++) { string line = input.Lines[lineNumber]; for (int charPosition = 0; charPosition < line.Length; charPosition++) { char ch = line[charPosition]; ahoAutomat.SetNextState(char.ToLowerInvariant(ch)); IReadOnlyList <string> currentEntries = ahoAutomat.GetCurrentEntries(); foreach (string currentEntry in currentEntries) { var entryWithEndPosition = new FoundEntry { Line = lineNumber, Position = charPosition, Word = caseSensitiveEntries[currentEntry] }; foundEntries.Add(BuildEntryWithStartPosition(input.Lines, entryWithEndPosition)); } } ahoAutomat.SetNextState(' '); } return(foundEntries); }
public static FoundEntry BuildEntryWithStartPosition(List <string> inputLines, FoundEntry foundEnrtyWithEndPosition) { var line = foundEnrtyWithEndPosition.Line; var pos = foundEnrtyWithEndPosition.Position - foundEnrtyWithEndPosition.Word.Length + 1; while (pos < 0) { line -= 1; pos += inputLines[line].Length + 1; } return(new FoundEntry { Position = pos, Line = line, Word = foundEnrtyWithEndPosition.Word }); }