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