17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * Copyright (c) 1987, 1993, 1994
37c478bd9Sstevel@tonic-gate * The Regents of the University of California. All rights reserved.
47c478bd9Sstevel@tonic-gate *
57c478bd9Sstevel@tonic-gate * Redistribution and use in source and binary forms, with or without
67c478bd9Sstevel@tonic-gate * modification, are permitted provided that the following conditions
77c478bd9Sstevel@tonic-gate * are met:
87c478bd9Sstevel@tonic-gate * 1. Redistributions of source code must retain the above copyright
97c478bd9Sstevel@tonic-gate * notice, this list of conditions and the following disclaimer.
107c478bd9Sstevel@tonic-gate * 2. Redistributions in binary form must reproduce the above copyright
117c478bd9Sstevel@tonic-gate * notice, this list of conditions and the following disclaimer in the
127c478bd9Sstevel@tonic-gate * documentation and/or other materials provided with the distribution.
137c478bd9Sstevel@tonic-gate * 3. All advertising materials mentioning features or use of this software
147c478bd9Sstevel@tonic-gate * must display the following acknowledgement:
157c478bd9Sstevel@tonic-gate * This product includes software developed by the University of
167c478bd9Sstevel@tonic-gate * California, Berkeley and its contributors.
177c478bd9Sstevel@tonic-gate * 4. Neither the name of the University nor the names of its contributors
187c478bd9Sstevel@tonic-gate * may be used to endorse or promote products derived from this software
197c478bd9Sstevel@tonic-gate * without specific prior written permission.
207c478bd9Sstevel@tonic-gate *
217c478bd9Sstevel@tonic-gate * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
227c478bd9Sstevel@tonic-gate * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
237c478bd9Sstevel@tonic-gate * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
247c478bd9Sstevel@tonic-gate * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
257c478bd9Sstevel@tonic-gate * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
267c478bd9Sstevel@tonic-gate * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
277c478bd9Sstevel@tonic-gate * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
287c478bd9Sstevel@tonic-gate * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
297c478bd9Sstevel@tonic-gate * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
307c478bd9Sstevel@tonic-gate * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
317c478bd9Sstevel@tonic-gate * SUCH DAMAGE.
327c478bd9Sstevel@tonic-gate */
337c478bd9Sstevel@tonic-gate
347c478bd9Sstevel@tonic-gate #include "includes.h"
357c478bd9Sstevel@tonic-gate #if !defined(HAVE_GETOPT) || !defined(HAVE_GETOPT_OPTRESET)
367c478bd9Sstevel@tonic-gate
377c478bd9Sstevel@tonic-gate #if defined(LIBC_SCCS) && !defined(lint)
387c478bd9Sstevel@tonic-gate static char *rcsid = "$OpenBSD: getopt.c,v 1.2 1996/08/19 08:33:32 tholo Exp $";
397c478bd9Sstevel@tonic-gate #endif /* LIBC_SCCS and not lint */
407c478bd9Sstevel@tonic-gate
417c478bd9Sstevel@tonic-gate #include <stdio.h>
427c478bd9Sstevel@tonic-gate #include <stdlib.h>
437c478bd9Sstevel@tonic-gate #include <string.h>
447c478bd9Sstevel@tonic-gate
457c478bd9Sstevel@tonic-gate int BSDopterr = 1, /* if error message should be printed */
467c478bd9Sstevel@tonic-gate BSDoptind = 1, /* index into parent argv vector */
477c478bd9Sstevel@tonic-gate BSDoptopt, /* character checked for validity */
487c478bd9Sstevel@tonic-gate BSDoptreset; /* reset getopt */
497c478bd9Sstevel@tonic-gate char *BSDoptarg; /* argument associated with option */
507c478bd9Sstevel@tonic-gate
517c478bd9Sstevel@tonic-gate #define BADCH (int)'?'
527c478bd9Sstevel@tonic-gate #define BADARG (int)':'
537c478bd9Sstevel@tonic-gate #define EMSG ""
547c478bd9Sstevel@tonic-gate
557c478bd9Sstevel@tonic-gate /*
567c478bd9Sstevel@tonic-gate * getopt --
577c478bd9Sstevel@tonic-gate * Parse argc/argv argument vector.
587c478bd9Sstevel@tonic-gate */
597c478bd9Sstevel@tonic-gate int
BSDgetopt(nargc,nargv,ostr)607c478bd9Sstevel@tonic-gate BSDgetopt(nargc, nargv, ostr)
617c478bd9Sstevel@tonic-gate int nargc;
627c478bd9Sstevel@tonic-gate char * const *nargv;
637c478bd9Sstevel@tonic-gate const char *ostr;
647c478bd9Sstevel@tonic-gate {
657c478bd9Sstevel@tonic-gate extern char *__progname;
667c478bd9Sstevel@tonic-gate static char *place = EMSG; /* option letter processing */
677c478bd9Sstevel@tonic-gate char *oli; /* option letter list index */
687c478bd9Sstevel@tonic-gate
697c478bd9Sstevel@tonic-gate if (BSDoptreset || !*place) { /* update scanning pointer */
707c478bd9Sstevel@tonic-gate BSDoptreset = 0;
717c478bd9Sstevel@tonic-gate if (BSDoptind >= nargc || *(place = nargv[BSDoptind]) != '-') {
727c478bd9Sstevel@tonic-gate place = EMSG;
737c478bd9Sstevel@tonic-gate return (-1);
747c478bd9Sstevel@tonic-gate }
757c478bd9Sstevel@tonic-gate if (place[1] && *++place == '-') { /* found "--" */
767c478bd9Sstevel@tonic-gate ++BSDoptind;
777c478bd9Sstevel@tonic-gate place = EMSG;
787c478bd9Sstevel@tonic-gate return (-1);
797c478bd9Sstevel@tonic-gate }
807c478bd9Sstevel@tonic-gate } /* option letter okay? */
817c478bd9Sstevel@tonic-gate if ((BSDoptopt = (int)*place++) == (int)':' ||
827c478bd9Sstevel@tonic-gate !(oli = strchr(ostr, BSDoptopt))) {
837c478bd9Sstevel@tonic-gate /*
847c478bd9Sstevel@tonic-gate * if the user didn't specify '-' as an option,
857c478bd9Sstevel@tonic-gate * assume it means -1.
867c478bd9Sstevel@tonic-gate */
877c478bd9Sstevel@tonic-gate if (BSDoptopt == (int)'-')
887c478bd9Sstevel@tonic-gate return (-1);
897c478bd9Sstevel@tonic-gate if (!*place)
907c478bd9Sstevel@tonic-gate ++BSDoptind;
917c478bd9Sstevel@tonic-gate if (BSDopterr && *ostr != ':')
927c478bd9Sstevel@tonic-gate (void) fprintf(stderr,
93*b9aa66a7SJan Pechanec gettext("%s: illegal option -- %c\n"), __progname,
94*b9aa66a7SJan Pechanec BSDoptopt);
957c478bd9Sstevel@tonic-gate return (BADCH);
967c478bd9Sstevel@tonic-gate }
977c478bd9Sstevel@tonic-gate if (*++oli != ':') { /* don't need argument */
987c478bd9Sstevel@tonic-gate BSDoptarg = NULL;
997c478bd9Sstevel@tonic-gate if (!*place)
1007c478bd9Sstevel@tonic-gate ++BSDoptind;
101*b9aa66a7SJan Pechanec } else { /* need an argument */
1027c478bd9Sstevel@tonic-gate if (*place) /* no white space */
1037c478bd9Sstevel@tonic-gate BSDoptarg = place;
1047c478bd9Sstevel@tonic-gate else if (nargc <= ++BSDoptind) { /* no arg */
1057c478bd9Sstevel@tonic-gate place = EMSG;
1067c478bd9Sstevel@tonic-gate if (*ostr == ':')
1077c478bd9Sstevel@tonic-gate return (BADARG);
1087c478bd9Sstevel@tonic-gate if (BSDopterr)
1097c478bd9Sstevel@tonic-gate (void) fprintf(stderr,
1107c478bd9Sstevel@tonic-gate "%s: option requires an argument -- %c\n",
1117c478bd9Sstevel@tonic-gate __progname, BSDoptopt);
1127c478bd9Sstevel@tonic-gate return (BADCH);
113*b9aa66a7SJan Pechanec /* white space */
114*b9aa66a7SJan Pechanec } else
1157c478bd9Sstevel@tonic-gate BSDoptarg = nargv[BSDoptind];
116*b9aa66a7SJan Pechanec
1177c478bd9Sstevel@tonic-gate place = EMSG;
1187c478bd9Sstevel@tonic-gate ++BSDoptind;
1197c478bd9Sstevel@tonic-gate }
1207c478bd9Sstevel@tonic-gate return (BSDoptopt); /* dump back option letter */
1217c478bd9Sstevel@tonic-gate }
1227c478bd9Sstevel@tonic-gate
1237c478bd9Sstevel@tonic-gate #endif /* !defined(HAVE_GETOPT) || !defined(HAVE_OPTRESET) */
124