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 546963 : StringTokenizer::StringTokenizer(const string &s, const string &delim, bool returnDelims) { 35 546963 : currentPosition = 0; 36 546963 : newPosition = -1; 37 546963 : delimsChanged = false; 38 546963 : maxPosition = s.length(); 39 546963 : str = new char [maxPosition + 1]; 40 546963 : int i = 0; 41 219167456 : for (i = 0; i < maxPosition; i++) 42 218620493 : str[i] = s.at(i); 43 546963 : str[i] = '\0'; 44 546963 : ostr = new string (str); 45 546963 : numDelimiters = delim.length(); 46 546963 : strDelimiter = delim; 47 : //delimiter = new char [numDelimiters]; 48 546963 : delimiter = strDelimiter.data(); 49 : //for (i = 0; i < numDelimiters; i++) 50 : // delimiter[i] = delim.at(i); 51 546963 : retDelims = returnDelims; 52 546963 : setMaxDelimChar(); 53 546963 : } 54 : 55 546963 : StringTokenizer::~StringTokenizer() { 56 546963 : delete [] str; 57 546963 : delete ostr; 58 : //delete [] delimiter; 59 546963 : } 60 : 61 549870 : void StringTokenizer::setMaxDelimChar() { 62 549870 : if (numDelimiters == 0) { 63 0 : throw InvalidArgumentException("Delimiters cannot be null."); 64 : } 65 549870 : char m = 0; 66 1099740 : for (int i = 0; i < numDelimiters; i++) { 67 549870 : char c = delimiter[i]; 68 549870 : if (m < c) 69 549870 : m = c; 70 : } 71 549870 : maxDelimChar = m; 72 549870 : } 73 : 74 27486639 : int StringTokenizer::indexOfDelimiters(char c) { 75 : // int nd = 0; // set but never used 76 27494455 : for (int i = 0; i < numDelimiters; ++i) { 77 : // nd = delimiter[i]; // set but never used 78 27486639 : if (c == delimiter[i]) { 79 27478823 : return i; 80 : } 81 : } 82 7816 : return -1; 83 : } 84 : 85 14712824 : int StringTokenizer::skipDelimiters(int startPos) { 86 14712824 : if (numDelimiters == 0) { 87 0 : throw InvalidArgumentException("Delimiters cannot be null."); 88 : } 89 14712824 : int position = startPos; 90 28450782 : while (!retDelims && position < maxPosition) { 91 28022879 : char c = str[position]; 92 28022879 : if ((c > maxDelimChar) || (indexOfDelimiters(c) < 0)) 93 14284921 : break; 94 13737958 : position++; 95 : } 96 14712824 : return position; 97 : } 98 : 99 14284921 : int StringTokenizer::scanToken(int startPos) { 100 14284921 : int position = startPos; 101 219167456 : while (position < maxPosition) { 102 218623400 : char c = str[position]; 103 218623400 : if ((c <= maxDelimChar) && (indexOfDelimiters(c) >= 0)) 104 13740865 : break; 105 204882535 : position++; 106 : } 107 14284921 : if (retDelims && (startPos == position)) { 108 0 : char c = str[position]; 109 0 : if ((c <= maxDelimChar) && (indexOfDelimiters(c) >= 0)) 110 0 : position++; 111 : } 112 14284921 : return position; 113 : } 114 : 115 427903 : 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 427903 : newPosition = skipDelimiters(currentPosition); 120 427903 : return (newPosition < maxPosition); 121 : } 122 : 123 14284921 : 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 14284921 : currentPosition = (newPosition >= 0 && !delimsChanged) ? 129 14284921 : newPosition : skipDelimiters(currentPosition); 130 : 131 : // Reset these anyway 132 14284921 : delimsChanged = false; 133 14284921 : newPosition = -1; 134 : 135 14284921 : if (currentPosition >= maxPosition) 136 0 : throw OutOfBoundsException("No more tokens."); 137 14284921 : int start = currentPosition; 138 14284921 : currentPosition = scanToken(currentPosition); 139 14284921 : return ostr->substr(start, (currentPosition - start)); 140 : } 141 : 142 2907 : string StringTokenizer::nextToken(const string delim) { 143 2907 : numDelimiters = delim.length(); 144 2907 : strDelimiter = delim; 145 2907 : 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 2907 : delimsChanged = true; 152 : 153 2907 : setMaxDelimChar(); 154 2907 : 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.