Import bmake-20121010 to new vendor branch
[dragonfly.git] / contrib / bmake / 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  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #ifdef HAVE_CONFIG_H
35 # include "config.h"
36 #endif
37 #if !defined(HAVE_GETOPT) || defined(WANT_GETOPT_LONG) || defined(BROKEN_GETOPT)
38
39 #if defined(LIBC_SCCS) && !defined(lint)
40 /* static char sccsid[] = "from: @(#)getopt.c   8.2 (Berkeley) 4/2/94"; */
41 static char *rcsid = "$Id: getopt.c,v 1.3 1999/01/08 02:14:18 sjg Exp $";
42 #endif /* LIBC_SCCS and not lint */
43
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <string.h>
47
48
49 #define BADCH   (int)'?'
50 #define BADARG  (int)':'
51 #define EMSG    ""
52
53 int     opterr = 1,             /* if error message should be printed */
54         optind = 1,             /* index into parent argv vector */
55         optopt = BADCH,         /* character checked for validity */
56         optreset;               /* reset getopt */
57 char    *optarg;                /* argument associated with option */
58
59 /*
60  * getopt --
61  *      Parse argc/argv argument vector.
62  */
63 int
64 getopt(nargc, nargv, ostr)
65         int nargc;
66         char * const *nargv;
67         const char *ostr;
68 {
69         extern char *__progname;
70         static char *place = EMSG;              /* option letter processing */
71         char *oli;                              /* option letter list index */
72
73 #ifndef BSD4_4
74         if (!__progname) {
75                 if (__progname = strrchr(nargv[0], '/'))
76                         ++__progname;
77                 else
78                         __progname = nargv[0];
79         }
80 #endif
81         
82         if (optreset || !*place) {              /* update scanning pointer */
83                 optreset = 0;
84                 if (optind >= nargc || *(place = nargv[optind]) != '-') {
85                         place = EMSG;
86                         return (-1);
87                 }
88                 if (place[1] && *++place == '-' /* found "--" */
89                     && !place[1]) {             /* and not "--foo" */
90                         ++optind;
91                         place = EMSG;
92                         return (-1);
93                 }
94         }                                       /* option letter okay? */
95         if ((optopt = (int)*place++) == (int)':' ||
96             !(oli = strchr(ostr, optopt))) {
97                 /*
98                  * if the user didn't specify '-' as an option,
99                  * assume it means -1.
100                  */
101                 if (optopt == (int)'-')
102                         return (-1);
103                 if (!*place)
104                         ++optind;
105                 if (opterr && *ostr != ':')
106                         (void)fprintf(stderr,
107                             "%s: illegal option -- %c\n", __progname, optopt);
108                 return (BADCH);
109         }
110         if (*++oli != ':') {                    /* don't need argument */
111                 optarg = NULL;
112                 if (!*place)
113                         ++optind;
114         }
115         else {                                  /* need an argument */
116                 if (*place)                     /* no white space */
117                         optarg = place;
118                 else if (nargc <= ++optind) {   /* no arg */
119                         place = EMSG;
120                         if (*ostr == ':')
121                                 return (BADARG);
122                         if (opterr)
123                                 (void)fprintf(stderr,
124                                     "%s: option requires an argument -- %c\n",
125                                     __progname, optopt);
126                         return (BADCH);
127                 }
128                 else                            /* white space */
129                         optarg = nargv[optind];
130                 place = EMSG;
131                 ++optind;
132         }
133         return (optopt);                        /* dump back option letter */
134 }
135 #endif
136 #ifdef MAIN
137 #ifndef BSD4_4
138 char *__progname;
139 #endif
140
141 int
142 main(argc, argv)
143         int argc;
144         char *argv[];
145 {
146         int c;
147         char *opts = argv[1];
148
149         --argc;
150         ++argv;
151         
152         while ((c = getopt(argc, argv, opts)) != EOF) {
153                 switch (c) {
154                 case '-':
155                         if (optarg)
156                                 printf("--%s ", optarg);
157                         break;
158                 case '?':
159                         exit(1);
160                         break;
161                 default:
162                         if (optarg)
163                                 printf("-%c %s ", c, optarg);
164                         else
165                                 printf("-%c ", c);
166                         break;
167                 }
168         }
169
170         if (optind < argc) {
171                 printf("-- ");
172                 for (; optind < argc; ++optind) {
173                         printf("%s ", argv[optind]);
174                 }
175         }
176         printf("\n");
177         exit(0);
178 }
179 #endif