001    package AST;
002    
003    import java.util.HashSet;
004    import java.io.File;
005    import java.util.*;
006    import beaver.*;
007    import java.util.ArrayList;
008    import java.util.zip.*;
009    import java.io.*;
010    import java.io.FileNotFoundException;
011    import java.util.Collection;
012    /**
013      * @ast class
014     * 
015     */
016    public class Options extends java.lang.Object {
017    static  class Option {
018        public String name;
019        public boolean hasValue;
020        public boolean isCollection;
021        public Option(String name, boolean hasValue, boolean isCollection) {
022          this.name = name;
023          this.hasValue = hasValue;
024          this.isCollection = isCollection;
025        }
026      }
027    
028    private  Map options = new HashMap();
029    
030    private  Map optionDescriptions = new HashMap();
031    
032    private  HashSet files = new HashSet();
033    
034    public  Collection files() {
035        return files;
036      }
037    
038    public  void initOptions() {
039        options = new HashMap();
040        optionDescriptions = new HashMap();
041        files = new HashSet();
042      }
043    
044    public  void addKeyOption(String name) {
045        if(optionDescriptions.containsKey(name))
046          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
047        optionDescriptions.put(name, new Option(name, false, false));
048      }
049    
050    public  void addKeyValueOption(String name) {
051        if(optionDescriptions.containsKey(name))
052          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
053        optionDescriptions.put(name, new Option(name, true, false));
054      }
055    
056    public  void addKeyCollectionOption(String name) {
057        if(optionDescriptions.containsKey(name))
058          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
059        optionDescriptions.put(name, new Option(name, true, true));
060      }
061    
062    public  void addOptionDescription(String name, boolean value) {
063        if(optionDescriptions.containsKey(name))
064          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
065        optionDescriptions.put(name, new Option(name, value, false));
066      }
067    
068    public  void addOptionDescription(String name, boolean value, boolean isCollection) {
069        if(optionDescriptions.containsKey(name))
070          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
071        optionDescriptions.put(name, new Option(name, value, isCollection));
072      }
073    
074    public  void addOptions(String[] args) {
075        for(int i = 0; i < args.length; i++) {
076          String arg = args[i];
077          if(arg.startsWith("@")) {
078            try {
079              String fileName = arg.substring(1,arg.length());
080              java.io.StreamTokenizer tokenizer = new java.io.StreamTokenizer(new java.io.FileReader(fileName));
081              tokenizer.resetSyntax();
082              tokenizer.whitespaceChars(' ',' ');
083              tokenizer.whitespaceChars('\t','\t');
084              tokenizer.whitespaceChars('\f','\f');
085              tokenizer.whitespaceChars('\n','\n');
086              tokenizer.whitespaceChars('\r','\r');
087              tokenizer.wordChars(33,255);
088              ArrayList list = new ArrayList();
089              int next = tokenizer.nextToken();
090              while(next != java.io.StreamTokenizer.TT_EOF) {
091                if(next == java.io.StreamTokenizer.TT_WORD) {
092                  list.add(tokenizer.sval);
093                }
094                next = tokenizer.nextToken();
095              }
096              String[] newArgs = new String[list.size()];
097              int index = 0;
098              for(Iterator iter = list.iterator(); iter.hasNext(); index++) {
099                newArgs[index] = (String)iter.next();
100              }
101              addOptions(newArgs);
102            } catch (java.io.FileNotFoundException e) {
103              System.err.println("File not found: "+arg.substring(1));
104            } catch (java.io.IOException e) {
105              System.err.println("Exception: "+e.getMessage());
106            }
107          }
108          else if(arg.startsWith("-")) {
109            if(!optionDescriptions.containsKey(arg))
110              throw new Error("Command line argument error: option " + arg + " is not defined");
111            Option o = (Option)optionDescriptions.get(arg);
112            
113            if(!o.isCollection && options.containsKey(arg))
114              throw new Error("Command line argument error: option " + arg + " is multiply defined");
115            
116            if(o.hasValue && !o.isCollection) {
117              String value = null;
118              if(i + 1 > args.length - 1)
119                throw new Error("Command line argument error: value missing for key " + arg);
120              value = args[i+1];
121              if(value.startsWith("-"))
122                throw new Error("Command line argument error: value missing for key " + arg);
123              i++;
124              options.put(arg, value);
125            }
126            else if(o.hasValue && o.isCollection) {
127              String value = null;
128              if(i + 1 > args.length - 1)
129                throw new Error("Command line argument error: value missing for key " + arg);
130              value = args[i+1];
131              if(value.startsWith("-"))
132                throw new Error("Command line argument error: value missing for key " + arg);
133              i++;
134              Collection c = (Collection)options.get(arg);
135              if(c == null)
136                c = new ArrayList();
137              c.add(value);
138              options.put(arg, c);
139            }
140            else {
141              options.put(arg, null);
142            }
143          }
144          else {
145            files.add(arg);
146          }
147        }
148      }
149    
150    public  boolean hasOption(String name) {
151        return options.containsKey(name);
152      }
153    
154    public  void setOption(String name) {
155        options.put(name, null);
156      }
157    
158    public  boolean hasValueForOption(String name) {
159        return options.containsKey(name) && options.get(name) != null;
160      }
161    
162    public  String getValueForOption(String name) {
163        if(!hasValueForOption(name))
164          throw new Error("Command line argument error: key " + name + " does not have a value");
165        return (String)options.get(name);
166      }
167    
168    public  void setValueForOption(String value, String option) {
169        options.put(option, value);
170      }
171    
172    public  Collection getValueCollectionForOption(String name) {
173        if(!hasValueForOption(name))
174          throw new Error("Command line argument error: key " + name + " does not have a value");
175        return (Collection)options.get(name);
176      }
177    
178    public  boolean verbose() {
179        return hasOption("-verbose");
180      }
181    
182    
183    }