Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2025 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 119 : StringTokenizer::StringTokenizer() :
46 119 : myPos(0) {
47 119 : }
48 :
49 :
50 4837492 : StringTokenizer::StringTokenizer(std::string tosplit) :
51 4837492 : myTosplit(tosplit), myPos(0) {
52 4837492 : prepareWhitechar(tosplit);
53 4837492 : }
54 :
55 :
56 15712258 : StringTokenizer::StringTokenizer(std::string tosplit, std::string token, bool splitAtAllChars) :
57 15712258 : myTosplit(tosplit), myPos(0) {
58 15712258 : prepare(tosplit, token, splitAtAllChars);
59 15712258 : }
60 :
61 :
62 2523 : StringTokenizer::StringTokenizer(std::string tosplit, int special) :
63 2523 : myTosplit(tosplit), myPos(0) {
64 2523 : 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 522 : default:
75 522 : char* buf = new char[2];
76 522 : buf[0] = (char) special;
77 522 : buf[1] = 0;
78 522 : prepare(tosplit, buf, false);
79 522 : delete[] buf;
80 : break;
81 : }
82 2523 : }
83 :
84 :
85 20552392 : StringTokenizer::~StringTokenizer() {}
86 :
87 :
88 2994906 : void StringTokenizer::reinit() {
89 2994906 : myPos = 0;
90 2994906 : }
91 :
92 :
93 33532955 : bool StringTokenizer::hasNext() {
94 33532955 : return myPos != (int)myStarts.size();
95 : }
96 :
97 :
98 47098074 : std::string StringTokenizer::next() {
99 47098074 : if (myPos >= (int)myStarts.size()) {
100 8 : throw OutOfBoundsException();
101 : }
102 47098070 : if (myLengths[myPos] == 0) {
103 85 : myPos++;
104 85 : return "";
105 : }
106 47097985 : int start = myStarts[myPos];
107 47097985 : int length = myLengths[myPos++];
108 47097985 : return myTosplit.substr(start, length);
109 : }
110 :
111 :
112 941 : std::string StringTokenizer::front() {
113 941 : if (myStarts.size() == 0) {
114 0 : throw OutOfBoundsException();
115 : }
116 941 : if (myLengths[0] == 0) {
117 0 : return "";
118 : }
119 941 : return myTosplit.substr(myStarts[0], myLengths[0]);
120 : }
121 :
122 :
123 280125 : std::string StringTokenizer::get(int pos) const {
124 280125 : if (pos >= (int)myStarts.size()) {
125 4 : throw OutOfBoundsException();
126 : }
127 280123 : if (myLengths[pos] == 0) {
128 574 : return "";
129 : }
130 279549 : int start = myStarts[pos];
131 : int length = myLengths[pos];
132 279549 : return myTosplit.substr(start, length);
133 : }
134 :
135 :
136 24891279 : int StringTokenizer::size() const {
137 24891279 : return (int)myStarts.size();
138 : }
139 :
140 :
141 15713460 : void StringTokenizer::prepare(const std::string& tosplit, const std::string& token, bool splitAtAllChars) {
142 15713460 : int beg = 0;
143 15713460 : int len = (int)token.length();
144 15713460 : if (splitAtAllChars) {
145 : len = 1;
146 : }
147 49913735 : while (beg < (int)tosplit.length()) {
148 : std::string::size_type end;
149 34200275 : if (splitAtAllChars) {
150 14194 : end = tosplit.find_first_of(token, beg);
151 : } else {
152 34186081 : end = tosplit.find(token, beg);
153 : }
154 34200275 : if (end == std::string::npos) {
155 : end = tosplit.length();
156 : }
157 34200275 : myStarts.push_back(beg);
158 34200275 : myLengths.push_back((int)end - beg);
159 34200275 : beg = (int)end + len;
160 34200275 : if (beg == (int)tosplit.length()) {
161 44 : myStarts.push_back(beg - 1);
162 44 : myLengths.push_back(0);
163 : }
164 : }
165 15713460 : }
166 :
167 :
168 4838813 : void StringTokenizer::prepareWhitechar(const std::string& tosplit) {
169 : std::string::size_type len = tosplit.length();
170 : std::string::size_type beg = 0;
171 4838907 : while (beg < len && tosplit[beg] <= SPACE) {
172 94 : beg++;
173 : }
174 19276082 : while (beg != std::string::npos && beg < len) {
175 : std::string::size_type end = beg;
176 165309204 : while (end < len && tosplit[end] > SPACE) {
177 150871935 : end++;
178 : }
179 14437269 : myStarts.push_back((int)beg);
180 14437269 : myLengths.push_back((int)end - (int)beg);
181 : beg = end;
182 24754900 : while (beg < len && tosplit[beg] <= SPACE) {
183 10317631 : beg++;
184 : }
185 : }
186 4838813 : }
187 :
188 :
189 : std::vector<std::string>
190 2994905 : StringTokenizer::getVector() {
191 : std::vector<std::string> ret;
192 2994905 : ret.reserve(size());
193 9867656 : while (hasNext()) {
194 13745502 : ret.push_back(next());
195 : }
196 2994905 : reinit();
197 2994905 : return ret;
198 0 : }
199 :
200 :
201 : std::set<std::string>
202 29 : StringTokenizer::getSet() {
203 29 : std::vector<std::string> v = getVector();
204 58 : return std::set<std::string>(v.begin(), v.end());
205 29 : }
206 :
207 :
208 : /****************************************************************************/
|