Back to index

php5  5.3.10
Classes | Typedefs | Functions | Variables
php_getopt.h File Reference
#include "php.h"
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _opt_struct

Typedefs

typedef struct _opt_struct opt_struct

Functions

PHPAPI int php_getopt (int argc, char *const *argv, const opt_struct opts[], char **optarg, int *optind, int show_err, int arg_start)

Variables

PHPAPI int php_optidx

Class Documentation

struct _opt_struct

Definition at line 36 of file php_getopt.h.

Class Members
int need_param
char opt_char
char * opt_name

Typedef Documentation

typedef struct _opt_struct opt_struct

Function Documentation

PHPAPI int php_getopt ( int  argc,
char *const *  argv,
const opt_struct  opts[],
char **  optarg,
int optind,
int  show_err,
int  arg_start 
)

Definition at line 58 of file getopt.c.

{
       static int optchr = 0;
       static int dash = 0; /* have already seen the - */

       php_optidx = -1;

       if (*optind >= argc) {
              return(EOF);
       }
       if (!dash) {
              if ((argv[*optind][0] !=  '-')) {
                     return(EOF);
              } else {
                     if (!argv[*optind][1])
                     {
                            /*
                            * use to specify stdin. Need to let pgm process this and
                            * the following args
                            */
                            return(EOF);
                     }
              }
       }
       if ((argv[*optind][0] == '-') && (argv[*optind][1] == '-')) {
              char *pos;
              int arg_end = strlen(argv[*optind])-1;

              /* '--' indicates end of args if not followed by a known long option name */
              if (argv[*optind][2] == '\0') {
                     (*optind)++;
                     return(EOF);
              }

              arg_start = 2;

              /* Check for <arg>=<val> */
              if ((pos = php_memnstr(&argv[*optind][arg_start], "=", 1, argv[*optind]+arg_end)) != NULL) {
                     arg_end = pos-&argv[*optind][arg_start];
                     arg_start++;
              } else {
                     arg_end--;
              }

              while (1) {
                     php_optidx++;
                     if (opts[php_optidx].opt_char == '-') {
                            (*optind)++;
                            return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err));
                     } else if (opts[php_optidx].opt_name && !strncmp(&argv[*optind][2], opts[php_optidx].opt_name, arg_end) && arg_end == strlen(opts[php_optidx].opt_name)) {
                            break;
                     }
              }

              optchr = 0;
              dash = 0;
              arg_start += strlen(opts[php_optidx].opt_name);
       } else {
              if (!dash) {
                     dash = 1;
                     optchr = 1;
              }
              /* Check if the guy tries to do a -: kind of flag */
              if (argv[*optind][optchr] == ':') {
                     dash = 0;
                     (*optind)++;
                     return (php_opt_error(argc, argv, *optind-1, optchr, OPTERRCOLON, show_err));
              }
              arg_start = 1 + optchr;
       }
       if (php_optidx < 0) {
              while (1) {
                     php_optidx++;
                     if (opts[php_optidx].opt_char == '-') {
                            int errind = *optind;
                            int errchr = optchr;

                            if (!argv[*optind][optchr+1]) {
                                   dash = 0;
                                   (*optind)++;
                            } else {
                                   optchr++;
                                   arg_start++;
                            }
                            return(php_opt_error(argc, argv, errind, errchr, OPTERRNF, show_err));
                     } else if (argv[*optind][optchr] == opts[php_optidx].opt_char) {
                            break;
                     }
              }
       }
       if (opts[php_optidx].need_param) {
              /* Check for cases where the value of the argument
              is in the form -<arg> <val>, -<arg>=<varl> or -<arg><val> */
              dash = 0;
              if (!argv[*optind][arg_start]) {
                     (*optind)++;
                     if (*optind == argc) {
                            /* Was the value required or is it optional? */
                            if (opts[php_optidx].need_param == 1) {
                                   return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err));
                            }
                     /* Optional value is not supported with -<arg> <val> style */
                     } else if (opts[php_optidx].need_param == 1) {
                            *optarg = argv[(*optind)++];
                     }
              } else if (argv[*optind][arg_start] == '=') {
                     arg_start++;
                     *optarg = &argv[*optind][arg_start];
                     (*optind)++;
              } else {
                     *optarg = &argv[*optind][arg_start];
                     (*optind)++;
              }
              return opts[php_optidx].opt_char;
       } else {
              /* multiple options specified as one (exclude long opts) */
              if (arg_start >= 2 && !((argv[*optind][0] == '-') && (argv[*optind][1] == '-'))) {
                     if (!argv[*optind][optchr+1])
                     {
                            dash = 0;
                            (*optind)++;
                     } else {
                            optchr++;
                     }
              } else {
                     (*optind)++;
              }
              return opts[php_optidx].opt_char;
       }
       assert(0);
       return(0);    /* never reached */
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Definition at line 56 of file getopt.c.