12ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/* GENERATED SOURCE. DO NOT MODIFY. */
22ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/**
32ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*******************************************************************************
4bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin* Copyright (C) 1996-2016, International Business Machines Corporation and    *
52ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* others. All Rights Reserved.                                                *
62ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*******************************************************************************
72ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*/
82ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
92ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpackage android.icu.util;
102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.Enumeration;
122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.NoSuchElementException;
132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport android.icu.text.UTF16;
152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport android.icu.text.UnicodeSet;
162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/**
181537b2f39245c07b00aa78c3600f7aebcb172490Neil Fuller * <strong>[icu enhancement]</strong> ICU's replacement for {@link java.util.Calendar}.&nbsp;Methods, fields, and other functionality specific to ICU are labeled '<strong>[icu]</strong>'.
192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *
202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>The string tokenizer class allows an application to break a string
212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * into tokens by performing code point comparison.
222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * The <code>StringTokenizer</code> methods do not distinguish
232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * among identifiers, numbers, and quoted strings, nor do they recognize
24bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin * and skip comments.
252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * The set of delimiters (the codepoints that separate tokens) may be
272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * specified either at creation time or on a per-token basis.
282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * An instance of <code>StringTokenizer</code> behaves in one of three ways,
302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * depending on whether it was created with the <code>returnDelims</code>
312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * and <code>coalesceDelims</code>
322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * flags having the value <code>true</code> or <code>false</code>:
332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <ul>
342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <li>If returnDelims is <code>false</code>, delimiter code points serve to
352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * separate tokens. A token is a maximal sequence of consecutive
362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * code points that are not delimiters.
372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <li>If returnDelims is <code>true</code>, delimiter code points are
382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * themselves considered to be tokens. In this case, if coalesceDelims is
392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <code>true</code>, such tokens will be the maximal sequence of consecutive
402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * code points that <em>are</em> delimiters.  If coalesceDelims is false,
412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * a token will be received for each delimiter code point.
422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * </ul>
432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>A token is thus either one
442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * delimiter code point, a maximal sequence of consecutive code points that
452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * are delimiters, or a maximal sequence of consecutive code
462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * points that are not delimiters.
472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * A <tt>StringTokenizer</tt> object internally maintains a current
492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * position within the string to be tokenized. Some operations advance this
502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * current position past the code point processed.
512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * A token is returned by taking a substring of the string that was used to
532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * create the <tt>StringTokenizer</tt> object.
542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Example of the use of the default delimiter tokenizer.
562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <blockquote><pre>
572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * StringTokenizer st = new StringTokenizer("this is a test");
582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * while (st.hasMoreTokens()) {
592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     println(st.nextToken());
602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     }
612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * </pre></blockquote>
622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * prints the following output:
642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <blockquote><pre>
652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     this
662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     is
672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     a
682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     test
692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * </pre></blockquote>
702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Example of the use of the tokenizer with user specified delimiter.
722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <blockquote><pre>
732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     StringTokenizer st = new StringTokenizer(
742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     "this is a test with supplementary characters &#92;ud800&#92;ud800&#92;udc00&#92;udc00",
752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *         " &#92;ud800&#92;udc00");
762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     while (st.hasMoreTokens()) {
772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *         println(st.nextToken());
782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     }
792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * </pre></blockquote>
802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <p>
812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * prints the following output:
822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * <blockquote><pre>
832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     this
842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     is
852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     a
862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     test
872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     with
882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     supplementary
892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     characters
902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     &#92;ud800
912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *     &#92;udc00
922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * </pre></blockquote>
93bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin *
942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * @author syn wee
95836e6b40a94ec3fb7545a76cb072960442b7eee9Neil Fuller * @hide Only a subset of ICU is exposed in Android
962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */
972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpublic final class StringTokenizer implements Enumeration<Object>
982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller{
992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // public constructors ---------------------------------------------
1002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1021537b2f39245c07b00aa78c3600f7aebcb172490Neil Fuller     * <strong>[icu]</strong> Constructs a string tokenizer for the specified string. All
1032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * characters in the delim argument are the delimiters for separating
1042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * tokens.
1052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is false, the delimiter characters are
106bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * skipped and only serve as separators between tokens.
1072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is true, then the delimiter characters
1082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * are also returned as tokens, one per delimiter.
1092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param str a string to be parsed.
1102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the delimiters.
1112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param returndelims flag indicating whether to return the delimiters
1122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        as tokens.
1132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NullPointerException if str is null
1142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
1152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public StringTokenizer(String str, UnicodeSet delim, boolean returndelims)
1162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
1172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        this(str, delim, returndelims, false);
1182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1211537b2f39245c07b00aa78c3600f7aebcb172490Neil Fuller     * <strong>[icu]</strong> Constructs a string tokenizer for the specified string. All
1222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * characters in the delim argument are the delimiters for separating
1232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * tokens.
1242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is false, the delimiter characters are
125bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * skipped and only serve as separators between tokens.
1262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is true, then the delimiter characters
1272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * are also returned as tokens.  If coalescedelims is true, one token
1282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * is returned for each run of delimiter characters, otherwise one
1292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * token is returned per delimiter.  Since surrogate pairs can be
130bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * delimiters, the returned token might be two chars in length.
1312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param str a string to be parsed.
1322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the delimiters.
1332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param returndelims flag indicating whether to return the delimiters
1342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        as tokens.
1352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param coalescedelims flag indicating whether to return a run of
1362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        delimiters as a single token or as one token per delimiter.
1372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        This only takes effect if returndelims is true.
1382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NullPointerException if str is null
1392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @deprecated This API is ICU internal only.
140836e6b40a94ec3fb7545a76cb072960442b7eee9Neil Fuller     * @hide draft / provisional / internal are hidden on Android
1412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
1422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Deprecated
1432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public StringTokenizer(String str, UnicodeSet delim, boolean returndelims, boolean coalescedelims)
1442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
1452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_source_ = str;
1462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_length_ = str.length();
1472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (delim == null) {
1482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_delimiters_ = EMPTY_DELIMITER_;
1492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        else {
1512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_delimiters_ = delim;
1522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_returnDelimiters_ = returndelims;
1542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_coalesceDelimiters_ = coalescedelims;
1552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenOffset_ = -1;
1562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenSize_ = -1;
1572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (m_length_ == 0) {
1582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            // string length 0, no tokens
1592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_nextOffset_ = -1;
1602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        else {
1622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_nextOffset_ = 0;
1632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (!returndelims) {
1642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                m_nextOffset_ = getNextNonDelimiter(0);
1652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
1662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1701537b2f39245c07b00aa78c3600f7aebcb172490Neil Fuller     * <strong>[icu]</strong> Constructs a string tokenizer for the specified string. The
1712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * characters in the delim argument are the delimiters for separating
1722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * tokens.
173bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * <p>Delimiter characters themselves will not be treated as tokens.
1742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param str a string to be parsed.
1752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the delimiters.
1762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NullPointerException if str is null
1772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
1782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public StringTokenizer(String str, UnicodeSet delim)
1792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
1802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        this(str, delim, false, false);
1812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
1842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>Constructs a string tokenizer for the specified string. All
1852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * characters in the delim argument are the delimiters for separating
186bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * tokens.
1872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is false, the delimiter characters are
188bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * skipped and only serve as separators between tokens.
1892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is true, then the delimiter characters
1902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * are also returned as tokens, one per delimiter.
1912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param str a string to be parsed.
1922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the delimiters.
1932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param returndelims flag indicating whether to return the delimiters
1942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        as tokens.
1952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NullPointerException if str is null
1962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
1972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public StringTokenizer(String str, String delim, boolean returndelims)
1982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
1992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        this(str, delim, returndelims, false); // java default behavior
2002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
2032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>Constructs a string tokenizer for the specified string. All
2042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * characters in the delim argument are the delimiters for separating
205bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * tokens.
2062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is false, the delimiter characters are
207bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * skipped and only serve as separators between tokens.
2082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>If the returnDelims flag is true, then the delimiter characters
2092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * are also returned as tokens.  If coalescedelims is true, one token
2102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * is returned for each run of delimiter characters, otherwise one
2112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * token is returned per delimiter.  Since surrogate pairs can be
212bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * delimiters, the returned token might be two chars in length.
2132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param str a string to be parsed.
2142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the delimiters.
2152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param returndelims flag indicating whether to return the delimiters
2162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        as tokens.
2172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param coalescedelims flag indicating whether to return a run of
2182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        delimiters as a single token or as one token per delimiter.
2192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *        This only takes effect if returndelims is true.
2202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NullPointerException if str is null
2212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @deprecated This API is ICU internal only.
222836e6b40a94ec3fb7545a76cb072960442b7eee9Neil Fuller     * @hide draft / provisional / internal are hidden on Android
2232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
2242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Deprecated
2252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public StringTokenizer(String str, String delim, boolean returndelims, boolean coalescedelims)
2262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
2272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // don't ignore whitespace
2282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_delimiters_ = EMPTY_DELIMITER_;
2292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (delim != null && delim.length() > 0) {
2302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_delimiters_ = new UnicodeSet();
2312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_delimiters_.addAll(delim);
2322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            checkDelimiters();
2332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
2342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_coalesceDelimiters_ = coalescedelims;
2352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_source_ = str;
2362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_length_ = str.length();
2372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_returnDelimiters_ = returndelims;
2382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenOffset_ = -1;
2392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenSize_ = -1;
2402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (m_length_ == 0) {
2412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            // string length 0, no tokens
2422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_nextOffset_ = -1;
2432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
2442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        else {
2452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_nextOffset_ = 0;
2462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (!returndelims) {
2472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                m_nextOffset_ = getNextNonDelimiter(0);
2482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
2492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
2502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
2532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>Constructs a string tokenizer for the specified string. The
2542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * characters in the delim argument are the delimiters for separating
255bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * tokens.
256bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * <p>Delimiter characters themselves will not be treated as tokens.
2572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param str a string to be parsed.
2582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the delimiters.
2592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NullPointerException if str is null
2602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
2612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public StringTokenizer(String str, String delim)
2622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
2632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // don't ignore whitespace
2642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        this(str, delim, false, false);
2652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
2682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <p>Constructs a string tokenizer for the specified string.
2692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * The tokenizer uses the default delimiter set, which is
2702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * " &#92;t&#92;n&#92;r&#92;f":
2712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * the space character, the tab character, the newline character, the
272bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * carriage-return character, and the form-feed character.
273bfab1e7fec36dff93fb980c546ad64a565faf9fcPaul Duffin     * <p>Delimiter characters themselves will not be treated as tokens.
2742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param str a string to be parsed
2752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NullPointerException if str is null
2762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
2772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public StringTokenizer(String str)
2782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
2792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        this(str, DEFAULT_DELIMITERS_, false, false);
2802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // public methods --------------------------------------------------
2832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
2852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Tests if there are more tokens available from this tokenizer's
2862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * string.
2872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * If this method returns <tt>true</tt>, then a subsequent call to
2882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <tt>nextToken</tt> with no argument will successfully return a token.
2892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return <code>true</code> if and only if there is at least one token
2902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         in the string after the current position; <code>false</code>
2912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         otherwise.
2922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
2932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public boolean hasMoreTokens()
2942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
2952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return m_nextOffset_ >= 0;
2962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
2992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Returns the next token from this string tokenizer.
3002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return the next token from this string tokenizer.
3012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NoSuchElementException if there are no more tokens in
3022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *            this tokenizer's string.
3032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
3042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public String nextToken()
3052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
3062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (m_tokenOffset_ < 0) {
3072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (m_nextOffset_ < 0) {
3082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                throw new NoSuchElementException("No more tokens in String");
3092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
3102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            // pre-calculations of tokens not done
3112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (m_returnDelimiters_) {
3122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                int tokenlimit = 0;
3132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                int c = UTF16.charAt(m_source_, m_nextOffset_);
3142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                boolean contains = delims == null
3152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    ? m_delimiters_.contains(c)
3162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    : c < delims.length && delims[c];
3172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                if (contains) {
3182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                     if (m_coalesceDelimiters_) {
3192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        tokenlimit = getNextNonDelimiter(m_nextOffset_);
3202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                     } else {
3212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        tokenlimit = m_nextOffset_ + UTF16.getCharCount(c);
3222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        if (tokenlimit == m_length_) {
3232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                            tokenlimit = -1;
3242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        }
3252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                     }
3262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
3272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                else {
3282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    tokenlimit = getNextDelimiter(m_nextOffset_);
3292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
3302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                String result;
3312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                if (tokenlimit < 0) {
3322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result = m_source_.substring(m_nextOffset_);
3332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
3342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                else {
3352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result = m_source_.substring(m_nextOffset_, tokenlimit);
3362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
3372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                m_nextOffset_ = tokenlimit;
3382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                return result;
3392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
3402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            else {
3412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                int tokenlimit = getNextDelimiter(m_nextOffset_);
3422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                String result;
3432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                if (tokenlimit < 0) {
3442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result = m_source_.substring(m_nextOffset_);
3452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    m_nextOffset_ = tokenlimit;
3462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
3472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                else {
3482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result = m_source_.substring(m_nextOffset_, tokenlimit);
3492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    m_nextOffset_ = getNextNonDelimiter(tokenlimit);
3502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
3512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
3522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                return result;
3532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
3542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
3552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // count was called before and we have all the tokens
3562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (m_tokenOffset_ >= m_tokenSize_) {
3572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            throw new NoSuchElementException("No more tokens in String");
3582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
3592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        String result;
3602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (m_tokenLimit_[m_tokenOffset_] >= 0) {
3612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            result = m_source_.substring(m_tokenStart_[m_tokenOffset_],
3622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                         m_tokenLimit_[m_tokenOffset_]);
3632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
3642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        else {
3652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            result = m_source_.substring(m_tokenStart_[m_tokenOffset_]);
3662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
3672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenOffset_ ++;
3682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_nextOffset_ = -1;
3692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (m_tokenOffset_ < m_tokenSize_) {
3702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_nextOffset_ = m_tokenStart_[m_tokenOffset_];
3712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
3722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return result;
3732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
3742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
3752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
3762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Returns the next token in this string tokenizer's string. First,
3772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * the set of characters considered to be delimiters by this
3782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <tt>StringTokenizer</tt> object is changed to be the characters in
3792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * the string <tt>delim</tt>. Then the next token in the string
3802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * after the current position is returned. The current position is
3812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * advanced beyond the recognized token.  The new delimiter set
3822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * remains the default after this call.
3832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the new delimiters.
3842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return the next token, after switching to the new delimiter set.
3852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NoSuchElementException if there are no more tokens in
3862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *            this tokenizer's string.
3872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
3882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public String nextToken(String delim)
3892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
3902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_delimiters_ = EMPTY_DELIMITER_;
3912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (delim != null && delim.length() > 0) {
3922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_delimiters_ = new UnicodeSet();
3932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_delimiters_.addAll(delim);
3942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
3952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return nextToken(m_delimiters_);
3962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
3972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
3982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
3991537b2f39245c07b00aa78c3600f7aebcb172490Neil Fuller     * <strong>[icu]</strong> Returns the next token in this string tokenizer's string. First,
4002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * the set of characters considered to be delimiters by this
4012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <tt>StringTokenizer</tt> object is changed to be the characters in
4022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * the string <tt>delim</tt>. Then the next token in the string
4032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * after the current position is returned. The current position is
4042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * advanced beyond the recognized token.  The new delimiter set
4052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * remains the default after this call.
4062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param delim the new delimiters.
4072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return the next token, after switching to the new delimiter set.
4082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NoSuchElementException if there are no more tokens in
4092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *            this tokenizer's string.
4102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
4112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public String nextToken(UnicodeSet delim)
4122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
4132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_delimiters_ = delim;
4142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        checkDelimiters();
4152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenOffset_ = -1;
4162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        m_tokenSize_ = -1;
4172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (!m_returnDelimiters_) {
4182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_nextOffset_ = getNextNonDelimiter(m_nextOffset_);
4192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
4202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return nextToken();
4212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
4222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
4232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
4242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Returns the same value as the <code>hasMoreTokens</code> method.
4252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * It exists so that this class can implement the
4262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <code>Enumeration</code> interface.
4272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return <code>true</code> if there are more tokens;
4282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         <code>false</code> otherwise.
4292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @see #hasMoreTokens()
4302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
4312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public boolean hasMoreElements()
4322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
4332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return hasMoreTokens();
4342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
4352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
4362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
4372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Returns the same value as the <code>nextToken</code> method, except
4382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * that its declared return value is <code>Object</code> rather than
4392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <code>String</code>. It exists so that this class can implement the
4402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <code>Enumeration</code> interface.
4412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return the next token in the string.
4422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @exception NoSuchElementException if there are no more tokens in
4432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *            this tokenizer's string.
4442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @see #nextToken()
4452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
4462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public Object nextElement()
4472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
4482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return nextToken();
4492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
4502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
4512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
4522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Calculates the number of times that this tokenizer's
4532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * <code>nextToken</code> method can be called before it generates an
4542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * exception. The current position is not advanced.
4552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return the number of tokens remaining in the string using the
4562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         current delimiter set.
4572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @see #nextToken()
4582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
4592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public int countTokens()
4602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
4612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        int result = 0;
4622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (hasMoreTokens()) {
4632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (m_tokenOffset_ >= 0) {
4642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                return m_tokenSize_ - m_tokenOffset_;
4652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
4662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (m_tokenStart_ == null) {
4672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                m_tokenStart_ = new int[TOKEN_SIZE_];
4682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                m_tokenLimit_ = new int[TOKEN_SIZE_];
4692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
4702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            do {
4712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                if (m_tokenStart_.length == result) {
4722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    int temptokenindex[] = m_tokenStart_;
4732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    int temptokensize[] = m_tokenLimit_;
4742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    int originalsize = temptokenindex.length;
4752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    int newsize = originalsize + TOKEN_SIZE_;
4762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    m_tokenStart_ = new int[newsize];
4772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    m_tokenLimit_ = new int[newsize];
4782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    System.arraycopy(temptokenindex, 0, m_tokenStart_, 0,
4792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                     originalsize);
4802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    System.arraycopy(temptokensize, 0, m_tokenLimit_, 0,
4812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                     originalsize);
4822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
4832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                m_tokenStart_[result] = m_nextOffset_;
4842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                if (m_returnDelimiters_) {
4852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    int c = UTF16.charAt(m_source_, m_nextOffset_);
4862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    boolean contains = delims == null
4872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        ? m_delimiters_.contains(c)
4882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        : c < delims.length && delims[c];
4892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    if (contains) {
4902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        if (m_coalesceDelimiters_) {
4912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                            m_tokenLimit_[result] = getNextNonDelimiter(
4922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                                                m_nextOffset_);
4932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        } else {
4942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                            int p = m_nextOffset_ + 1;
4952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                            if (p == m_length_) {
4962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                                p = -1;
4972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                            }
4982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                            m_tokenLimit_[result] = p;
4992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
5002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        }
5012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    }
5022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    else {
5032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        m_tokenLimit_[result] = getNextDelimiter(m_nextOffset_);
5042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    }
5052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    m_nextOffset_ = m_tokenLimit_[result];
5062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
5072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                else {
5082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    m_tokenLimit_[result] = getNextDelimiter(m_nextOffset_);
5092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    m_nextOffset_ = getNextNonDelimiter(m_tokenLimit_[result]);
5102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
5112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                result ++;
5122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            } while (m_nextOffset_ >= 0);
5132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_tokenOffset_ = 0;
5142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_tokenSize_ = result;
5152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            m_nextOffset_ = m_tokenStart_[0];
5162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
5172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return result;
5182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
5192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
5202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // private data members -------------------------------------------------
5212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
5222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Current offset to the token array. If the array token is not set up yet,
5242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * this value is a -1
5252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_tokenOffset_;
5272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Size of the token array. If the array token is not set up yet,
5292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * this value is a -1
5302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_tokenSize_;
5322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Array of pre-calculated tokens start indexes in source string terminated
5342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * by -1.
5352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * This is only set up during countTokens() and only stores the remaining
5362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * tokens, not all tokens including parsed ones
5372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_tokenStart_[];
5392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Array of pre-calculated tokens limit indexes in source string.
5412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * This is only set up during countTokens() and only stores the remaining
5422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * tokens, not all tokens including parsed ones
5432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_tokenLimit_[];
5452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * UnicodeSet containing delimiters
5472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private UnicodeSet m_delimiters_;
5492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * String to parse for tokens
5512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private String m_source_;
5532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Length of m_source_
5552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_length_;
5572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Current position in string to parse for tokens
5592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int m_nextOffset_;
5612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Flag indicator if delimiters are to be treated as tokens too
5632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private boolean m_returnDelimiters_;
5652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
5662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Flag indicating whether to coalesce runs of delimiters into single tokens
5682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private boolean m_coalesceDelimiters_;
5702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
5712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Default set of delimiters &#92;t&#92;n&#92;r&#92;f
5732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static final UnicodeSet DEFAULT_DELIMITERS_
5752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        = new UnicodeSet(0x09, 0x0a, 0x0c, 0x0d, 0x20, 0x20);   // UnicodeSet("[ \t\n\r\f]", false)
5762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Array size increments
5782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static final int TOKEN_SIZE_ = 100;
5802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * A empty delimiter UnicodeSet, used when user specified null delimiters
5822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static final UnicodeSet EMPTY_DELIMITER_ = UnicodeSet.EMPTY;
5842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
5852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    // private methods ------------------------------------------------------
5862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
5872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
5882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Gets the index of the next delimiter after offset
5892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param offset to the source string
5902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return offset of the immediate next delimiter, otherwise
5912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         (- source string length - 1) if there
5922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         are no more delimiters after m_nextOffset
5932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
5942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int getNextDelimiter(int offset)
5952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
5962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (offset >= 0) {
5972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            int result = offset;
5982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            int c = 0;
5992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (delims == null) {
6002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                do {
6012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    c = UTF16.charAt(m_source_, result);
6022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    if (m_delimiters_.contains(c)) {
6032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        break;
6042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    }
6052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result ++;
6062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                } while (result < m_length_);
6072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            } else {
6082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                do {
6092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    c = UTF16.charAt(m_source_, result);
6102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    if (c < delims.length && delims[c]) {
6112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        break;
6122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    }
6132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result ++;
6142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                } while (result < m_length_);
6152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
6162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (result < m_length_) {
6172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                return result;
6182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
6192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
6202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return -1 - m_length_;
6212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
6222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
6232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
6242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Gets the index of the next non-delimiter after m_nextOffset_
6252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @param offset to the source string
6262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * @return offset of the immediate next non-delimiter, otherwise
6272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         (- source string length - 1) if there
6282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     *         are no more delimiters after m_nextOffset
6292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
6302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private int getNextNonDelimiter(int offset)
6312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    {
6322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (offset >= 0) {
6332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            int result = offset;
6342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            int c = 0;
6352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (delims == null) {
6362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                do {
6372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    c = UTF16.charAt(m_source_, result);
6382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    if (!m_delimiters_.contains(c)) {
6392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        break;
6402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    }
6412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result ++;
6422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                } while (result < m_length_);
6432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            } else {
6442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                do {
6452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    c = UTF16.charAt(m_source_, result);
6462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    if (!(c < delims.length && delims[c])) {
6472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        break;
6482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    }
6492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    result ++;
6502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                } while (result < m_length_);
6512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
6522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (result < m_length_) {
6532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                return result;
6542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
6552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
6562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return -1 - m_length_;
6572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
6582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
6592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    void checkDelimiters() {
6602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (m_delimiters_ == null || m_delimiters_.size() == 0) {
6612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            delims = new boolean[0];
6622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        } else {
6632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            int maxChar = m_delimiters_.getRangeEnd(m_delimiters_.getRangeCount()-1);
6642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (maxChar < 0x7f) {
6652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                delims = new boolean[maxChar+1];
6662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                for (int i = 0, ch; -1 != (ch = m_delimiters_.charAt(i)); ++i) {
6672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    delims[ch] = true;
6682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
6692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            } else {
6702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                delims = null;
6712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
6722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
6732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
6742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private boolean[] delims;
6752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller}
676