getopt.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 /*
10  * Copyright (c) 1987, 1993, 1994
11  * The Regents of the University of California. All rights reserved.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution.
21  * 3. Neither the name of the University nor the names of its contributors
22  * may be used to endorse or promote products derived from this software
23  * without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  */
37 
38 #include "squid.h"
39 
40 #if defined(LIBC_SCCS) && !defined(lint)
41 static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
42 #endif /* LIBC_SCCS and not lint */
43 
44 #include <stdlib.h>
45 #include <string.h>
46 
47 int opterr = 1, /* if error message should be printed */
48  optind = 1, /* index into parent argv vector */
49  optopt, /* character checked for validity */
50  optreset; /* reset getopt */
51 char *optarg; /* argument associated with option */
52 
53 #define BADCH (int)'?'
54 #define BADARG (int)':'
55 #define EMSG (char*)""
56 
57 /*
58  * getopt --
59  * Parse argc/argv argument vector.
60  */
61 int
62 getopt(nargc, nargv, ostr)
63 int nargc;
64 char *const *nargv;
65 const char *ostr;
66 {
67  static char *place = EMSG; /* option letter processing */
68  char *oli; /* option letter list index */
69 
70  if (optreset || !*place) { /* update scanning pointer */
71  optreset = 0;
72  if (optind >= nargc || *(place = nargv[optind]) != '-') {
73  place = EMSG;
74  return (-1);
75  }
76  if (place[1] && *++place == '-') { /* found "--" */
77  ++optind;
78  place = EMSG;
79  return (-1);
80  }
81  } /* option letter okay? */
82  if ((optopt = (int) *place++) == (int) ':' ||
83  !(oli = strchr(ostr, optopt))) {
84  /*
85  * if the user didn't specify '-' as an option,
86  * assume it means -1.
87  */
88  if (optopt == (int) '-')
89  return (-1);
90  if (!*place)
91  ++optind;
92  if (opterr && *ostr != ':')
93  (void) fprintf(stderr,
94  "%s: illegal option -- %c\n", __FILE__, optopt);
95  return (BADCH);
96  }
97  if (*++oli != ':') { /* don't need argument */
98  optarg = NULL;
99  if (!*place)
100  ++optind;
101  } else { /* need an argument */
102  if (*place) /* no white space */
103  optarg = place;
104  else if (nargc <= ++optind) { /* no arg */
105  place = EMSG;
106  if (*ostr == ':')
107  return (BADARG);
108  if (opterr)
109  (void) fprintf(stderr,
110  "%s: option requires an argument -- %c\n",
111  __FILE__, optopt);
112  return (BADCH);
113  } else /* white space */
114  optarg = nargv[optind];
115  place = EMSG;
116  ++optind;
117  }
118  return (optopt); /* dump back option letter */
119 }
120 
int opterr
Definition: getopt.c:47
int optreset
Definition: getopt.c:50
char * optarg
Definition: getopt.c:51
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition: getopt.c:62
#define NULL
Definition: types.h:145
#define EMSG
Definition: getopt.c:55
int optopt
Definition: getopt.c:49
int optind
Definition: getopt.c:48
#define BADCH
Definition: getopt.c:53
#define BADARG
Definition: getopt.c:54

 

Introduction

Documentation

Support

Miscellaneous