Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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
            });
        }
Пример #3
0
        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);
                }
            }
        }
Пример #4
0
        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));
        }