1 /*
   2  * Copyright (c) 2005, 2015, 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 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     /**
  67      * Public constructor
  68      * @param buf buffer of text on which the iterator will be based
  69      */
  70     public ReplaceableUCharacterIterator(StringBuffer buf){
  71         if(buf==null){
  72             throw new IllegalArgumentException();
  73         }
  74         this.replaceable  = new ReplaceableString(buf);
  75         this.currentIndex = 0;
  76     }
  77 
  78     // public methods ----------------------------------------------------------
  79 
  80     /**
  81      * Creates a copy of this iterator, does not clone the underlying
  82      * <code>Replaceable</code>object
  83      * @return copy of this iterator
  84      */
  85     public Object clone(){
  86         try {
  87           return super.clone();
  88         } catch (CloneNotSupportedException e) {
  89             return null; // never invoked
  90         }
  91     }
  92 
  93     /**
  94      * Returns the current UTF16 character.
  95      * @return current UTF16 character
  96      */
  97     public int current(){
  98         if (currentIndex < replaceable.length()) {
  99             return replaceable.charAt(currentIndex);
 100         }
 101         return DONE;
 102     }
 103 
 104     /**
 105      * Returns the length of the text
 106      * @return length of the text
 107      */
 108     public int getLength(){
 109         return replaceable.length();
 110     }
 111 
 112     /**
 113      * Gets the current currentIndex in text.
 114      * @return current currentIndex in text.
 115      */
 116     public int getIndex(){
 117         return currentIndex;
 118     }
 119 
 120     /**
 121      * Returns next UTF16 character and increments the iterator's currentIndex by 1.
 122      * If the resulting currentIndex is greater or equal to the text length, the
 123      * currentIndex is reset to the text length and a value of DONECODEPOINT is
 124      * returned.
 125      * @return next UTF16 character in text or DONE if the new currentIndex is off the
 126      *         end of the text range.
 127      */
 128     public int next(){
 129         if (currentIndex < replaceable.length()) {
 130             return replaceable.charAt(currentIndex++);
 131         }
 132         return DONE;
 133     }
 134 
 135 
 136     /**
 137      * Returns previous UTF16 character and decrements the iterator's currentIndex by
 138      * 1.
 139      * If the resulting currentIndex is less than 0, the currentIndex is reset to 0 and a
 140      * value of DONECODEPOINT is returned.
 141      * @return next UTF16 character in text or DONE if the new currentIndex is off the
 142      *         start of the text range.
 143      */
 144     public int previous(){
 145         if (currentIndex > 0) {
 146             return replaceable.charAt(--currentIndex);
 147         }
 148         return DONE;
 149     }
 150 
 151     /**
 152      * Sets the currentIndex to the specified currentIndex in the text and returns that
 153      * single UTF16 character at currentIndex.
 154      * This assumes the text is stored as 16-bit code units.
 155      * @param currentIndex the currentIndex within the text.
 156      * @exception IllegalArgumentException is thrown if an invalid currentIndex is
 157      *            supplied. i.e. currentIndex is out of bounds.
 158      */
 159     public void setIndex(int currentIndex) {
 160         if (currentIndex < 0 || currentIndex > replaceable.length()) {
 161             throw new IllegalArgumentException();
 162         }
 163         this.currentIndex = currentIndex;
 164     }
 165 
 166     public int getText(char[] fillIn, int offset){
 167         int length = replaceable.length();
 168         if(offset < 0 || offset + length > fillIn.length){
 169             throw new IndexOutOfBoundsException(Integer.toString(length));
 170         }
 171         replaceable.getChars(0,length,fillIn,offset);
 172         return length;
 173     }
 174 
 175     // private data members ----------------------------------------------------
 176 
 177     /**
 178      * Replaceable object
 179      */
 180     private Replaceable replaceable;
 181     /**
 182      * Current currentIndex
 183      */
 184     private int currentIndex;
 185 
 186 }