@@ -37,6 +37,9 @@ public class PosixParser extends Parser
3737 /** specifies if bursting should continue */
3838 private boolean eatTheRest ;
3939
40+ /** holder for the current option */
41+ private Option currentOption ;
42+
4043 /** the command line Options */
4144 private Options options ;
4245
@@ -109,12 +112,14 @@ protected String[] flatten(Options options, String[] arguments, boolean stopAtNo
109112 int pos = token .indexOf ('=' );
110113 String opt = pos == -1 ? token : token .substring (0 , pos ); // --foo
111114
112- if (!options .hasOption (opt ) && stopAtNonOption )
115+ if (!options .hasOption (opt ))
113116 {
114- processNonOptionToken (token );
117+ processNonOptionToken (token , stopAtNonOption );
115118 }
116119 else
117120 {
121+ currentOption = options .getOption (opt );
122+
118123 tokens .add (opt );
119124 if (pos != -1 )
120125 {
@@ -130,27 +135,19 @@ else if ("-".equals(token))
130135 }
131136 else if (token .startsWith ("-" ))
132137 {
133- if (token .length () == 2 )
138+ if (token .length () == 2 || options . hasOption ( token ) )
134139 {
135140 processOptionToken (token , stopAtNonOption );
136141 }
137- else if (options .hasOption (token ))
138- {
139- tokens .add (token );
140- }
141142 // requires bursting
142143 else
143144 {
144145 burstToken (token , stopAtNonOption );
145146 }
146147 }
147- else if (stopAtNonOption )
148- {
149- processNonOptionToken (token );
150- }
151148 else
152149 {
153- tokens . add (token );
150+ processNonOptionToken (token , stopAtNonOption );
154151 }
155152
156153 gobble (iter );
@@ -182,10 +179,14 @@ private void gobble(Iterator iter)
182179 *
183180 * @param value The current token
184181 */
185- private void processNonOptionToken (String value )
182+ private void processNonOptionToken (String value , boolean stopAtNonOption )
186183 {
187- eatTheRest = true ;
188- tokens .add ("--" );
184+ if (stopAtNonOption && (currentOption == null || !currentOption .hasArg ()))
185+ {
186+ eatTheRest = true ;
187+ tokens .add ("--" );
188+ }
189+
189190 tokens .add (value );
190191 }
191192
@@ -203,11 +204,16 @@ private void processNonOptionToken(String value)
203204 */
204205 private void processOptionToken (String token , boolean stopAtNonOption )
205206 {
206- if (!options .hasOption (token ) && stopAtNonOption )
207+ if (stopAtNonOption && !options .hasOption (token ))
207208 {
208209 eatTheRest = true ;
209210 }
210211
212+ if (options .hasOption (token ))
213+ {
214+ currentOption = options .getOption (token );
215+ }
216+
211217 tokens .add (token );
212218 }
213219
@@ -239,8 +245,6 @@ private void processOptionToken(String token, boolean stopAtNonOption)
239245 */
240246 protected void burstToken (String token , boolean stopAtNonOption )
241247 {
242- Option currentOption ;
243-
244248 for (int i = 1 ; i < token .length (); i ++)
245249 {
246250 String ch = String .valueOf (token .charAt (i ));
@@ -259,7 +263,7 @@ protected void burstToken(String token, boolean stopAtNonOption)
259263 }
260264 else if (stopAtNonOption )
261265 {
262- processNonOptionToken (token .substring (i ));
266+ processNonOptionToken (token .substring (i ), true );
263267 break ;
264268 }
265269 else
0 commit comments