]> git.saurik.com Git - apple/libc.git/blame - stdlib/getopt-fbsd.c
Libc-594.9.1.tar.gz
[apple/libc.git] / stdlib / getopt-fbsd.c
CommitLineData
224c7076
A
1/* $NetBSD: getopt.c,v 1.26 2003/08/07 16:43:40 agc Exp $ */
2
3/*
4 * Copyright (c) 1987, 1993, 1994
5 * The Regents of the University of California. All rights reserved.
6 *
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.
22 *
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.
34 */
35
36#if defined(LIBC_SCCS) && !defined(lint)
37static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
38#endif /* LIBC_SCCS and not lint */
39#include <sys/cdefs.h>
40__FBSDID("$FreeBSD: src/lib/libc/stdlib/getopt.c,v 1.7 2004/03/06 17:05:45 ache Exp $");
41
42#include "namespace.h"
43#include <stdio.h>
44#include <stdlib.h>
45#include <string.h>
46#include <unistd.h>
47#include "un-namespace.h"
48
49#include "libc_private.h"
50
51#ifndef BUILDING_VARIANT
52int opterr = 1, /* if error message should be printed */
53 optind = 1, /* index into parent argv vector */
54 optopt, /* character checked for validity */
55 optreset; /* reset getopt */
56char *optarg; /* argument associated with option */
57#endif /* !BUILDING_VARIANT */
58
59#define BADCH (int)'?'
60#define BADARG (int)':'
61#define EMSG ""
62
63#if __DARWIN_UNIX03
64#define PROGNAME nargv[0]
65#else
66#define PROGNAME _getprogname()
67#endif
68
69/*
70 * getopt --
71 * Parse argc/argv argument vector.
72 */
73int
74getopt(nargc, nargv, ostr)
75 int nargc;
76 char * const nargv[];
77 const char *ostr;
78{
79 static char *place = EMSG; /* option letter processing */
80 char *oli; /* option letter list index */
81
82 if (optreset || *place == 0) { /* update scanning pointer */
83 optreset = 0;
84 place = nargv[optind];
85 if (optind >= nargc || *place++ != '-') {
86 /* Argument is absent or is not an option */
87 place = EMSG;
88 return (-1);
89 }
90 optopt = *place++;
91 if (optopt == '-' && *place == 0) {
92 /* "--" => end of options */
93 ++optind;
94 place = EMSG;
95 return (-1);
96 }
97 if (optopt == 0) {
98 /* Solitary '-', treat as a '-' option
99 if the program (eg su) is looking for it. */
100 place = EMSG;
101 if (strchr(ostr, '-') == NULL)
102 return (-1);
103 optopt = '-';
104 }
105 } else
106 optopt = *place++;
107
108 /* See if option letter is one the caller wanted... */
109 if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) {
110 if (*place == 0)
111 ++optind;
112 if (opterr && *ostr != ':')
113 (void)fprintf(stderr,
114 "%s: illegal option -- %c\n",
115 PROGNAME, optopt);
116 return (BADCH);
117 }
118
119 /* Does this option need an argument? */
120 if (oli[1] != ':') {
121 /* don't need argument */
122 optarg = NULL;
123 if (*place == 0)
124 ++optind;
125 } else {
126 /* Option-argument is either the rest of this argument or the
127 entire next argument. */
128 if (*place)
129 optarg = place;
130 else if (nargc > ++optind)
131 optarg = nargv[optind];
132 else {
133 /* option-argument absent */
134#if __DARWIN_UNIX03
135 /* Yes, the standard will put optind past the last
136 argument */
137 ++optind;
138 optarg = NULL;
139#endif /* __DARWIN_UNIX03 */
140 place = EMSG;
141 if (*ostr == ':')
142 return (BADARG);
143 if (opterr)
144 (void)fprintf(stderr,
145 "%s: option requires an argument -- %c\n",
146 PROGNAME, optopt);
147 return (BADCH);
148 }
149 place = EMSG;
150 ++optind;
151 }
152 return (optopt); /* return option letter */
153}