/* StringTokenizer -- breaks a String into tokens
   Copyright (C) 1998, 1999, 2001, 2002, 2005  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.util;

/**
 * This class splits a string into tokens.  The caller can set on which
 * delimiters the string should be split and if the delimiters should be
 * returned. This is much simpler than {@link java.io.StreamTokenizer}.
 *
 * <p>You may change the delimiter set on the fly by calling
 * nextToken(String).  But the semantic is quite difficult; it even
 * depends on calling <code>hasMoreTokens()</code>.  You should call
 * <code>hasMoreTokens()</code> before, otherwise the old delimiters
 * after the last token are candidates for being returned.
 *
 * <p>If you want to get the delimiters, you have to use the three argument
 * constructor.  The delimiters are returned as token consisting of a
 * single character.
 *
 * @author Jochen Hoenicke
 * @author Warren Levy (warrenl@cygnus.com)
 * @see java.io.StreamTokenizer
 * @status updated to 1.4
 */
public class StringTokenizer implements Enumeration
{
  // WARNING: StringTokenizer is a CORE class in the bootstrap cycle. See the
  // comments in vm/reference/java/lang/Runtime for implications of this fact.

  /**
   * The position in the str, where we currently are.
   */
  private int pos;

  /**
   * The string that should be split into tokens.
   */
  private final String str;

  /**
   * The length of the string.
   */
  private final int len;

  /**
   * The string containing the delimiter characters.
   */
  private String delim;

  /**
   * Tells, if we should return the delimiters.
   */
  private final boolean retDelims;

  /**
   * Creates a new StringTokenizer for the string <code>str</code>,
   * that should split on the default delimiter set (space, tab,
   * newline, return and formfeed), and which doesn't return the
   * delimiters.
   *
   * @param str The string to split
   * @throws NullPointerException if str is null
   */
  public StringTokenizer(String str)
  {
    this(str, " \t\n\r\f", false);
  }

  /**
   * Create a new StringTokenizer, that splits the given string on
   * the given delimiter characters.  It doesn't return the delimiter
   * characters.
   *
   * @param str the string to split
   * @param delim a string containing all delimiter characters
   * @throws NullPointerException if either argument is null
   */
  public StringTokenizer(String str, String delim)
  {
    this(str, delim, false);
  }

  /**
   * Create a new StringTokenizer, that splits the given string on
   * the given delimiter characters.  If you set
   * <code>returnDelims</code> to <code>true</code>, the delimiter
   * characters are returned as tokens of their own.  The delimiter
   * tokens always consist of a single character.
   *
   * @param str the string to split
   * @param delim a string containing all delimiter characters
   * @param returnDelims tells, if you want to get the delimiters
   * @throws NullPointerException if str or delim is null
   */
  public StringTokenizer(String str, String delim, boolean returnDelims)
  {
    len = str.length();
    this.str = str;
    this.delim = delim;
    this.retDelims = returnDelims;
    this.pos = 0;
  }

  /**
   * Tells if there are more tokens.
   *
   * @return true if the next call of nextToken() will succeed
   */
  public boolean hasMoreTokens()
  {
    if (! retDelims)
      {
        while (pos < len && delim.indexOf(str.charAt(pos)) >= 0)
          pos++;
      }
    return pos < len;
  }

  /**
   * Returns the nextToken, changing the delimiter set to the given
   * <code>delim</code>.  The change of the delimiter set is
   * permanent, ie. the next call of nextToken(), uses the same
   * delimiter set.
   *
   * @param delim a string containing the new delimiter characters
   * @return the next token with respect to the new delimiter characters
   * @throws NoSuchElementException if there are no more tokens
   * @throws NullPointerException if delim is null
   */
  public String nextToken(String delim) throws NoSuchElementException
  {
    this.delim = delim;
    return nextToken();
  }

  /**
   * Returns the nextToken of the string.
   *
   * @return the next token with respect to the current delimiter characters
   * @throws NoSuchElementException if there are no more tokens
   */
  public String nextToken() throws NoSuchElementException
  {
    if (pos < len && delim.indexOf(str.charAt(pos)) >= 0)
      {
        if (retDelims)
          return str.substring(pos, ++pos);
        while (++pos < len && delim.indexOf(str.charAt(pos)) >= 0);
      }
    if (pos < len)
      {
        int start = pos;
        while (++pos < len && delim.indexOf(str.charAt(pos)) < 0);

        return str.substring(start, pos);
      }
    throw new NoSuchElementException();
  }

  /**
   * This does the same as hasMoreTokens. This is the
   * <code>Enumeration</code> interface method.
   *
   * @return true, if the next call of nextElement() will succeed
   * @see #hasMoreTokens()
   */
  public boolean hasMoreElements()
  {
    return hasMoreTokens();
  }

  /**
   * This does the same as nextTokens. This is the
   * <code>Enumeration</code> interface method.
   *
   * @return the next token with respect to the current delimiter characters
   * @throws NoSuchElementException if there are no more tokens
   * @see #nextToken()
   */
  public Object nextElement() throws NoSuchElementException
  {
    return nextToken();
  }

  /**
   * This counts the number of remaining tokens in the string, with
   * respect to the current delimiter set.
   *
   * @return the number of times <code>nextTokens()</code> will succeed
   * @see #nextToken()
   */
  public int countTokens()
  {
    int count = 0;
    int delimiterCount = 0;
    boolean tokenFound = false; // Set when a non-delimiter is found
    int tmpPos = pos;

    // Note for efficiency, we count up the delimiters rather than check
    // retDelims every time we encounter one.  That way, we can
    // just do the conditional once at the end of the method
    while (tmpPos < len)
      {
        if (delim.indexOf(str.charAt(tmpPos++)) >= 0)
          {
            if (tokenFound)
              {
                // Got to the end of a token
                count++;
                tokenFound = false;
              }
            delimiterCount++; // Increment for this delimiter
          }
        else
          {
            tokenFound = true;
            // Get to the end of the token
            while (tmpPos < len
                   && delim.indexOf(str.charAt(tmpPos)) < 0)
              ++tmpPos;
          }
      }

    // Make sure to count the last token
    if (tokenFound)
      count++;

    // if counting delmiters add them into the token count
    return retDelims ? count + delimiterCount : count;
  }
} // class StringTokenizer
