content: /**
   * java_cup.anttask.CUPTask.java
   *
   * @author Michael Petter, 2003
   *
   * Ant-Task for CUP Parser Generator for Java
   * -- tested with Ant 1.5.1;
   * -- compiles with javac -classpath .:${ANT_HOME}/lib/ant.jar java_cup.anttask.CUPTask.java
   * -- overrides org.apache.tools.ant.taskdefs.Java
   * -- providing cool interface to CUP
   * -- mapping all existing parameters to attributes
   * -- trys to add new useful features to CUP, like 
   *     - automatic package discovery
   *     - re-generate .java only when necessary
   *     - possibility to generate into a dest-directory
   *
   * my code is not perfect (in some cases it is pretty
   * ugly :-) ), but i didn't encounter any major error
   * until now
   */
  
  package java_cup.anttask;
  
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.types.Path;
  
  import java.util.List;
  import java.util.ArrayList;
  import java.io.File;
  import java.io.FileReader;
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.net.URL;
  
  import java_cup.version;
  
  public class CUPTask extends Task 
  {
      private String srcfile=null;
      private String parser=null;
      private String _package=null;
      private String symbols=null;
      private String destdir=null;
      private boolean _interface=false;
      private boolean nonterms=false;
      private String expect=null;
      private boolean compact_red=false;
      private boolean nowarn=false;
      private boolean nosummary=false;
      private boolean progress=false;
      private boolean dump_grammar=false;
      private boolean dump_states=false;
      private boolean dump_tables=false;
      private boolean dump=false;
      private boolean time=false;
      private boolean debug=false;
      private boolean debugsymbols=false;
      private boolean nopositions=false;
      private boolean xmlactions=false;
      private boolean genericlabels=false;
      private boolean locations=true;
      private boolean noscanner=false;
      private boolean force=false;
      private boolean quiet=false;
    
      /**
       * executes the task
       * parses all attributes and validates options...
       *
       */
  
      public void execute() throws BuildException 
      {
          List sc = new ArrayList();  // sc = simulated commandline
  	// here, we parse our elements
  	if (parser!=null)  { sc.add("-parser"); sc.add(parser);}
          else parser="parser"; // set the default name to check actuality
  	if (_package!=null){ sc.add("-package"); sc.add(_package); }
  	if (symbols!=null) { sc.add("-symbols"); sc.add(symbols); }
          else symbols="sym";
  	if (expect!=null)  {  sc.add("-expect"); sc.add(expect); }
  	if (_interface)    {  sc.add("-interface"); }
  	if (nonterms)      {  sc.add("-nonterms"); }
  	if (compact_red)   {  sc.add("-compact_red"); }
  	if (nowarn)        {  sc.add("-nowarn"); }
  	if (nosummary)     {  sc.add("-nosummary");}
  	if (progress)      {  sc.add("-progress"); }
  	if (dump_grammar)  {  sc.add("-dump_grammar"); }
  	if (dump_states)   {  sc.add("-dump_states"); }
  	if (dump_tables)   {  sc.add("-dump_tables"); }
  	if (dump)          {  sc.add("-dump"); }
  	if (time)          {  sc.add("-time"); }
  	if (debug)         {  sc.add("-debug"); }
  	if (debugsymbols)  {  sc.add("-debugsymbols"); }
  	if (nopositions)   {  sc.add("-nopositions"); }
  	if (locations)     {  sc.add("-locations"); }
  	if (genericlabels) {  sc.add("-genericlabels"); }
  	if (xmlactions)    {  sc.add("-xmlactions"); }
  	if (noscanner)     {  sc.add("-noscanner"); }
  	if (!quiet) log ("This is "+version.title_str);
          if (!quiet) log ("Authors : "+version.author_str);
  	if (!quiet) log ("Bugreports to petter@cs.tum.edu");
  
  	// look for package name and add to destdir
  	String packagename = inspect(srcfile);
  	
  
  	// now, that's sweet:
  	if (destdir==null) {
  	    destdir=System.getProperty("user.dir");
  	    if (!quiet) log("No destination directory specified; using working directory: "+destdir);
  	}
  	File dest = new File(destdir+packagename);
  	if (!(dest).exists()) {
  	    if (!quiet) log("Destination directory didn't exist; creating new one: "+destdir+packagename);
  	    dest.mkdirs();
  	    force=true;
  	}
  	else {
  	    if (force&& !quiet) { log("anyway, this generation will be processed because of option force set to \"true\""); }
  	    else { if (!quiet) log("checking, whether this run is necessary"); }
  	    // let's check, whether there exists any Parser fragment...
  	    File parserfile = new File(destdir+packagename,parser+".java");
  	    File symfile    = new File(destdir+packagename,symbols+".java");
  	    File cupfile    = new File(srcfile);
  	    
  	    if (!parserfile.exists() || !symfile.exists()) {
  		if (!quiet) log("Either Parserfile or Symbolfile didn't exist");
  		force=true;	    
  	    }else { if (!quiet) log("Parserfile and symbolfile are existing"); }
  	    
  	    
  	    if (parserfile.lastModified()<=cupfile.lastModified()) {
  		if (!quiet) log("Parserfile "+parserfile+" isn't actual");
  		force=true;
  	    }else { if (!quiet) log("Parserfile "+parserfile+" is actual"); }
  	    
  	    if (symfile.lastModified()<=cupfile.lastModified()) {
  		if (!quiet) log("Symbolfile "+symfile+" isn't actual");
  		force=true;
  	    }else { if (!quiet) log("Symbolfile"+symfile+" is actual"); }
  	    
  	    
  	    if (!force) {
  		if (!quiet) log("skipping generation of "+srcfile);
  		if (!quiet) log("use option force=\"true\" to override");
  		return;
  	    }
  	}
          
  	sc.add("-destdir");
          sc.add(dest.getAbsolutePath());
          
          // also catch the not existing input file
  	if (srcfile==null) throw new BuildException("Input file needed: Specify <cup srcfile=\"myfile.cup\"> ");
  	if (!(new File(srcfile)).exists()) throw new BuildException("Input file not found: srcfile=\""+srcfile+"\" ");
  	
          sc.add(srcfile);
  	String[] args = new String[sc.size()];
          for (int i=0;i<args.length;i++) args[i]=(String)sc.get(i);
          
  
  	try {
              java_cup.Main.main(args);
          }catch(Exception e){
              log("CUP error occured int CUP task: "+e);
          }
  	
      }
  
      /**
       * Let's search for package name
       *
       * @param cupfile where we have to search for the package name
       *
       * @return the package folder structure
       */
      protected String inspect(String cupfile){
  	try{
  	BufferedReader br = new BufferedReader(new FileReader(cupfile));
  	while (br.ready()){
  	    String line = br.readLine();
  	    if ((line.startsWith("package"))&&(line.indexOf(";")!=-1))
  		{
  		    String result = line.substring(8,line.indexOf(";"));
  		    result = result.replace('.',System.getProperty("file.separator").charAt(0));
  		    return System.getProperty("file.separator") + result;
  		}
  	    
  	}
  	}catch (IOException ioe){
  	}
  	return "";
      }
  
      /**
       * Gets the value of quiet
       *
       * @return the value of quiet
       */
      public boolean getQuiet()  {
  	return this.quiet;
      }
  
      /**
       * Sets the value of quiet
       *
       * @param arg_quiet Value to assign to this.quiet
       */
      public void setQuiet(boolean argquiet) {
  	this.quiet = argquiet;
      }
      /**
       * Gets the value of force
       *
       * @return the value of force
       */
      public boolean getForce()  {
  	return this.force;
      }
  
      /**
       * Sets the value of force
       *
       * @param arg_package Value to assign to this.force
       */
      public void setForce(boolean argforce) {
  	this.force = argforce;
      }
      /**
       * Gets the value of _package
       *
       * @return the value of _package
       */
      public String getPackage()  {
  	return this._package;
      }
  
      /**
       * Sets the value of _package
       *
       * @param arg_package Value to assign to this._package
       */
      public void setPackage(String arg_package) {
  	this._package = arg_package;
      }
  
      /**
       * Gets the value of destdir
       *
       * @return the value of destdir
       */
      public String getDestdir()  {
  	return this.destdir;
      }
  
      /**
       * Sets the value of destdir
       *
       * @param arg_package Value to assign to this.destdir
       */
      public void setDestdir(String destdir) {
  	this.destdir = destdir;
      }
  
      /**
       * Gets the value of _interface
       *
       * @return the value of _interface
       */
      public boolean isInterface()  {
  	return this._interface;
      }
  
      /**
       * Sets the value of _interface
       *
       * @param arg_interface Value to assign to this._interface
       */
      public void setInterface(boolean arg_interface) {
  	this._interface = arg_interface;
      }
  
      /**
       * Get the Srcfile value.
       * @return the Srcfile value.
       */
      public String getSrcfile() {
  	return srcfile;
      }
  
      /**
       * Set the Srcfile value.
       * @param newSrcfile The new Srcfile value.
       */
      public void setSrcfile(String newSrcfile) {
  	this.srcfile = newSrcfile;
      }
  
    
  
      /**
       * Gets the value of parser
       *
       * @return the value of parser
       */
      public String getParser() {
  	return this.parser;
      }
  
      /**
       * Sets the value of parser
       *
       * @param argParser Value to assign to this.parser
       */
      public void setParser(String argParser){
  	this.parser = argParser;
      }
  
      /**
       * Gets the value of symbols
       *
       * @return the value of symbols
       */
      public String getSymbols() {
  	return this.symbols;
      }
  
      /**
       * Sets the value of symbols
       *
       * @param argSymbols Value to assign to this.symbols
       */
      public void setSymbols(String argSymbols){
  	this.symbols = argSymbols;
      }
  
      /**
       * Gets the value of nonterms
       *
       * @return the value of nonterms
       */
      public boolean isNonterms() {
  	return this.nonterms;
      }
  
      /**
       * Sets the value of nonterms
       *
       * @param argNonterms Value to assign to this.nonterms
       */
      public void setNonterms(boolean argNonterms){
  	this.nonterms = argNonterms;
      }
  
      /**
       * Gets the value of expect
       *
       * @return the value of expect
       */
      public String getExpect() {
  	return this.expect;
      }
  
      /**
       * Sets the value of expect
       *
       * @param argExpect Value to assign to this.expect
       */
      public void setExpect(String argExpect){
  	this.expect = argExpect;
      }
  
      /**
       * Gets the value of compact_red
       *
       * @return the value of compact_red
       */
      public boolean isCompact_red() {
  	return this.compact_red;
      }
  
      /**
       * Sets the value of compact_red
       *
       * @param argCompact_red Value to assign to this.compact_red
       */
      public void setCompact_red(boolean argCompact_red){
  	this.compact_red = argCompact_red;
      }
  
      /**
       * Gets the value of nowarn
       *
       * @return the value of nowarn
       */
      public boolean isNowarn() {
  	return this.nowarn;
      }
  
      /**
       * Sets the value of nowarn
       *
       * @param argNowarn Value to assign to this.nowarn
       */
      public void setNowarn(boolean argNowarn){
  	this.nowarn = argNowarn;
      }
  
      /**
       * Gets the value of nosummary
       *
       * @return the value of nosummary
       */
      public boolean isNosummary() {
  	return this.nosummary;
      }
  
      /**
       * Sets the value of nosummary
       *
       * @param argNosummary Value to assign to this.nosummary
       */
      public void setNosummary(boolean argNosummary){
  	this.nosummary = argNosummary;
      }
  
      /**
       * Gets the value of progress
       *
       * @return the value of progress
       */
      public boolean isProgress() {
  	return this.progress;
      }
  
      /**
       * Sets the value of progress
       *
       * @param argProgress Value to assign to this.progress
       */
      public void setProgress(boolean argProgress){
  	this.progress = argProgress;
      }
  
      /**
       * Gets the value of dump_grammar
       *
       * @return the value of dump_grammar
       */
      public boolean isDump_grammar() {
  	return this.dump_grammar;
      }
  
      /**
       * Sets the value of dump_grammar
       *
       * @param argDump_grammar Value to assign to this.dump_grammar
       */
      public void setDump_grammar(boolean argDump_grammar){
  	this.dump_grammar = argDump_grammar;
      }
  
      /**
       * Gets the value of dump_states
       *
       * @return the value of dump_states
       */
      public boolean isDump_states() {
  	return this.dump_states;
      }
  
      /**
       * Sets the value of dump_states
       *
       * @param argDump_states Value to assign to this.dump_states
       */
      public void setDump_states(boolean argDump_states){
  	this.dump_states = argDump_states;
      }
  
      /**
       * Gets the value of dump_tables
       *
       * @return the value of dump_tables
       */
      public boolean isDump_tables() {
  	return this.dump_tables;
      }
  
      /**
       * Sets the value of dump_tables
       *
       * @param argDump_tables Value to assign to this.dump_tables
       */
      public void setDump_tables(boolean argDump_tables){
  	this.dump_tables = argDump_tables;
      }
  
      /**
       * Gets the value of dump
       *
       * @return the value of dump
       */
      public boolean isDump() {
  	return this.dump;
      }
  
      /**
       * Sets the value of dump
       *
       * @param argDump Value to assign to this.dump
       */
      public void setDump(boolean argDump){
  	this.dump = argDump;
      }
  
      /**
       * Gets the value of time
       *
       * @return the value of time
       */
      public boolean isTime() {
  	return this.time;
      }
  
      /**
       * Sets the value of time
       *
       * @param argTime Value to assign to this.time
       */
      public void setTime(boolean argTime){
  	this.time = argTime;
      }
  
      /**
       * Gets the value of debug
       *
       * @return the value of debug
       */
      public boolean isDebug() {
  	return this.debug;
      }
  
      /**
       * Sets the value of debug
       *
       * @param argDebug Value to assign to this.debug
       */
      public void setDebug(boolean argDebug){
  	this.debug = argDebug;
      }
      
      /**
        * Gets the value of debug
       *
        * @return the value of debug
        */
      public boolean isDebugSymbols() {
   	return this.debugsymbols;
      }
   
       /**
        * Sets the value of debug
        *
        * @param argDebug Value to assign to this.debug
        */
      public void setDebugSymbols(boolean argDebug){
   	this.debugsymbols = argDebug;
      }
   
       /**
       * Gets the value of nopositions
       *
       * @return the value of nopositions
       */
      public boolean isNopositions() {
  	return this.nopositions;
      }
  
      /**
       * Sets the value of nopositions
       *
       * @param argNopositions Value to assign to this.nopositions
       */
      public void setNopositions(boolean argNopositions){
  	this.nopositions = argNopositions;
      }
      /**
       * Gets the value of locations
       *
       * @return the value of locations
       */
      public boolean isLocations() {
  	return this.locations;
      }
  
      /**
       * Sets the value of locations
       *
       * @param argLocations Value to assign to this.locations
       */
      public void setLocations(boolean argLocations){
  	this.locations = argLocations;
      }
  
      /**
       * Gets the value of noscanner
       *
       * @return the value of noscanner
       */
      public boolean isNoscanner() {
  	return this.noscanner;
      }
  
      /**
       * Sets the value of noscanner
       *
       * @param argNoscanner Value to assign to this.noscanner
       */
      public void setNoscanner(boolean argNoscanner){
  	this.noscanner = argNoscanner;
      }
  
  	public boolean isXmlactions() {
  		return xmlactions;
  	}
  
  	public void setXmlactions(boolean xmlactions) {
  		this.xmlactions = xmlactions;
  	}
  
  	public boolean isGenericlabels() {
  		return genericlabels;
  	}
  
  	public void setGenericlabels(boolean genericlabels) {
  		this.genericlabels = genericlabels;
  	}
  
  
  }
  
    
    
  