PostgreSQL Source Code  git master
getopt_long.h File Reference
#include "pg_getopt.h"
Include dependency graph for getopt_long.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  option
 

Macros

#define no_argument   0
 
#define required_argument   1
 
#define optional_argument   2
 

Functions

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

Macro Definition Documentation

◆ no_argument

#define no_argument   0

Definition at line 24 of file getopt_long.h.

◆ optional_argument

#define optional_argument   2

Definition at line 26 of file getopt_long.h.

◆ required_argument

#define required_argument   1

Definition at line 25 of file getopt_long.h.

Function Documentation

◆ getopt_long()

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.

60 {
61  static char *place = EMSG; /* option letter processing */
62  char *oli; /* option letter list index */
63 
64  if (!*place)
65  { /* update scanning pointer */
66  if (optind >= argc)
67  {
68  place = EMSG;
69  return -1;
70  }
71 
72  place = argv[optind];
73 
74  if (place[0] != '-')
75  {
76  place = EMSG;
77  return -1;
78  }
79 
80  place++;
81 
82  if (!*place)
83  {
84  /* treat "-" as not being an option */
85  place = EMSG;
86  return -1;
87  }
88 
89  if (place[0] == '-' && place[1] == '\0')
90  {
91  /* found "--", treat it as end of options */
92  ++optind;
93  place = EMSG;
94  return -1;
95  }
96 
97  if (place[0] == '-' && place[1])
98  {
99  /* long option */
100  size_t namelen;
101  int i;
102 
103  place++;
104 
105  namelen = strcspn(place, "=");
106  for (i = 0; longopts[i].name != NULL; i++)
107  {
108  if (strlen(longopts[i].name) == namelen
109  && strncmp(place, longopts[i].name, namelen) == 0)
110  {
111  int has_arg = longopts[i].has_arg;
112 
113  if (has_arg != no_argument)
114  {
115  if (place[namelen] == '=')
116  optarg = place + namelen + 1;
117  else if (optind < argc - 1 &&
118  has_arg == required_argument)
119  {
120  optind++;
121  optarg = argv[optind];
122  }
123  else
124  {
125  if (optstring[0] == ':')
126  return BADARG;
127 
128  if (opterr && has_arg == required_argument)
129  fprintf(stderr,
130  "%s: option requires an argument -- %s\n",
131  argv[0], place);
132 
133  place = EMSG;
134  optind++;
135 
136  if (has_arg == required_argument)
137  return BADCH;
138  optarg = NULL;
139  }
140  }
141  else
142  {
143  optarg = NULL;
144  if (place[namelen] != 0)
145  {
146  /* XXX error? */
147  }
148  }
149 
150  optind++;
151 
152  if (longindex)
153  *longindex = i;
154 
155  place = EMSG;
156 
157  if (longopts[i].flag == NULL)
158  return longopts[i].val;
159  else
160  {
161  *longopts[i].flag = longopts[i].val;
162  return 0;
163  }
164  }
165  }
166 
167  if (opterr && optstring[0] != ':')
168  fprintf(stderr,
169  "%s: illegal option -- %s\n", argv[0], place);
170  place = EMSG;
171  optind++;
172  return BADCH;
173  }
174  }
175 
176  /* short option */
177  optopt = (int) *place++;
178 
179  oli = strchr(optstring, optopt);
180  if (!oli)
181  {
182  if (!*place)
183  ++optind;
184  if (opterr && *optstring != ':')
185  fprintf(stderr,
186  "%s: illegal option -- %c\n", argv[0], optopt);
187  return BADCH;
188  }
189 
190  if (oli[1] != ':')
191  { /* don't need argument */
192  optarg = NULL;
193  if (!*place)
194  ++optind;
195  }
196  else
197  { /* need an argument */
198  if (*place) /* no white space */
199  optarg = place;
200  else if (argc <= ++optind)
201  { /* no arg */
202  place = EMSG;
203  if (*optstring == ':')
204  return BADARG;
205  if (opterr)
206  fprintf(stderr,
207  "%s: option requires an argument -- %c\n",
208  argv[0], optopt);
209  return BADCH;
210  }
211  else
212  /* white space */
213  optarg = argv[optind];
214  place = EMSG;
215  ++optind;
216  }
217  return optopt;
218 }
const char * name
Definition: encode.c:571
#define BADCH
Definition: getopt_long.c:41
#define BADARG
Definition: getopt_long.c:42
#define EMSG
Definition: getopt_long.c:43
#define no_argument
Definition: getopt_long.h:24
#define required_argument
Definition: getopt_long.h:25
int i
Definition: isn.c:73
PGDLLIMPORT int optind
Definition: getopt.c:50
PGDLLIMPORT int optopt
Definition: getopt.c:51
PGDLLIMPORT int opterr
Definition: getopt.c:49
PGDLLIMPORT char * optarg
Definition: getopt.c:52
#define fprintf
Definition: port.h:242
int val
Definition: getopt_long.h:21
int has_arg
Definition: getopt_long.h:19
int * flag
Definition: getopt_long.h:20
const char * name
Definition: getopt_long.h:18
char * flag(int b)
Definition: test-ctype.c:33

References BADARG, BADCH, EMSG, option::flag, flag(), fprintf, option::has_arg, i, name, option::name, no_argument, optarg, opterr, optind, optopt, required_argument, and option::val.

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