2
+----------------------------------------------------------------------+
4
+----------------------------------------------------------------------+
5
| Copyright (c) 1997-2004 The PHP Group |
6
+----------------------------------------------------------------------+
7
| This source file is subject to version 3.0 of the PHP license, |
8
| that is bundled with this package in the file LICENSE, and is |
9
| available through the world-wide-web at the following url: |
10
| http://www.php.net/license/3_0.txt. |
11
| If you did not receive a copy of the PHP license and are unable to |
12
| obtain it through the world-wide-web, please send a note to |
13
| license@php.net so we can mail you a copy immediately. |
14
+----------------------------------------------------------------------+
15
| Author: Marcus Boerger <helly@php.net> |
16
+----------------------------------------------------------------------+
19
/* $Id: getopt.c,v 1.7 2004/01/08 08:18:09 andi Exp $ */
25
#include "php_getopt.h"
26
#define OPTERRCOLON (1)
31
static int php_opt_error(int argc, char * const *argv, int oint, int optchr, int err, int show_err)
35
fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1);
39
fprintf(stderr, ": in flags\n");
42
fprintf(stderr, "option not found %c\n", argv[oint][optchr]);
45
fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]);
48
fprintf(stderr, "unknown\n");
55
int php_getopt(int argc, char* const *argv, const opt_struct opts[], char **optarg, int *optind, int show_err)
57
static int optchr = 0;
58
static int dash = 0; /* have already seen the - */
63
if (*optind >= argc) {
67
if ((argv[*optind][0] != '-')) {
70
if (!argv[*optind][1])
73
* use to specify stdin. Need to let pgm process this and
80
if ((argv[*optind][0] == '-') && (argv[*optind][1] == '-')) {
81
/* '--' indicates end of args if not followed by a known long option name */
84
if (opts[opts_idx].opt_char == '-') {
87
} else if (opts[opts_idx].opt_name && !strcmp(&argv[*optind][2], opts[opts_idx].opt_name)) {
93
arg_start = 2 + strlen(opts[opts_idx].opt_name);
100
/* Check if the guy tries to do a -: kind of flag */
101
if (argv[*optind][optchr] == ':') {
104
return (php_opt_error(argc, argv, *optind-1, optchr, OPTERRCOLON, show_err));
109
if (opts[opts_idx].opt_char == '-') {
110
int errind = *optind;
113
if (!argv[*optind][optchr+1]) {
119
return(php_opt_error(argc, argv, errind, errchr, OPTERRNF, show_err));
120
} else if (argv[*optind][optchr] == opts[opts_idx].opt_char) {
125
if (opts[opts_idx].need_param) {
126
/* Check for cases where the value of the argument
127
is in the form -<arg> <val> or in the form -<arg><val> */
129
if(!argv[*optind][arg_start]) {
131
if (*optind == argc) {
132
return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err));
134
*optarg = argv[(*optind)++];
136
*optarg = &argv[*optind][arg_start];
139
return opts[opts_idx].opt_char;
141
if (arg_start == 2) {
142
if (!argv[*optind][optchr+1])
152
return opts[opts_idx].opt_char;
155
return(0); /* never reached */