]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/unifdef/FreeBSD/getopt.c
Add 'contrib/unifdef/' from commit '0da44885831dc0a43c4ca6ff04a2430993cc0a80'
[FreeBSD/FreeBSD.git] / contrib / unifdef / FreeBSD / getopt.c
1 /*
2  * Copyright (c) 1987, 1993, 1994
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #include "unifdef.h"
31
32 int     opterr = 1,             /* if error message should be printed */
33         optind = 1,             /* index into parent argv vector */
34         optopt,                 /* character checked for validity */
35         optreset;               /* reset getopt */
36 char    *optarg;                /* argument associated with option */
37
38 #define BADCH   (int)'?'
39 #define BADARG  (int)':'
40
41 static char EMSG[] = "";
42
43 /*
44  * getopt --
45  *      Parse argc/argv argument vector.
46  */
47 int
48 getopt(int nargc, char *nargv[], const char *ostr)
49 {
50         static char *place = EMSG;              /* option letter processing */
51         const char *oli;                        /* option letter list index */
52
53         if (optreset || *place == 0) {          /* update scanning pointer */
54                 optreset = 0;
55                 place = nargv[optind];
56                 if (optind >= nargc || *place++ != '-') {
57                         /* Argument is absent or is not an option */
58                         place = EMSG;
59                         return (-1);
60                 }
61                 optopt = *place++;
62                 if (optopt == '-' && *place == 0) {
63                         /* "--" => end of options */
64                         ++optind;
65                         place = EMSG;
66                         return (-1);
67                 }
68                 if (optopt == 0) {
69                         /* Solitary '-', treat as a '-' option
70                            if the program (eg su) is looking for it. */
71                         place = EMSG;
72                         if (strchr(ostr, '-') == NULL)
73                                 return (-1);
74                         optopt = '-';
75                 }
76         } else
77                 optopt = *place++;
78
79         /* See if option letter is one the caller wanted... */
80         if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) {
81                 if (*place == 0)
82                         ++optind;
83                 if (opterr && *ostr != ':')
84                         (void)fprintf(stderr,
85                             "%s: illegal option -- %c\n", _getprogname(),
86                             optopt);
87                 return (BADCH);
88         }
89
90         /* Does this option need an argument? */
91         if (oli[1] != ':') {
92                 /* don't need argument */
93                 optarg = NULL;
94                 if (*place == 0)
95                         ++optind;
96         } else {
97                 /* Option-argument is either the rest of this argument or the
98                    entire next argument. */
99                 if (*place)
100                         optarg = place;
101                 else if (nargc > ++optind)
102                         optarg = nargv[optind];
103                 else {
104                         /* option-argument absent */
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                                     _getprogname(), optopt);
112                         return (BADCH);
113                 }
114                 place = EMSG;
115                 ++optind;
116         }
117         return (optopt);                        /* return option letter */
118 }