Header And Logo

PostgreSQL
| The world's most advanced open source database.

Defines | Functions

getopt_long.c File Reference

#include "c.h"
#include "getopt_long.h"
Include dependency graph for getopt_long.c:

Go to the source code of this file.

Defines

#define BADCH   '?'
#define BADARG   ':'
#define EMSG   ""

Functions

int getopt_long (int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex)

Define Documentation

#define BADARG   ':'

Definition at line 42 of file getopt_long.c.

#define BADCH   '?'

Definition at line 41 of file getopt_long.c.

#define EMSG   ""

Definition at line 43 of file getopt_long.c.


Function Documentation

int getopt_long ( int  argc,
char *const   argv[],
const char *  optstring,
const struct option longopts,
int *  longindex 
)

Definition at line 57 of file getopt_long.c.

References option::flag, flag(), i, name, option::name, NULL, optarg, opterr, optind, optopt, and option::val.

Referenced by handle_args(), main(), parse_psql_options(), parseCommandLine(), and regression_main().

{
    static char *place = EMSG;  /* option letter processing */
    char       *oli;            /* option letter list index */

    if (!*place)
    {                           /* update scanning pointer */
        if (optind >= argc)
        {
            place = EMSG;
            return -1;
        }

        place = argv[optind];

        if (place[0] != '-')
        {
            place = EMSG;
            return -1;
        }

        place++;

        if (place[0] && place[0] == '-' && place[1] == '\0')
        {                       /* found "--" */
            ++optind;
            place = EMSG;
            return -1;
        }

        if (place[0] && place[0] == '-' && place[1])
        {
            /* long option */
            size_t      namelen;
            int         i;

            place++;

            namelen = strcspn(place, "=");
            for (i = 0; longopts[i].name != NULL; i++)
            {
                if (strlen(longopts[i].name) == namelen
                    && strncmp(place, longopts[i].name, namelen) == 0)
                {
                    if (longopts[i].has_arg)
                    {
                        if (place[namelen] == '=')
                            optarg = place + namelen + 1;
                        else if (optind < argc - 1)
                        {
                            optind++;
                            optarg = argv[optind];
                        }
                        else
                        {
                            if (optstring[0] == ':')
                                return BADARG;
                            if (opterr)
                                fprintf(stderr,
                                   "%s: option requires an argument -- %s\n",
                                        argv[0], place);
                            place = EMSG;
                            optind++;
                            return BADCH;
                        }
                    }
                    else
                    {
                        optarg = NULL;
                        if (place[namelen] != 0)
                        {
                            /* XXX error? */
                        }
                    }

                    optind++;

                    if (longindex)
                        *longindex = i;

                    place = EMSG;

                    if (longopts[i].flag == NULL)
                        return longopts[i].val;
                    else
                    {
                        *longopts[i].flag = longopts[i].val;
                        return 0;
                    }
                }
            }

            if (opterr && optstring[0] != ':')
                fprintf(stderr,
                        "%s: illegal option -- %s\n", argv[0], place);
            place = EMSG;
            optind++;
            return BADCH;
        }
    }

    /* short option */
    optopt = (int) *place++;

    oli = strchr(optstring, optopt);
    if (!oli)
    {
        if (!*place)
            ++optind;
        if (opterr && *optstring != ':')
            fprintf(stderr,
                    "%s: illegal option -- %c\n", argv[0], optopt);
        return BADCH;
    }

    if (oli[1] != ':')
    {                           /* don't need argument */
        optarg = NULL;
        if (!*place)
            ++optind;
    }
    else
    {                           /* need an argument */
        if (*place)             /* no white space */
            optarg = place;
        else if (argc <= ++optind)
        {                       /* no arg */
            place = EMSG;
            if (*optstring == ':')
                return BADARG;
            if (opterr)
                fprintf(stderr,
                        "%s: option requires an argument -- %c\n",
                        argv[0], optopt);
            return BADCH;
        }
        else
            /* white space */
            optarg = argv[optind];
        place = EMSG;
        ++optind;
    }
    return optopt;
}