
/**
 * MStringVector.java
 * a vector of string
 * with facilities for pattern matching
 * Created: Sat Jan 13 21:51:53 2001
 *
 * @author 
 * @version
 */

import simplejava.*;
import java.util.*;

public class MStringVector extends Vector{
  private String sin; //the input string - | is separator
  private HashMap context;  //context for matching
  private MStringVector remvec;  //remainder of vector after match

  // accessors
  public HashMap getContext() {return context;}
  public MStringVector getRemvec() {return remvec;}

  //empty constructor
  public MStringVector(){super();}

  //constructor given a string with '|' as separator

  public MStringVector(String s){
    sin=s;
    int i=0;
    int j=sin.indexOf('|');
    // Vector ans=new Vector();

    while (j != -1){
      this.add(sin.substring(i,j));
      i=j+1;
      j=sin.indexOf('|',j+1);
    }
    this.add(sin.substring(i,sin.length()));
    //sv=ans;
  }

  //match against a string
  //until a match is found, giving a context, or vector runs out
  // *** need to code for remmvec here

  public boolean match(String s){
    boolean result=false;
    MString p =new MString("");
    Iterator vit=this.iterator();
    while (vit.hasNext() && !result){
      p=new MString((String) vit.next());
      result=p.match(s);
    }
    if (result) {
      context=p.getContext();
      remvec= new MStringVector();
      while (vit.hasNext()){
        remvec.add(vit.next());
      }
    }
    return result;
  }

  //match against a string given an initial context
  //until a match is found, giving a context, or vector runs out

  public boolean match(String s, HashMap con){
    boolean result=false;
    MString p=new MString("");
    Iterator vit=this.iterator();
    while (vit.hasNext() && !result){
      p=new MString((String) vit.next());
      result=p.match(s,con);
    }
    if (result){
      context=p.getContext();
      remvec= new MStringVector();
      while (vit.hasNext()){
        remvec.add(vit.next());
      }
    }
    return result;
  }

  //msubst
  public Vector msubst(HashMap c){
    Vector ans= new Vector();
    for (Iterator vit=this.iterator();vit.hasNext();){
      MString ms=new MString((String) vit.next());
      ans.add(ms.msubst(c));
    }
    return ans;
  }
      
}
                      
    
