1 /* 2 * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 ******************************************************************************* 28 * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved * 29 * * 30 * The original version of this source code and documentation is copyrighted * 31 * and owned by IBM, These materials are provided under terms of a License * 32 * Agreement between IBM and Sun. This technology is protected by multiple * 33 * US and International patents. This notice and attribution to IBM may not * 34 * to removed. * 35 ******************************************************************************* 36 */ 37 38 package sun.text.normalizer; 39 40 /** 41 * DLF docs must define behavior when Replaceable is mutated underneath 42 * the iterator. 43 * 44 * This and ICUCharacterIterator share some code, maybe they should share 45 * an implementation, or the common state and implementation should be 46 * moved up into UCharacterIterator. 47 * 48 * What are first, last, and getBeginIndex doing here?!?!?! 49 */ 50 public class ReplaceableUCharacterIterator extends UCharacterIterator { 51 52 // public constructor ------------------------------------------------------ 53 54 /** 55 * Public constructor 56 * @param str text which the iterator will be based on 57 */ 58 public ReplaceableUCharacterIterator(String str){ 59 if(str==null){ 60 throw new IllegalArgumentException(); 61 } 62 this.replaceable = new ReplaceableString(str); 63 this.currentIndex = 0; 64 } 65 66 //// for StringPrep 67 /** 68 * Public constructor 69 * @param buf buffer of text on which the iterator will be based 70 */ 71 public ReplaceableUCharacterIterator(StringBuffer buf){ 72 if(buf==null){ 73 throw new IllegalArgumentException(); 74 } 75 this.replaceable = new ReplaceableString(buf); 76 this.currentIndex = 0; 77 } 78 79 // public methods ---------------------------------------------------------- 80 81 /** 82 * Creates a copy of this iterator, does not clone the underlying 83 * <code>Replaceable</code>object 84 * @return copy of this iterator 85 */ 86 public Object clone(){ 87 try { 88 return super.clone(); 89 } catch (CloneNotSupportedException e) { 90 return null; // never invoked 91 } 92 } 93 94 /** 95 * Returns the current UTF16 character. 96 * @return current UTF16 character 97 */ 98 public int current(){ 99 if (currentIndex < replaceable.length()) { 100 return replaceable.charAt(currentIndex); 101 } 102 return DONE; 103 } 104 105 /** 106 * Returns the length of the text 107 * @return length of the text 108 */ 109 public int getLength(){ 110 return replaceable.length(); 111 } 112 113 /** 114 * Gets the current currentIndex in text. 115 * @return current currentIndex in text. 116 */ 117 public int getIndex(){ 118 return currentIndex; 119 } 120 121 /** 122 * Returns next UTF16 character and increments the iterator's currentIndex by 1. 123 * If the resulting currentIndex is greater or equal to the text length, the 124 * currentIndex is reset to the text length and a value of DONECODEPOINT is 125 * returned. 126 * @return next UTF16 character in text or DONE if the new currentIndex is off the 127 * end of the text range. 128 */ 129 public int next(){ 130 if (currentIndex < replaceable.length()) { 131 return replaceable.charAt(currentIndex++); 132 } 133 return DONE; 134 } 135 136 137 /** 138 * Returns previous UTF16 character and decrements the iterator's currentIndex by 139 * 1. 140 * If the resulting currentIndex is less than 0, the currentIndex is reset to 0 and a 141 * value of DONECODEPOINT is returned. 142 * @return next UTF16 character in text or DONE if the new currentIndex is off the 143 * start of the text range. 144 */ 145 public int previous(){ 146 if (currentIndex > 0) { 147 return replaceable.charAt(--currentIndex); 148 } 149 return DONE; 150 } 151 152 /** 153 * <p>Sets the currentIndex to the specified currentIndex in the text and returns that 154 * single UTF16 character at currentIndex. 155 * This assumes the text is stored as 16-bit code units.</p> 156 * @param currentIndex the currentIndex within the text. 157 * @exception IllegalArgumentException is thrown if an invalid currentIndex is 158 * supplied. i.e. currentIndex is out of bounds. 159 * @return the character at the specified currentIndex or DONE if the specified 160 * currentIndex is equal to the end of the text. 161 */ 162 public void setIndex(int currentIndex) { 163 if (currentIndex < 0 || currentIndex > replaceable.length()) { 164 throw new IllegalArgumentException(); 165 } 166 this.currentIndex = currentIndex; 167 } 168 169 //// for StringPrep 170 public int getText(char[] fillIn, int offset){ 171 int length = replaceable.length(); 172 if(offset < 0 || offset + length > fillIn.length){ 173 throw new IndexOutOfBoundsException(Integer.toString(length)); 174 } 175 replaceable.getChars(0,length,fillIn,offset); 176 return length; 177 } 178 179 // private data members ---------------------------------------------------- 180 181 /** 182 * Replaceable object 183 */ 184 private Replaceable replaceable; 185 /** 186 * Current currentIndex 187 */ 188 private int currentIndex; 189 190 }