/* Pattern.java -- Compiled regular expression ready to be applied.
   Copyright (C) 2002, 2004, 2005, 2007, 2010
   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.regex;

import gnu.java.lang.CPStringBuilder;

import gnu.java.util.regex.RE;
import gnu.java.util.regex.REException;
import gnu.java.util.regex.RESyntax;

import java.io.Serializable;
import java.util.ArrayList;


/**
 * Compiled regular expression ready to be applied.
 *
 * @since 1.4
 */
public final class Pattern implements Serializable
{
  private static final long serialVersionUID = 5073258162644648461L;

  public static final int CANON_EQ = 128;
  public static final int CASE_INSENSITIVE = 2;
  public static final int COMMENTS = 4;
  public static final int DOTALL = 32;
  public static final int MULTILINE = 8;
  public static final int UNICODE_CASE = 64;
  public static final int UNIX_LINES = 1;

  private final String regex;
  private final int flags;

  private final RE re;

  private Pattern (String regex, int flags)
    throws PatternSyntaxException
  {
    this.regex = regex;
    this.flags = flags;

    RESyntax syntax = RESyntax.RE_SYNTAX_JAVA_1_4;
    int gnuFlags = 0;
    gnuFlags |= RE.REG_ICASE_USASCII;
    if ((flags & CASE_INSENSITIVE) != 0)
      gnuFlags |= RE.REG_ICASE;
    if ((flags & MULTILINE) != 0)
      {
        gnuFlags |= RE.REG_MULTILINE;
        syntax = new RESyntax(syntax);
        syntax.setLineSeparator(null);
      }
    if ((flags & DOTALL) != 0)
      gnuFlags |= RE.REG_DOT_NEWLINE;
    if ((flags & UNICODE_CASE) != 0)
      gnuFlags &= ~RE.REG_ICASE_USASCII;
    // not yet supported:
    // if ((flags & CANON_EQ) != 0) gnuFlags =

    if ((flags & UNIX_LINES) != 0)
      {
        // Use a syntax set with \n for linefeeds?
        syntax = new RESyntax(syntax);
        syntax.setLineSeparator("\n");
      }

    if ((flags & COMMENTS) != 0)
      {
        gnuFlags |= RE.REG_X_COMMENTS;
      }

    try
      {
        this.re = new RE(regex, gnuFlags, syntax);
      }
    catch (REException e)
      {
        PatternSyntaxException pse;
        pse = new PatternSyntaxException(e.getMessage(),
                                         regex, e.getPosition());
        pse.initCause(e);
        throw pse;
      }
  }

  // package private accessor method
  RE getRE()
  {
    return re;
  }

  /**
   * @param regex The regular expression
   *
   * @exception PatternSyntaxException If the expression's syntax is invalid
   */
  public static Pattern compile (String regex)
    throws PatternSyntaxException
  {
    return compile(regex, 0);
  }

  /**
   * @param regex The regular expression
   * @param flags The match flags, a bit mask
   *
   * @exception PatternSyntaxException If the expression's syntax is invalid
   * @exception IllegalArgumentException If bit values other than those
   * corresponding to the defined match flags are set in flags
   */
  public static Pattern compile (String regex, int flags)
    throws PatternSyntaxException
  {
    // FIXME: check which flags are really accepted
    if ((flags & ~0xEF) != 0)
      throw new IllegalArgumentException ();

    return new Pattern (regex, flags);
  }

  public int flags ()
  {
    return this.flags;
  }

  /**
   * @param regex The regular expression
   * @param input The character sequence to be matched
   *
   * @exception PatternSyntaxException If the expression's syntax is invalid
   */
  public static boolean matches (String regex, CharSequence input)
  {
    return compile(regex).matcher(input).matches();
  }

  /**
   * @param input The character sequence to be matched
   */
  public Matcher matcher (CharSequence input)
  {
    return new Matcher(this, input);
  }

  /**
   * @param input The character sequence to be matched
   */
  public String[] split (CharSequence input)
  {
    return split(input, 0);
  }

  /**
   * @param input The character sequence to be matched
   * @param limit The result threshold
   */
  public String[] split (CharSequence input, int limit)
  {
    Matcher matcher = new Matcher(this, input);
    ArrayList<String> list = new ArrayList<String>();
    int empties = 0;
    int count = 0;
    int start = 0;
    int end;
    boolean matched = matcher.find();

    while (matched && (limit <= 0 || count < limit - 1))
      {
        ++count;
        end = matcher.start();
        if (start == end)
          empties++;
        else
          {
            while (empties > 0)
              {
                list.add("");
                empties--;
              }

            String text = input.subSequence(start, end).toString();
            list.add(text);
          }
        start = matcher.end();
        matched = matcher.find();
      }

    // We matched nothing.
    if (!matched && count == 0)
      return new String[] { input.toString() };

    // Is the last token empty?
    boolean emptyLast = (start == input.length());

    // Can/Must we add empties or an extra last token at the end?
    if (list.size() < limit || limit < 0 || (limit == 0 && !emptyLast))
      {
        if (limit > list.size())
          {
            int max = limit - list.size();
            empties = (empties > max) ? max : empties;
          }
        while (empties > 0)
          {
            list.add("");
            empties--;
          }
      }

    // last token at end
    if (limit != 0 || (limit == 0 && !emptyLast))
      {
        String t = input.subSequence(start, input.length()).toString();
        if ("".equals(t) && limit == 0)
          { /* Don't add. */ }
        else
          list.add(t);
      }

    return list.toArray(new String[list.size()]);
  }

  public String pattern ()
  {
    return regex;
  }

  /**
   * Returns a literal pattern for the specified String.
   *
   * @param String to return a literal pattern for.
   * @return a literal pattern for the specified String.
   * @exception NullPointerException if str is null.
   * @since 1.5
   */
  public static String quote(String str)
  {
    int eInd = str.indexOf("\\E");
    if (eInd < 0)
      {
        // No need to handle backslashes.
        return "\\Q" + str + "\\E";
      }

    CPStringBuilder sb = new CPStringBuilder(str.length() + 16);
    sb.append("\\Q"); // start quote

    int pos = 0;
    do
      {
        // A backslash is quoted by another backslash;
        // 'E' is not needed to be quoted.
        sb.append(str.substring(pos, eInd))
          .append("\\E" + "\\\\" + "E" + "\\Q");
        pos = eInd + 2;
      } while ((eInd = str.indexOf("\\E", pos)) >= 0);

    sb.append(str.substring(pos, str.length()))
      .append("\\E"); // end quote
    return sb.toString();
  }

  /**
   * Return the regular expression used to construct this object.
   * @specnote Prior to JDK 1.5 this method had a different behavior
   * @since 1.5
   */
  public String toString()
  {
    return regex;
  }
}
