//
// 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.Hashtable;

/** Thrown when one encounters things like [z-a] */
class BadRangeArgs extends RegSyntax
{
};

/**
 * Implments a subelement (ranges) of the [] pattern element. For example,
 * [a-z023] is implemented using a range and tree oneChar classes.
 * 
 * @see Bracket
 * @see oneChar
 */
class Range extends Pattern
{
  char lo, hi, altlo, althi;

  boolean printBrackets = false;

  public String toString()
  {
    String s = protect("" + lo, PROTECT_THESE, ESC) + "-"
            + protect("" + hi, PROTECT_THESE, ESC);
    if (!printBrackets)
    {
      return s;
    }
    return "[" + s + "]";
  }

  Range(char loi, char hii) throws RegSyntax
  {
    lo = loi;
    hi = hii;
    oneChar o = null;
    if (lo >= hi)
    {
      // throw new BadRangeArgs();
      RegSyntaxError.endItAll("Badly formed []'s : " + lo + " >= " + hi);
    }
    o = new oneChar(lo);
    altlo = o.altc;
    o = new oneChar(hi);
    althi = o.altc;
  }

  public int matchInternal(int pos, Pthings pt)
  {
    if (pos >= pt.src.length())
    {
      return -1;
    }
    if (Masked(pos, pt))
    {
      return -1;
    }
    char c = pt.src.charAt(pos);
    if (lo <= c && c <= hi || (pt.ignoreCase && (altlo <= c && c <= althi)))
    {
      return nextMatch(pos + 1, pt);
    }
    return -1;
  }

  public patInt minChars()
  {
    return new patInt(1);
  }

  public patInt maxChars()
  {
    return new patInt(1);
  }

  public Pattern clone1(Hashtable h)
  {
    try
    {
      Range r = new Range(lo, hi);
      r.printBrackets = printBrackets;
      return r;
    } catch (RegSyntax rs)
    {
      return null;
    }
  }
};
