diff options
Diffstat (limited to 'usr.sbin/xntpd/lib/getopt.c')
-rw-r--r-- | usr.sbin/xntpd/lib/getopt.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/usr.sbin/xntpd/lib/getopt.c b/usr.sbin/xntpd/lib/getopt.c new file mode 100644 index 0000000..0ab3c29 --- /dev/null +++ b/usr.sbin/xntpd/lib/getopt.c @@ -0,0 +1,106 @@ +/* getopt.c,v 3.1 1993/07/06 01:08:18 jbj Exp + * getopt - get option letter from argv + * + * This is a version of the public domain getopt() implementation by + * Henry Spencer, changed for 4.3BSD compatibility (in addition to System V). + * It allows rescanning of an option list by setting optind to 0 before + * calling. Thanks to Dennis Ferguson for the appropriate modifications. + * + * This file is in the Public Domain. + */ + +/*LINTLIBRARY*/ + +#include <stdio.h> + +#include "ntp_stdlib.h" + +#ifdef lint +#undef putc +#define putc fputc +#endif /* lint */ + +char *optarg; /* Global argument pointer. */ +#ifndef __convex__ +int optind = 0; /* Global argv index. */ +#else /* __convex__ */ +extern int optind; /* Global argv index. */ +#endif /* __convex__ */ + +/* + * N.B. use following at own risk + */ +#ifndef __convex__ +int opterr = 1; /* for compatibility, should error be printed? */ +#else /* __convex__ */ +extern int opterr; /* for compatibility, should error be printed? */ +#endif /* __convex__ */ +int optopt; /* for compatibility, option character checked */ + +static char *scan = NULL; /* Private scan pointer. */ + +/* + * Print message about a bad option. Watch this definition, it's + * not a single statement. + */ +#define BADOPT(mess, ch) if (opterr) { \ + fputs(argv[0], stderr); \ + fputs(mess, stderr); \ + (void) putc(ch, stderr); \ + (void) putc('\n', stderr); \ + } \ + return('?') + +int +getopt_l(argc, argv, optstring) + int argc; + char *argv[]; + char *optstring; +{ + register char c; + register char *place; + + optarg = NULL; + + if (optind == 0) { + scan = NULL; + optind++; + } + + if (scan == NULL || *scan == '\0') { + if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') + return EOF; + if (argv[optind][1] == '-' && argv[optind][2] == '\0') { + optind++; + return EOF; + } + + scan = argv[optind]+1; + optind++; + } + + c = *scan++; + optopt = c & 0377; + for (place = optstring; place != NULL && *place != '\0'; ++place) + if (*place == c) + break; + + if (place == NULL || *place == '\0' || c == ':' || c == '?') { + BADOPT(": unknown option -", c); + } + + place++; + if (*place == ':') { + if (*scan != '\0') { + optarg = scan; + scan = NULL; + } else if (optind >= argc) { + BADOPT(": option requires argument -", c); + } else { + optarg = argv[optind]; + optind++; + } + } + + return c&0377; +} |