public override List <FilePositionSpan> Search(SearchContentsData searchContentsData) { if (ReferenceEquals(this, _empty)) { return(NoSpans); } // TODO(rpaquay): Maybe we will need this someday. For now, we use this class only for empty file content placeholder. throw new NotImplementedException(); #if false Logger.Log("Searching file contents"); List <FilePositionSpan> result = null; var index = 0; while (true) { var newIndex = _text.IndexOf(searchContentsData.Text, index, StringComparison.Ordinal); if (newIndex < 0) { break; } if (result == null) { result = new List <FilePositionSpan>(); } result.Add(newIndex); index = newIndex + searchContentsData.Text.Length; } return(result ?? NoPositions); #endif }
public override List <FilePositionSpan> Search(SearchContentsData searchContentsData) { if (searchContentsData.ParsedSearchString.MainEntry.Text.Length > ByteLength) { return(NoSpans); } var algo = searchContentsData.GetSearchAlgorithms(searchContentsData.ParsedSearchString.MainEntry).AsciiStringSearchAlgo; // TODO(rpaquay): We are limited to 2GB for now. var result = algo.SearchAll(Pointer, (int)ByteLength); if (searchContentsData.ParsedSearchString.EntriesBeforeMainEntry.Count == 0 && searchContentsData.ParsedSearchString.EntriesAfterMainEntry.Count == 0) { return(result.ToList()); } return(FilterOnOtherEntries(searchContentsData, result).ToList()); }
private IEnumerable <FilePositionSpan> FilterOnOtherEntries(SearchContentsData searchContentsData, IEnumerable <FilePositionSpan> matches) { FindEntryFunction findEntry = (position, length, entry) => { var algo = searchContentsData.GetSearchAlgorithms(entry).AsciiStringSearchAlgo; var start = Pointers.AddPtr(this.Pointer, position); var result = algo.Search(start, length); if (result == IntPtr.Zero) { return(-1); } return(position + Pointers.Offset32(start, result)); }; GetLineExtentFunction getLineExtent = position => { int lineStart; int lineLength; NativeMethods.Ascii_GetLineExtentFromPosition(this.Pointer, (int)this.CharacterCount, position, out lineStart, out lineLength); return(new FilePositionSpan { Position = lineStart, Length = lineLength }); }; return(new TextSourceTextSearch(getLineExtent, findEntry).FilterOnOtherEntries(searchContentsData.ParsedSearchString, matches)); }
public virtual List <FilePositionSpan> Search(SearchContentsData searchContentsData) { return(NoSpans); }