From b2ccd693a3f622ec0cec49d73753316c2a7ccc09 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Tue, 20 Oct 1998 19:48:10 +0000 Subject: [PATCH] add public domain getopt(3) --- libraries/liblutil/getopt.c | 108 ++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 libraries/liblutil/getopt.c diff --git a/libraries/liblutil/getopt.c b/libraries/liblutil/getopt.c new file mode 100644 index 0000000000..a19d9ba2c9 --- /dev/null +++ b/libraries/liblutil/getopt.c @@ -0,0 +1,108 @@ +/* + getopt.c + + modified public-domain AT&T getopt(3) +*/ + +#include +#include + +#ifdef _POSIX_SOURCE +# include +#else +# define STDERR_FILENO 2 +# ifdef __STDC__ + extern int write (int fildes, char * buf, unsigned nbyte); +# else + extern int write (); +# endif +#endif + +int opterr = 1; +int optind = 1; +int optopt; +char * optarg; + +#ifdef __STDC__ + static void ERR (char ** argv, char * s, char c) +#else + static void ERR (argv, s, c) + char ** argv, * s, c; +#endif +{ + char errbuf[2]; + +#ifdef DF_TRACE_DEBUG +printf("DF_TRACE_DEBUG: static void ERR () in getopt.c\n"); +#endif + if (opterr) + { + errbuf[0] = c; + errbuf[1] = '\n'; + (void) write(STDERR_FILENO,argv[0],strlen(argv[0])); + (void) write(STDERR_FILENO,s,strlen(s)); + (void) write(STDERR_FILENO,errbuf,sizeof errbuf); + } +} + +#ifdef __STDC__ + int getopt (int argc, char ** argv, char * opts) +#else + int getopt (argc, argv, opts) + int argc; + char ** argv, * opts; +#endif +{ + static int sp = 1, error = (int) '?'; + static char sw = '-', eos = '\0', arg = ':'; + register char c, * cp; + +#ifdef DF_TRACE_DEBUG +printf("DF_TRACE_DEBUG: int getopt () in getopt.c\n"); +#endif + if (sp == 1) + if (optind >= argc || argv[optind][0] != sw + || argv[optind][1] == eos) + return EOF; + else if (strcmp(argv[optind],"--") == 0) + { + optind++; + return EOF; + } + c = argv[optind][sp]; + optopt = (int) c; + if (c == arg || (cp = strchr(opts,c)) == NULL) + { + ERR(argv,": illegal option--",c); + if (argv[optind][++sp] == eos) + { + optind++; + sp = 1; + } + return error; + } + else if (*++cp == arg) + { + if (argv[optind][sp + 1] != eos) + optarg = &argv[optind++][sp + 1]; + else if (++optind >= argc) + { + ERR(argv,": option requires an argument--",c); + sp = 1; + return error; + } + else + optarg = argv[optind++]; + sp = 1; + } + else + { + if (argv[optind][++sp] == eos) + { + sp = 1; + optind++; + } + optarg = NULL; + } + return (int) c; +} -- 2.39.5