Line data Source code
1 : /* 2 : * ALMA - Atacama Large Millimeter Array 3 : * (c) European Southern Observatory, 2002 4 : * (c) Associated Universities Inc., 2002 5 : * Copyright by ESO (in the framework of the ALMA collaboration), 6 : * Copyright by AUI (in the framework of the ALMA collaboration), 7 : * All rights reserved. 8 : * 9 : * This library is free software; you can redistribute it and/or 10 : * modify it under the terms of the GNU Lesser General Public 11 : * License as published by the Free software Foundation; either 12 : * version 2.1 of the License, or (at your option) any later version. 13 : * 14 : * This library is distributed in the hope that it will be useful, 15 : * but WITHOUT ANY WARRANTY, without even the implied warranty of 16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 : * Lesser General Public License for more details. 18 : * 19 : * You should have received a copy of the GNU Lesser General Public 20 : * License along with this library; if not, write to the Free Software 21 : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 22 : * MA 02111-1307 USA 23 : * 24 : * File StringTokenizer.cpp 25 : */ 26 : 27 : #include <alma/ASDM/StringTokenizer.h> 28 : 29 : #include <iostream> 30 : using namespace std; 31 : 32 : namespace asdm { 33 : 34 1254 : StringTokenizer::StringTokenizer(const string &s, const string &delim, bool returnDelims) { 35 1254 : currentPosition = 0; 36 1254 : newPosition = -1; 37 1254 : delimsChanged = false; 38 1254 : maxPosition = s.length(); 39 1254 : str = new char [maxPosition + 1]; 40 1254 : int i = 0; 41 79453 : for (i = 0; i < maxPosition; i++) 42 78199 : str[i] = s.at(i); 43 1254 : str[i] = '\0'; 44 1254 : ostr = new string (str); 45 1254 : numDelimiters = delim.length(); 46 1254 : strDelimiter = delim; 47 : //delimiter = new char [numDelimiters]; 48 1254 : delimiter = strDelimiter.data(); 49 : //for (i = 0; i < numDelimiters; i++) 50 : // delimiter[i] = delim.at(i); 51 1254 : retDelims = returnDelims; 52 1254 : setMaxDelimChar(); 53 1254 : } 54 : 55 1254 : StringTokenizer::~StringTokenizer() { 56 1254 : delete [] str; 57 1254 : delete ostr; 58 : //delete [] delimiter; 59 1254 : } 60 : 61 1327 : void StringTokenizer::setMaxDelimChar() { 62 1327 : if (numDelimiters == 0) { 63 0 : throw InvalidArgumentException("Delimiters cannot be null."); 64 : } 65 1327 : char m = 0; 66 2654 : for (int i = 0; i < numDelimiters; i++) { 67 1327 : char c = delimiter[i]; 68 1327 : if (m < c) 69 1327 : m = c; 70 : } 71 1327 : maxDelimChar = m; 72 1327 : } 73 : 74 23249 : int StringTokenizer::indexOfDelimiters(char c) { 75 : // int nd = 0; // set but never used 76 23395 : for (int i = 0; i < numDelimiters; ++i) { 77 : // nd = delimiter[i]; // set but never used 78 23249 : if (c == delimiter[i]) { 79 23103 : return i; 80 : } 81 : } 82 146 : return -1; 83 : } 84 : 85 14021 : int StringTokenizer::skipDelimiters(int startPos) { 86 14021 : if (numDelimiters == 0) { 87 0 : throw InvalidArgumentException("Delimiters cannot be null."); 88 : } 89 14021 : int position = startPos; 90 25536 : while (!retDelims && position < maxPosition) { 91 24284 : char c = str[position]; 92 24284 : if ((c > maxDelimChar) || (indexOfDelimiters(c) < 0)) 93 12769 : break; 94 11515 : position++; 95 : } 96 14021 : return position; 97 : } 98 : 99 12769 : int StringTokenizer::scanToken(int startPos) { 100 12769 : int position = startPos; 101 79453 : while (position < maxPosition) { 102 78272 : char c = str[position]; 103 78272 : if ((c <= maxDelimChar) && (indexOfDelimiters(c) >= 0)) 104 11588 : break; 105 66684 : position++; 106 : } 107 12769 : if (retDelims && (startPos == position)) { 108 0 : char c = str[position]; 109 0 : if ((c <= maxDelimChar) && (indexOfDelimiters(c) >= 0)) 110 0 : position++; 111 : } 112 12769 : return position; 113 : } 114 : 115 1252 : bool StringTokenizer::hasMoreTokens() { 116 : // Temporary store this position and use it in the following 117 : // nextToken() method only if the delimiters have'nt been changed in 118 : // that nextToken() invocation. 119 1252 : newPosition = skipDelimiters(currentPosition); 120 1252 : return (newPosition < maxPosition); 121 : } 122 : 123 12769 : string StringTokenizer::nextToken() { 124 : // If next position already computed in hasMoreElements() and 125 : // delimiters have changed between the computation and this invocation, 126 : // then use the computed value. 127 : 128 12769 : currentPosition = (newPosition >= 0 && !delimsChanged) ? 129 12769 : newPosition : skipDelimiters(currentPosition); 130 : 131 : // Reset these anyway 132 12769 : delimsChanged = false; 133 12769 : newPosition = -1; 134 : 135 12769 : if (currentPosition >= maxPosition) 136 0 : throw OutOfBoundsException("No more tokens."); 137 12769 : int start = currentPosition; 138 12769 : currentPosition = scanToken(currentPosition); 139 12769 : return ostr->substr(start, (currentPosition - start)); 140 : } 141 : 142 73 : string StringTokenizer::nextToken(const string delim) { 143 73 : numDelimiters = delim.length(); 144 73 : strDelimiter = delim; 145 73 : delimiter = strDelimiter.data(); 146 : //delimiter = new char [numDelimiters]; 147 : //for (int i = 0; i < numDelimiters; ++i) 148 : // delimiter[i] = delim.at(i); 149 : 150 : // delimiter string specified, so set the appropriate flag. 151 73 : delimsChanged = true; 152 : 153 73 : setMaxDelimChar(); 154 73 : return nextToken(); 155 : } 156 : 157 0 : int StringTokenizer::countTokens() { 158 0 : int count = 0; 159 0 : int currpos = currentPosition; 160 0 : while (currpos < maxPosition) { 161 0 : currpos = skipDelimiters(currpos); 162 0 : if (currpos >= maxPosition) 163 0 : break; 164 0 : currpos = scanToken(currpos); 165 0 : count++; 166 : } 167 0 : return count; 168 : } 169 : 170 : } // End namespace.