/* * This file is part of the Haven & Hearth game client. * Copyright (C) 2009 Fredrik Tolf <fredrik@dolda2000.com>, and * Björn Johannessen <johannessen.bjorn@gmail.com> * * Redistribution and/or modification of this file is subject to the * terms of the GNU Lesser General Public License, version 3, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Other parts of this source tree adhere to other copying * rights. Please see the file `COPYING' in the root directory of the * source tree for details. * * A copy the GNU Lesser General Public License is distributed along * with the source tree of which this file is a part in the file * `doc/LPGL-3'. If it is missing for any reason, please see the Free * Software Foundation's website at <http://www.fsf.org/>, or write * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA */ package haven; import java.util.*; public class PosixArgs { private List<Arg> parsed; public String[] rest; public String arg = null; private static class Arg { private char ch; private String arg; private Arg(char ch, String arg) { this.ch = ch; this.arg = arg; } } private PosixArgs() { parsed = new ArrayList<Arg>(); } public static PosixArgs getopt(String[] argv, int start, String desc) { PosixArgs ret = new PosixArgs(); List<Character> fl = new ArrayList<Character>(), fla = new ArrayList<Character>(); List<String> rest = new ArrayList<String>(); for(int i = 0; i < desc.length();) { char ch = desc.charAt(i++); if((i < desc.length()) && (desc.charAt(i) == ':')) { i++; fla.add(ch); } else { fl.add(ch); } } boolean acc = true; for(int i = start; i < argv.length;) { String arg = argv[i++]; if(acc && arg.equals("--")) { acc = false; } if(acc && (arg.charAt(0) == '-')) { for(int o = 1; o < arg.length();) { char ch = arg.charAt(o++); if(fl.contains(ch)) { ret.parsed.add(new Arg(ch, null)); } else if(fla.contains(ch)) { if(o < arg.length()) { ret.parsed.add(new Arg(ch, arg.substring(o))); break; } else if(i < argv.length) { ret.parsed.add(new Arg(ch, argv[i++])); break; } else { System.err.println("option requires an argument -- '" + ch + "'"); return(null); } } else { System.err.println("invalid option -- '" + ch + "'"); return(null); } } } else { rest.add(arg); } } ret.rest = rest.toArray(new String[0]); return(ret); } public static PosixArgs getopt(String[] argv, String desc) { return(getopt(argv, 0, desc)); } public Iterable<Character> parsed() { return(new Iterable<Character>() { public Iterator<Character> iterator() { return(new Iterator<Character>() { private int i = 0; public boolean hasNext() { return(i < parsed.size()); } public Character next() { if(i >= parsed.size()) throw(new NoSuchElementException()); Arg a = parsed.get(i++); arg = a.arg; return(a.ch); } public void remove() { throw(new UnsupportedOperationException()); } }); } }); } }