/* * The JastAdd Extensible Java Compiler (http://jastadd.org) is covered * by the modified BSD License. You should have received a copy of the * modified BSD license with this compiler. * * Copyright (c) 2005-2008, Torbjorn Ekman * All rights reserved. */ import java.util.*; aspect Options { static class Option { public String name; public boolean hasValue; public boolean isCollection; public Option(String name, boolean hasValue, boolean isCollection) { this.name = name; this.hasValue = hasValue; this.isCollection = isCollection; } } private static Map Program.options = new HashMap(); private static Map Program.optionDescriptions = new HashMap(); private HashSet Program.files = new HashSet(); public Collection Program.files() { return files; } public static void Program.initOptions() { options = new HashMap(); optionDescriptions = new HashMap(); } public void Program.addKeyOption(String name) { if(optionDescriptions.containsKey(name)) throw new Error("Command line definition error: option description for " + name + " is multiply declared"); optionDescriptions.put(name, new Option(name, false, false)); } public void Program.addKeyValueOption(String name) { if(optionDescriptions.containsKey(name)) throw new Error("Command line definition error: option description for " + name + " is multiply declared"); optionDescriptions.put(name, new Option(name, true, false)); } public void Program.addKeyCollectionOption(String name) { if(optionDescriptions.containsKey(name)) throw new Error("Command line definition error: option description for " + name + " is multiply declared"); optionDescriptions.put(name, new Option(name, true, true)); } public void Program.addOptionDescription(String name, boolean value) { if(optionDescriptions.containsKey(name)) throw new Error("Command line definition error: option description for " + name + " is multiply declared"); optionDescriptions.put(name, new Option(name, value, false)); } public void Program.addOptionDescription(String name, boolean value, boolean isCollection) { if(optionDescriptions.containsKey(name)) throw new Error("Command line definition error: option description for " + name + " is multiply declared"); optionDescriptions.put(name, new Option(name, value, isCollection)); } public void Program.addOptions(String[] args) { for(int i = 0; i < args.length; i++) { String arg = args[i]; if(arg.startsWith("@")) { try { String fileName = arg.substring(1,arg.length()); java.io.StreamTokenizer tokenizer = new java.io.StreamTokenizer(new java.io.FileReader(fileName)); tokenizer.resetSyntax(); tokenizer.whitespaceChars(' ',' '); tokenizer.whitespaceChars('\t','\t'); tokenizer.whitespaceChars('\f','\f'); tokenizer.whitespaceChars('\n','\n'); tokenizer.whitespaceChars('\r','\r'); tokenizer.wordChars(33,255); ArrayList list = new ArrayList(); int next = tokenizer.nextToken(); while(next != java.io.StreamTokenizer.TT_EOF) { if(next == java.io.StreamTokenizer.TT_WORD) { list.add(tokenizer.sval); } next = tokenizer.nextToken(); } String[] newArgs = new String[list.size()]; int index = 0; for(Iterator iter = list.iterator(); iter.hasNext(); index++) { newArgs[index] = (String)iter.next(); } addOptions(newArgs); } catch (java.io.IOException e) { } } else if(arg.startsWith("-")) { if(!optionDescriptions.containsKey(arg)) throw new Error("Command line argument error: option " + arg + " is not defined"); Option o = (Option)optionDescriptions.get(arg); if(!o.isCollection && options.containsKey(arg)) throw new Error("Command line argument error: option " + arg + " is multiply defined"); if(o.hasValue && !o.isCollection) { String value = null; if(i + 1 > args.length - 1) throw new Error("Command line argument error: value missing for key " + arg); value = args[i+1]; if(value.startsWith("-")) throw new Error("Command line argument error: value missing for key " + arg); i++; options.put(arg, value); } else if(o.hasValue && o.isCollection) { String value = null; if(i + 1 > args.length - 1) throw new Error("Command line argument error: value missing for key " + arg); value = args[i+1]; if(value.startsWith("-")) throw new Error("Command line argument error: value missing for key " + arg); i++; Collection c = (Collection)options.get(arg); if(c == null) c = new ArrayList(); c.add(value); options.put(arg, c); } else { options.put(arg, null); } } else { files.add(arg); } } } public static boolean Program.hasOption(String name) { return options.containsKey(name); } public static void Program.setOption(String name) { options.put(name, null); } public static boolean Program.hasValueForOption(String name) { return options.containsKey(name) && options.get(name) != null; } public static String Program.getValueForOption(String name) { if(!hasValueForOption(name)) throw new Error("Command line argument error: key " + name + " does not have a value"); return (String)options.get(name); } public static void Program.setValueForOption(String value, String option) { options.put(option, value); } public static Collection Program.getValueCollectionForOption(String name) { if(!hasValueForOption(name)) throw new Error("Command line argument error: key " + name + " does not have a value"); return (Collection)options.get(name); } public static boolean Program.verbose() { return hasOption("-verbose"); } }