Example #1
0
        public int IndexOf(string text, int startIndex, int length)
        {
            Place place      = PlaceOf(startIndex);
            int   linesCount = LinesCount;

            if (text.IndexOf('\n') == -1 && text.IndexOf('\r') == -1)
            {
                return(SingleLineIndexOf(text, startIndex, length, place));
            }
            LineSubdivider subdivider = new LineSubdivider(text, true);

            if (subdivider.GetLinesCount() == 1)
            {
                return(SingleLineIndexOf(text, startIndex, length, place));
            }
            string[]     texts     = subdivider.GetLines();
            string       text0     = texts[0];
            LineIterator iteratorI = GetLineRange(place.iLine, linesCount - place.iLine);

            iteratorI.MoveNext();
            if (place.iChar > iteratorI.current.charsCount - text0.Length)
            {
                iteratorI.MoveNext();
            }
            while (true)
            {
                Line line = iteratorI.current;
                if (line.Text.EndsWith(text0))
                {
                    int  i       = iteratorI.Index;
                    bool correct = i + texts.Length <= linesCount;
                    if (correct)
                    {
                        LineIterator iteratorJ = iteratorI.GetNextRange(texts.Length - 1);
                        for (int j = 1; j < texts.Length - 1 && correct; j++)
                        {
                            iteratorJ.MoveNext();
                            if (texts[j] != iteratorJ.current.Text)
                            {
                                correct = false;
                            }
                        }
                        iteratorJ.MoveNext();
                        if (correct && iteratorJ.current.Text.StartsWith(texts[texts.Length - 1]))
                        {
                            return(IndexOf(new Place(line.Text.Length - text0.Length, i)));
                        }
                    }
                }
                if (!iteratorI.MoveNext())
                {
                    break;
                }
            }
            return(-1);
        }