| 194 | } |
| 195 | |
| 196 | func parseArgv(tokens *tokenList, options *patternList, optionsFirst bool) (patternList, error) { |
| 197 | /* |
| 198 | Parse command-line argument vector. |
| 199 | |
| 200 | If options_first: |
| 201 | argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ; |
| 202 | else: |
| 203 | argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ; |
| 204 | */ |
| 205 | parsed := patternList{} |
| 206 | for tokens.current() != nil { |
| 207 | if tokens.current().eq("--") { |
| 208 | for _, v := range tokens.tokens { |
| 209 | parsed = append(parsed, newArgument("", v)) |
| 210 | } |
| 211 | return parsed, nil |
| 212 | } else if tokens.current().hasPrefix("--") { |
| 213 | pl, err := parseLong(tokens, options) |
| 214 | if err != nil { |
| 215 | return nil, err |
| 216 | } |
| 217 | parsed = append(parsed, pl...) |
| 218 | } else if tokens.current().hasPrefix("-") && !tokens.current().eq("-") { |
| 219 | ps, err := parseShorts(tokens, options) |
| 220 | if err != nil { |
| 221 | return nil, err |
| 222 | } |
| 223 | parsed = append(parsed, ps...) |
| 224 | } else if optionsFirst { |
| 225 | for _, v := range tokens.tokens { |
| 226 | parsed = append(parsed, newArgument("", v)) |
| 227 | } |
| 228 | return parsed, nil |
| 229 | } else { |
| 230 | parsed = append(parsed, newArgument("", tokens.move().String())) |
| 231 | } |
| 232 | } |
| 233 | return parsed, nil |
| 234 | } |
| 235 | |
| 236 | func parseOption(optionDescription string) *pattern { |
| 237 | optionDescription = strings.TrimSpace(optionDescription) |