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 }