Header And Logo

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

Data Structures | Defines | Functions | Variables

getopt_long.h File Reference

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  option

Defines

#define no_argument   0
#define required_argument   1

Functions

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

Variables

int opterr
int optind
int optopt
char * optarg

Define Documentation

#define no_argument   0

Definition at line 32 of file getopt_long.h.

#define required_argument   1

Definition at line 33 of file getopt_long.h.


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;
}


Variable Documentation

char* optarg

Definition at line 51 of file getopt.c.

int opterr

Definition at line 48 of file getopt.c.

int optind

Definition at line 49 of file getopt.c.

int optopt

Definition at line 49 of file getopt.c.

Referenced by getopt(), getopt_long(), and main().