//
// This software is now distributed according to
// the Lesser Gnu Public License.  Please see
// http://www.gnu.org/copyleft/lesser.txt for
// the details.
//    -- Happy Computing!
//
package com.stevesoft.pat;

import java.util.*;

/**
 * Matches any number of instances of sub Pattern this was the hardest method to
 * write. It implements '+', '*', '?', "{0,10}", "{5,}", "{5}", etc.
 * 
 * @see pat.Multi_stage2
 * @see pat.MultiMin
 */
class Multi extends PatternSub
{
  patInt a, b;

  public patInt minChars()
  {
    return a.mul(p.countMinChars());
  }

  public patInt maxChars()
  {
    return b.mul(p.countMaxChars());
  }

  Pattern p;

  Multi_stage2 st2;

  public boolean matchFewest = false;

  /**
   * @param a
   *                The fewest number of times the sub pattern can match.
   * @param b
   *                The maximum number of times the sub pattern can match.
   * @param p
   *                The sub pattern.
   * @see Multi_stage2
   * @see MultiMin
   */
  public Multi(patInt a, patInt b, Pattern p) throws RegSyntax
  {
    this.a = a;
    this.b = b;
    this.p = p;
    st2 = new Multi_stage2(a, b, p);
    st2.parent = this;
    sub = st2.sub;
  }

  public String toString()
  {
    st2.matchFewest = matchFewest;
    return st2.toString();
  }

  public int matchInternal(int pos, Pthings pt)
  {
    try
    {
      st2 = new Multi_stage2(a, b, p);
    } catch (RegSyntax r__)
    {
    }
    st2.matchFewest = matchFewest;
    st2.parent = this;
    return st2.matchInternal(pos, pt);
  }

  public Pattern clone1(Hashtable h)
  {
    try
    {
      Multi m = new Multi(a, b, ((Pattern) p).clone(h));
      m.matchFewest = matchFewest;
      return m;
    } catch (RegSyntax rs)
    {
      return null;
    }
  }
};
