1+ /*
2+ * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//cli/src/java/org/apache/commons/cli/GnuParser.java,v 1.1 2002/06/19 21:25:40 jkeyes Exp $
3+ * $Revision: 1.1 $
4+ * $Date: 2002/06/19 21:25:40 $
5+ *
6+ * ====================================================================
7+ *
8+ * The Apache Software License, Version 1.1
9+ *
10+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
11+ * reserved.
12+ *
13+ * Redistribution and use in source and binary forms, with or without
14+ * modification, are permitted provided that the following conditions
15+ * are met:
16+ *
17+ * 1. Redistributions of source code must retain the above copyright
18+ * notice, this list of conditions and the following disclaimer.
19+ *
20+ * 2. Redistributions in binary form must reproduce the above copyright
21+ * notice, this list of conditions and the following disclaimer in
22+ * the documentation and/or other materials provided with the
23+ * distribution.
24+ *
25+ * 3. The end-user documentation included with the redistribution, if
26+ * any, must include the following acknowlegement:
27+ * "This product includes software developed by the
28+ * Apache Software Foundation (http://www.apache.org/)."
29+ * Alternately, this acknowlegement may appear in the software itself,
30+ * if and wherever such third-party acknowlegements normally appear.
31+ *
32+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
33+ * Foundation" must not be used to endorse or promote products derived
34+ * from this software without prior written permission. For written
35+ * permission, please contact apache@apache.org.
36+ *
37+ * 5. Products derived from this software may not be called "Apache"
38+ * nor may "Apache" appear in their names without prior written
39+ * permission of the Apache Group.
40+ *
41+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52+ * SUCH DAMAGE.
53+ * ====================================================================
54+ *
55+ * This software consists of voluntary contributions made by many
56+ * individuals on behalf of the Apache Software Foundation. For more
57+ * information on the Apache Software Foundation, please see
58+ * <http://www.apache.org/>.
59+ *
60+ */
61+ package org .apache .commons .cli ;
62+
63+ import java .util .Iterator ;
64+ import java .util .LinkedList ;
65+ import java .util .List ;
66+
67+ /**
68+ * GnuParser parses the command line arguments using the GNU style.
69+ * For example, -buildfile can only be interpreted as the option
70+ * 'buildfile'.
71+ *
72+ * @author John Keyes (jbjk at mac.com)
73+ */
74+ public class GnuParser implements CommandLineParser {
75+
76+ /**
77+ * Parse the arguments according to the specified options.
78+ * @param options the specified Options
79+ * @param arguments the command line arguments
80+ * @return the list of atomic option and value tokens
81+ */
82+ public List parse ( Options options , List arguments ) {
83+ return parse ( options , arguments , false );
84+ }
85+
86+ /**
87+ * Parse the arguments according to the specified options.
88+ * @param options the specified Options
89+ * @param arguments the command line arguments
90+ * @param stopAtNonOption specifies whether to continue parsing the
91+ * arguments if a non option is encountered.
92+ * @return the list of atomic option and value tokens
93+ */
94+ public List parse ( Options options , List arguments , boolean stopAtNonOption ) {
95+ List args = new LinkedList ();
96+
97+ Iterator argIter = arguments .iterator ();
98+ String eachArg = null ;
99+
100+ boolean eatTheRest = false ;
101+
102+ while ( argIter .hasNext () ) {
103+ eachArg = (String ) argIter .next ();
104+
105+ if ( eachArg .equals ("--" ) ) {
106+ // Look for -- to indicate end-of-options, and
107+ // just stuff it, along with everything past it
108+ // into the returned list.
109+
110+ args .add ( eachArg );
111+ eatTheRest = true ;
112+ }
113+ else if ( eachArg .startsWith ("--" ) ) {
114+ // It's a long-option, so doesn't need any
115+ // bursting applied to it.
116+
117+ args .add ( eachArg );
118+ }
119+ else if ( eachArg .startsWith ("-" ) ) {
120+
121+ if ( eachArg .length () == 1 ) {
122+ // It's not really an option, so
123+ // just drop it on the list
124+
125+ if ( stopAtNonOption ) {
126+ eatTheRest = true ;
127+ }
128+ else {
129+ args .add ( eachArg );
130+ }
131+ }
132+ else if ( eachArg .length () == 2 ) {
133+ args .add ( eachArg );
134+ }
135+ else {
136+ String charOpt = eachArg .substring ( 1 , 2 );
137+
138+ if ( options .getOption ( charOpt ) != null
139+ && options .getOption ( eachArg ) == null )
140+ {
141+ args .add ( "-" + charOpt );
142+ args .add ( eachArg .substring ( 2 , eachArg .length () ) );
143+ }
144+ else {
145+ args .add ( eachArg );
146+ }
147+ }
148+ }
149+ else {
150+ // It's just a normal non-option arg,
151+ // so dump it into the list of returned
152+ // values.
153+
154+ args .add ( eachArg );
155+
156+ if ( stopAtNonOption ) {
157+ eatTheRest = true ;
158+ }
159+ }
160+
161+ if ( eatTheRest ) {
162+ while ( argIter .hasNext () ) {
163+ args .add ( argIter .next () );
164+ }
165+ }
166+ }
167+
168+ return args ;
169+ }
170+ }
0 commit comments