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 4815662 : StringTokenizer::StringTokenizer(std::string tosplit) :
51 4815662 : myTosplit(tosplit), myPos(0) {
52 4815662 : prepareWhitechar(tosplit);
53 4815662 : }
54 :
55 :
56 15477566 : StringTokenizer::StringTokenizer(std::string tosplit, std::string token, bool splitAtAllChars) :
57 15477566 : myTosplit(tosplit), myPos(0) {
58 15477566 : prepare(tosplit, token, splitAtAllChars);
59 15477566 : }
60 :
61 :
62 2524 : StringTokenizer::StringTokenizer(std::string tosplit, int special) :
63 2524 : myTosplit(tosplit), myPos(0) {
64 2524 : 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 523 : default:
75 523 : char* buf = new char[2];
76 523 : buf[0] = (char) special;
77 523 : buf[1] = 0;
78 523 : prepare(tosplit, buf, false);
79 523 : delete[] buf;
80 : break;
81 : }
82 2524 : }
83 :
84 :
85 20295871 : StringTokenizer::~StringTokenizer() {}
86 :
87 :
88 2923883 : void StringTokenizer::reinit() {
89 2923883 : myPos = 0;
90 2923883 : }
91 :
92 :
93 33094255 : bool StringTokenizer::hasNext() {
94 33094255 : return myPos != (int)myStarts.size();
95 : }
96 :
97 :
98 46481495 : std::string StringTokenizer::next() {
99 46481495 : if (myPos >= (int)myStarts.size()) {
100 8 : throw OutOfBoundsException();
101 : }
102 46481491 : if (myLengths[myPos] == 0) {
103 85 : myPos++;
104 85 : return "";
105 : }
106 46481406 : int start = myStarts[myPos];
107 46481406 : int length = myLengths[myPos++];
108 46481406 : 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 280110 : std::string StringTokenizer::get(int pos) const {
124 280110 : if (pos >= (int)myStarts.size()) {
125 4 : throw OutOfBoundsException();
126 : }
127 280108 : if (myLengths[pos] == 0) {
128 574 : return "";
129 : }
130 279534 : int start = myStarts[pos];
131 : int length = myLengths[pos];
132 279534 : return myTosplit.substr(start, length);
133 : }
134 :
135 :
136 24537108 : int StringTokenizer::size() const {
137 24537108 : return (int)myStarts.size();
138 : }
139 :
140 :
141 15478769 : void StringTokenizer::prepare(const std::string& tosplit, const std::string& token, bool splitAtAllChars) {
142 15478769 : int beg = 0;
143 15478769 : int len = (int)token.length();
144 15478769 : if (splitAtAllChars) {
145 : len = 1;
146 : }
147 49198025 : while (beg < (int)tosplit.length()) {
148 : std::string::size_type end;
149 33719256 : if (splitAtAllChars) {
150 14363 : end = tosplit.find_first_of(token, beg);
151 : } else {
152 33704893 : end = tosplit.find(token, beg);
153 : }
154 33719256 : if (end == std::string::npos) {
155 : end = tosplit.length();
156 : }
157 33719256 : myStarts.push_back(beg);
158 33719256 : myLengths.push_back((int)end - beg);
159 33719256 : beg = (int)end + len;
160 33719256 : if (beg == (int)tosplit.length()) {
161 44 : myStarts.push_back(beg - 1);
162 44 : myLengths.push_back(0);
163 : }
164 : }
165 15478769 : }
166 :
167 :
168 4816983 : void StringTokenizer::prepareWhitechar(const std::string& tosplit) {
169 : std::string::size_type len = tosplit.length();
170 : std::string::size_type beg = 0;
171 4817077 : while (beg < len && tosplit[beg] <= SPACE) {
172 94 : beg++;
173 : }
174 19118678 : while (beg != std::string::npos && beg < len) {
175 : std::string::size_type end = beg;
176 164689798 : while (end < len && tosplit[end] > SPACE) {
177 150388103 : end++;
178 : }
179 14301695 : myStarts.push_back((int)beg);
180 14301695 : myLengths.push_back((int)end - (int)beg);
181 : beg = end;
182 24505046 : while (beg < len && tosplit[beg] <= SPACE) {
183 10203351 : beg++;
184 : }
185 : }
186 4816983 : }
187 :
188 :
189 : std::vector<std::string>
190 2923882 : StringTokenizer::getVector() {
191 : std::vector<std::string> ret;
192 2923882 : ret.reserve(size());
193 9663171 : while (hasNext()) {
194 13478578 : ret.push_back(next());
195 : }
196 2923882 : reinit();
197 2923882 : return ret;
198 0 : }
199 :
200 :
201 : std::set<std::string>
202 26 : StringTokenizer::getSet() {
203 26 : std::vector<std::string> v = getVector();
204 52 : return std::set<std::string>(v.begin(), v.end());
205 26 : }
206 :
207 :
208 : /****************************************************************************/
|