Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file StringTokenizer.cpp
15 : /// @author Daniel Krajzewicz
16 : /// @author Jakob Erdmann
17 : /// @author Michael Behrisch
18 : /// @date ?
19 : ///
20 : // A java-style StringTokenizer for c++ (stl)
21 : /****************************************************************************/
22 : #include <config.h>
23 :
24 : #include <string>
25 : #include <vector>
26 : #include <iostream> // !!! debug only
27 :
28 : #include "UtilExceptions.h"
29 : #include "StringTokenizer.h"
30 :
31 :
32 : // ===========================================================================
33 : // variable definitions
34 : // ===========================================================================
35 : const int StringTokenizer::NEWLINE = -256;
36 : const int StringTokenizer::WHITECHARS = -257;
37 : const int StringTokenizer::SPACE = 32;
38 : const int StringTokenizer::TAB = 9;
39 :
40 :
41 : // ===========================================================================
42 : // method definitions
43 : // ===========================================================================
44 :
45 120 : StringTokenizer::StringTokenizer() :
46 120 : myPos(0) {
47 120 : }
48 :
49 :
50 5256510 : StringTokenizer::StringTokenizer(std::string tosplit) :
51 5256510 : myTosplit(tosplit), myPos(0) {
52 5256510 : prepareWhitechar(tosplit);
53 5256510 : }
54 :
55 :
56 16512111 : StringTokenizer::StringTokenizer(std::string tosplit, std::string token, bool splitAtAllChars) :
57 16512111 : myTosplit(tosplit), myPos(0) {
58 16512111 : prepare(tosplit, token, splitAtAllChars);
59 16512111 : }
60 :
61 :
62 2525 : StringTokenizer::StringTokenizer(std::string tosplit, int special) :
63 2525 : myTosplit(tosplit), myPos(0) {
64 2525 : switch (special) {
65 : case NEWLINE:
66 1 : prepare(tosplit, "\r\n", true);
67 1 : break;
68 : case TAB:
69 679 : prepare(tosplit, "\t", true);
70 679 : break;
71 1321 : case WHITECHARS:
72 1321 : prepareWhitechar(tosplit);
73 : break;
74 524 : default:
75 524 : char* buf = new char[2];
76 524 : buf[0] = (char) special;
77 524 : buf[1] = 0;
78 524 : prepare(tosplit, buf, false);
79 524 : delete[] buf;
80 : break;
81 : }
82 2525 : }
83 :
84 :
85 21771266 : StringTokenizer::~StringTokenizer() {}
86 :
87 :
88 3313274 : void StringTokenizer::reinit() {
89 3313274 : myPos = 0;
90 3313274 : }
91 :
92 :
93 35721766 : bool StringTokenizer::hasNext() {
94 35721766 : return myPos != (int)myStarts.size();
95 : }
96 :
97 :
98 49743734 : std::string StringTokenizer::next() {
99 49743734 : if (myPos >= (int)myStarts.size()) {
100 8 : throw OutOfBoundsException();
101 : }
102 49743730 : if (myLengths[myPos] == 0) {
103 85 : myPos++;
104 85 : return "";
105 : }
106 49743645 : int start = myStarts[myPos];
107 49743645 : int length = myLengths[myPos++];
108 49743645 : return myTosplit.substr(start, length);
109 : }
110 :
111 :
112 944 : std::string StringTokenizer::front() {
113 944 : if (myStarts.size() == 0) {
114 0 : throw OutOfBoundsException();
115 : }
116 944 : if (myLengths[0] == 0) {
117 0 : return "";
118 : }
119 944 : return myTosplit.substr(myStarts[0], myLengths[0]);
120 : }
121 :
122 :
123 282125 : std::string StringTokenizer::get(int pos) const {
124 282125 : if (pos >= (int)myStarts.size()) {
125 4 : throw OutOfBoundsException();
126 : }
127 282123 : if (myLengths[pos] == 0) {
128 663 : return "";
129 : }
130 281460 : int start = myStarts[pos];
131 : int length = myLengths[pos];
132 281460 : return myTosplit.substr(start, length);
133 : }
134 :
135 :
136 26324520 : int StringTokenizer::size() const {
137 26324520 : return (int)myStarts.size();
138 : }
139 :
140 :
141 16513315 : void StringTokenizer::prepare(const std::string& tosplit, const std::string& token, bool splitAtAllChars) {
142 16513315 : int beg = 0;
143 16513315 : int len = (int)token.length();
144 16513315 : if (splitAtAllChars) {
145 : len = 1;
146 : }
147 52258378 : while (beg < (int)tosplit.length()) {
148 : std::string::size_type end;
149 35745063 : if (splitAtAllChars) {
150 14200 : end = tosplit.find_first_of(token, beg);
151 : } else {
152 35730863 : end = tosplit.find(token, beg);
153 : }
154 35745063 : if (end == std::string::npos) {
155 : end = tosplit.length();
156 : }
157 35745063 : myStarts.push_back(beg);
158 35745063 : myLengths.push_back((int)end - beg);
159 35745063 : beg = (int)end + len;
160 35745063 : if (beg == (int)tosplit.length()) {
161 45 : myStarts.push_back(beg - 1);
162 45 : myLengths.push_back(0);
163 : }
164 : }
165 16513315 : }
166 :
167 :
168 5257831 : void StringTokenizer::prepareWhitechar(const std::string& tosplit) {
169 : std::string::size_type len = tosplit.length();
170 : std::string::size_type beg = 0;
171 5257924 : while (beg < len && tosplit[beg] <= SPACE) {
172 93 : beg++;
173 : }
174 20815203 : while (beg != std::string::npos && beg < len) {
175 : std::string::size_type end = beg;
176 175987749 : while (end < len && tosplit[end] > SPACE) {
177 160430377 : end++;
178 : }
179 15557372 : myStarts.push_back((int)beg);
180 15557372 : myLengths.push_back((int)end - (int)beg);
181 : beg = end;
182 26601602 : while (beg < len && tosplit[beg] <= SPACE) {
183 11044230 : beg++;
184 : }
185 : }
186 5257831 : }
187 :
188 :
189 : std::vector<std::string>
190 3313273 : StringTokenizer::getVector() {
191 : std::vector<std::string> ret;
192 3313273 : ret.reserve(size());
193 10868754 : while (hasNext()) {
194 15110962 : ret.push_back(next());
195 : }
196 3313273 : reinit();
197 3313273 : return ret;
198 0 : }
199 :
200 :
201 : std::set<std::string>
202 31 : StringTokenizer::getSet() {
203 31 : std::vector<std::string> v = getVector();
204 62 : return std::set<std::string>(v.begin(), v.end());
205 31 : }
206 :
207 :
208 : /****************************************************************************/
|