Reviewed by Dave.
[WebKit-https.git] / WebCore / khtml / misc / stringit.cpp
1 /*
2     This file is part of the KDE libraries
3
4     Copyright (C) 2004 Apple Computer
5
6     This library is free software; you can redistribute it and/or
7     modify it under the terms of the GNU Library General Public
8     License as published by the Free Software Foundation; either
9     version 2 of the License, or (at your option) any later version.
10
11     This library is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14     Library General Public License for more details.
15
16     You should have received a copy of the GNU Library General Public License
17     along with this library; see the file COPYING.LIB.  If not, write to
18     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19     Boston, MA 02111-1307, USA.
20 */
21
22 #include "stringit.h"
23
24 namespace khtml {
25
26 uint TokenizerString::length() const
27 {
28     uint length = m_currentString.m_length;
29     if (!m_pushedChar1.isNull()) {
30         ++length;
31         if (!m_pushedChar2.isNull())
32             ++length;
33     }
34     if (m_composite) {
35         QValueListConstIterator<TokenizerSubstring> i = m_substrings.begin();
36         QValueListConstIterator<TokenizerSubstring> e = m_substrings.end();
37         for (; i != e; ++i)
38             length += (*i).m_length;
39     }
40     return length;
41 }
42
43 void TokenizerString::clear()
44 {
45     m_pushedChar1 = 0;
46     m_pushedChar2 = 0;
47     m_currentChar = 0;
48     m_currentString.clear();
49     m_substrings.clear();
50     m_lines = 0;
51     m_composite = false;
52 }
53
54 void TokenizerString::append(const TokenizerSubstring &s)
55 {
56     if (s.m_length) {
57         if (!m_currentString.m_length) {
58             m_currentString = s;
59         } else {
60             m_substrings.append(s);
61             m_composite = true;
62         }
63     }
64 }
65
66 void TokenizerString::prepend(const TokenizerSubstring &s)
67 {
68     assert(!escaped());
69     if (s.m_length) {
70         if (!m_currentString.m_length)
71             m_currentString = s;
72         else {
73             // Shift our m_currentString into our list.
74             m_substrings.prepend(m_currentString);
75             m_currentString = s;
76             m_composite = true;
77         }
78     }
79 }
80
81 void TokenizerString::append(const TokenizerString &s)
82 {
83     assert(!s.escaped());
84     append(s.m_currentString);
85     if (s.m_composite) {
86         QValueListConstIterator<TokenizerSubstring> i = s.m_substrings.begin();
87         QValueListConstIterator<TokenizerSubstring> e = s.m_substrings.end();
88         for (; i != e; ++i)
89             append(*i);
90     }
91     m_currentChar = m_pushedChar1.isNull() ? m_currentString.m_current : &m_pushedChar1;
92 }
93
94 void TokenizerString::prepend(const TokenizerString &s)
95 {
96     assert(!escaped());
97     assert(!s.escaped());
98     if (s.m_composite) {
99         QValueListConstIterator<TokenizerSubstring> i = s.m_substrings.fromLast();
100         QValueListConstIterator<TokenizerSubstring> e = s.m_substrings.end();
101         for (; i != e; --i)
102             prepend(*i);
103     }
104     prepend(s.m_currentString);
105     m_currentChar = m_pushedChar1.isNull() ? m_currentString.m_current : &m_pushedChar1;
106 }
107
108 void TokenizerString::advanceSubstring()
109 {
110     if (m_composite) {
111         m_currentString = m_substrings.first();
112         m_substrings.remove(m_substrings.begin());
113         if (m_substrings.isEmpty())
114             m_composite = false;
115     } else {
116         m_currentString.clear();
117     }
118 }
119
120 QString TokenizerString::toString() const
121 {
122     QString result;
123     if (!m_pushedChar1.isNull()) {
124         result.append(m_pushedChar1);
125         if (!m_pushedChar2.isNull())
126             result.append(m_pushedChar2);
127     }
128     m_currentString.appendTo(result);
129     if (m_composite) {
130         QValueListConstIterator<TokenizerSubstring> i = m_substrings.begin();
131         QValueListConstIterator<TokenizerSubstring> e = m_substrings.end();
132         for (; i != e; ++i)
133             (*i).appendTo(result);
134     }
135     return result;
136 }
137
138 }