public void CollectLineOffsets() { if (_listStartOffsets.Any()) { throw new InvalidOperationException("Object already initialized."); } AddOffset(0); for (byte *p = _blockStart; p < _blockEnd - _characterSize; p += _characterSize) { char ch; if (_characterSize == 1) { ch = (char)*p; } else { ch = *(char *)p; } if (ch == LineBreak) { var byteOffset = Pointers.Offset32(_blockStart, p) + _characterSize; AddOffset(byteOffset / _characterSize); } } }
public FilePositionSpan GetLineExtent(int offset) { var lineNumber = GetLineStartIndex(offset); var lineStartOffset = _listStartOffsets[lineNumber]; var lineEndOffset = (lineNumber == _listStartOffsets.Count - 1) ? Pointers.Offset32(_blockStart, _blockEnd) : _listStartOffsets[lineNumber + 1]; return(new FilePositionSpan { Position = lineStartOffset, Length = lineEndOffset - lineStartOffset }); }
public void CollectLineOffsets() { if (_listStartOffsets.Any()) { throw new InvalidOperationException("Object already initialized."); } AddOffset(0); for (var p = _blockStart; p < _blockEnd - 1; p++) { if (*p == _lineBreak) { AddOffset(Pointers.Offset32(_blockStart, p) + 1); } } }
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)); }