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