1591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch/*
2591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * Copyright (C) 2013, Google Inc. All rights reserved.
3591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *
4591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * Redistribution and use in source and binary forms, with or without
5591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * modification, are permitted provided that the following conditions
6591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * are met:
7591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * 1.  Redistributions of source code must retain the above copyright
8591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *     notice, this list of conditions and the following disclaimer.
9591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * 2.  Redistributions in binary form must reproduce the above copyright
10591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *     notice, this list of conditions and the following disclaimer in the
11591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *     documentation and/or other materials provided with the distribution.
12591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch *
13591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch */
24591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
25591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "config.h"
26591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/TextPosition.h"
27591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassOwnPtr.h"
29591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/StdLibExtras.h"
30591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochnamespace WTF {
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
33591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochPassOwnPtr<Vector<unsigned> > lineEndings(const String& text)
34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    OwnPtr<Vector<unsigned> > result(adoptPtr(new Vector<unsigned>()));
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
37591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    unsigned start = 0;
38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    while (start < text.length()) {
39591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        size_t lineEnd = text.find('\n', start);
4006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (lineEnd == kNotFound)
41591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            break;
42591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        result->append(static_cast<unsigned>(lineEnd));
44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        start = lineEnd + 1;
45591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
46591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    result->append(text.length());
47591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
48591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return result.release();
49591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
50591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
51a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochOrdinalNumber TextPosition::toOffset(const Vector<unsigned>& lineEndings)
52a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
53a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    unsigned lineStartOffset = m_line != OrdinalNumber::first() ? lineEndings.at(m_line.zeroBasedInt() - 1) + 1 : 0;
54a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return OrdinalNumber::fromZeroBasedInt(lineStartOffset + m_column.zeroBasedInt());
55a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
56a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
57591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochTextPosition TextPosition::fromOffsetAndLineEndings(unsigned offset, const Vector<unsigned>& lineEndings)
58591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const unsigned* foundLineEnding = std::lower_bound(lineEndings.begin(), lineEndings.end(), offset);
60591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    int lineIndex = foundLineEnding - &lineEndings.at(0);
61591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    unsigned lineStartOffset = lineIndex > 0 ? lineEndings.at(lineIndex - 1) + 1 : 0;
62591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    int column = offset - lineStartOffset;
63591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return TextPosition(OrdinalNumber::fromZeroBasedInt(lineIndex), OrdinalNumber::fromZeroBasedInt(column));
64591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} // namespace WTF
67