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