- Wait for mouse acks properly.
[cake.git] / compiler / clib / getopt.c
blobfe33c1e929e97a38b91a4ca86e7cc8bf633e0d94
1 /* File imported from FreeBSD source into AROS */
3 /*
4 * Copyright (c) 1987, 1993, 1994
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
36 #include <sys/cdefs.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <unistd.h>
43 int opterr = 1, /* if error message should be printed */
44 optind = 1, /* index into parent argv vector */
45 optopt, /* character checked for validity */
46 optreset; /* reset getopt */
47 char *optarg; /* argument associated with option */
49 #define BADCH (int)'?'
50 #define BADARG (int)':'
51 #define EMSG ""
54 * getopt --
55 * Parse argc/argv argument vector.
58 /*****************************************************************************
60 NAME */
62 int getopt(
64 /* SYNOPSIS */
65 int nargc,
66 char * const nargv[],
67 const char *ostr)
69 /* FUNCTION
71 INPUTS
73 RESULT
75 NOTES
77 EXAMPLE
79 BUGS
81 SEE ALSO
83 INTERNALS
85 ******************************************************************************/
87 static char *place = EMSG; /* option letter processing */
88 char *oli; /* option letter list index */
90 if (optreset || *place == 0)
92 /* update scanning pointer */
93 optreset = 0;
94 place = nargv[optind];
95 if (optind >= nargc || *place++ != '-')
97 /* Argument is absent or is not an option */
98 place = EMSG;
99 return (-1);
101 optopt = *place++;
102 if (optopt == '-' && *place == 0)
104 /* "--" => end of options */
105 ++optind;
106 place = EMSG;
107 return (-1);
109 if (optopt == 0)
111 /* Solitary '-', treat as a '-' option
112 if the program (eg su) is looking for it. */
113 place = EMSG;
114 if (strchr(ostr, '-') == NULL)
115 return (-1);
116 optopt = '-';
119 else
120 optopt = *place++;
122 /* See if option letter is one the caller wanted... */
123 if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL)
125 if (*place == 0)
126 ++optind;
127 #warning FIXME: Implement progname in error output
128 if (opterr && *ostr != ':')
129 fprintf(stderr,
130 "%s: illegal option -- %c\n", "???Prog",
131 optopt
133 return (BADCH);
136 /* Does this option need an argument? */
137 if (oli[1] != ':')
139 /* don't need argument */
140 optarg = NULL;
141 if (*place == 0)
142 ++optind;
144 else
146 /* Option-argument is either the rest of this argument or the
147 entire next argument. */
148 if (*place)
149 optarg = place;
150 else if (nargc > ++optind)
151 optarg = nargv[optind];
152 else
154 /* option-argument absent */
155 place = EMSG;
156 if (*ostr == ':')
157 return (BADARG);
158 if (opterr)
159 (void)fprintf(stderr,
160 "%s: option requires an argument -- %c\n",
161 "???Prog", optopt
163 return (BADCH);
165 place = EMSG;
166 ++optind;
168 return (optopt); /* return option letter */