/* * Copyright 2001-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * $Id: GetOpt.java,v 1.5 2004/02/16 21:21:06 minchau Exp $ */ package com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; /** * GetOpt is a Java equivalent to the C getopt() library function * discussed in man page getopt(3C). It provides command line * parsing for Java applications. It supports the most rules of the * command line standard (see man page intro(1)) including stacked * options such as '-sxm' (which is equivalent to -s -x -m); it * handles special '--' option that signifies the end of options. * Additionally this implementation of getopt will check for * mandatory arguments to options such as in the case of * '-d ' it will throw a MissingOptArgException if the * option argument '' is not included on the commandline. * getopt(3C) does not check for this. * @author G Todd Miller */ public class GetOpt{ public GetOpt(String[] args, String optString){ theOptions = new ArrayList(); int currOptIndex = 0; theCmdArgs = new ArrayList(); theOptionMatcher = new OptionMatcher(optString); // fill in the options list for(int i=0; i 2){ // stacked options found, such as '-shm' // iterate thru the tokens after the dash and // add them to theOptions list for(int j=1; j', if current option parsed is 'd' then * getOptionArg() would return ''. * @param none * @return String - argument for current parsed option. */ public String getOptionArg(){ String retval = null; String tmp = theCurrentOption.getArgument(); char c = theCurrentOption.getArgLetter(); if(theOptionMatcher.hasArg(c)){ retval = tmp; } return retval; } /** * gets list of the commandline arguments. For example, in command * such as 'cmd -s -d file file2 file3 file4' with the usage * 'cmd [-s] [-d ] ...', getCmdArgs() would return * the list {file2, file3, file4}. * @params none * @return String[] - list of command arguments that may appear * after options and option arguments. */ public String[] getCmdArgs(){ String[] retval = new String[theCmdArgs.size()]; int i=0; for(ListIterator it=theCmdArgs.listIterator(); it.hasNext();){ retval[i++] = (String)it.next(); } return retval; } private Option theCurrentOption = null; private ListIterator theOptionsIterator; private List theOptions = null; private List theCmdArgs = null; private OptionMatcher theOptionMatcher = null; /////////////////////////////////////////////////////////// // // Inner Classes // /////////////////////////////////////////////////////////// // inner class to model an option class Option{ private char theArgLetter; private String theArgument = null; public Option(char argLetter) { theArgLetter = argLetter; } public void setArg(String arg) { theArgument = arg; } public boolean hasArg() { return (theArgument != null); } public char getArgLetter() { return theArgLetter; } public String getArgument() { return theArgument; } } // end class Option // inner class to query optString for a possible option match, // and whether or not a given legal option takes an argument. // class OptionMatcher{ public OptionMatcher(String optString){ theOptString = optString; } public boolean match(char c){ boolean retval = false; if(theOptString.indexOf(c) != -1){ retval = true; } return retval; } public boolean hasArg(char c){ boolean retval = false; int index = theOptString.indexOf(c)+1; if (index == theOptString.length()){ // reached end of theOptString retval = false; } else if(theOptString.charAt(index) == ':'){ retval = true; } return retval; } private String theOptString = null; } // end class OptionMatcher }// end class GetOpt