diff options
author | Angelos D. Keromytis <angelos@cvs.openbsd.org> | 1999-10-01 01:08:32 +0000 |
---|---|---|
committer | Angelos D. Keromytis <angelos@cvs.openbsd.org> | 1999-10-01 01:08:32 +0000 |
commit | d784a738139448819b0f9634632e144f11ce8445 (patch) | |
tree | ddb2a252f194b7508d200750332f53694f046fe8 /lib/libkeynote/getopt.c | |
parent | 364f2dadf3054e5812ecc352689f96ed5d1ab7a9 (diff) |
Update for version 2.0
Diffstat (limited to 'lib/libkeynote/getopt.c')
-rw-r--r-- | lib/libkeynote/getopt.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/libkeynote/getopt.c b/lib/libkeynote/getopt.c new file mode 100644 index 00000000000..a281cbab406 --- /dev/null +++ b/lib/libkeynote/getopt.c @@ -0,0 +1,92 @@ +/* $OpenBSD: getopt.c,v 1.1 1999/10/01 01:08:29 angelos Exp $ */ +#if HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include <stdio.h> +#include <ctype.h> + +#if STDC_HEADERS +#include <string.h> +#if !defined(HAVE_STRCHR) +#define strchr index +#endif /* !HAVE_STRCHR */ +#endif /* STDC_HEADERS */ + +/*** getopt + * + * This function is the public domain version of getopt, the command + * line argument processor, and hence is NOT copyrighted by Microsoft, + * IBM, or AT&T. + */ + +#define ERR(s, c) if(opterr){\ + (void) fputs(argv[0], stderr);\ + (void) fputs(s, stderr);\ + (void) fputc(c, stderr);\ + (void) fputc('\n', stderr);} + +int opterr = 1; /* flag:error message on unrecognzed options */ +int optind = 1; /* last touched cmdline argument */ +int optopt; /* last returned option */ +char *optarg; /* argument to optopt */ +int getopt(int argc, char **argv, char *opts); + +/* int argc is the number of arguments on cmdline */ +/* char **argv is the pointer to array of cmdline arguments */ +/* char *opts is the string of all valid options */ +/* each char case must be given; options taking an arg are followed by = +':' */ +int getopt(int argc, char **argv, char *opts) +{ + static int sp = 1; + register int c; + register char *cp; + if(sp == 1) + /* check for end of options */ + if(optind >= argc || + (argv[optind][0] != '/' && + argv[optind][0] != '-') || + argv[optind][1] == '\0') + return(EOF); + else if(!strcmp(argv[optind], "--")) { + optind++; + return(EOF); + } + optopt = c = argv[optind][sp]; + if(c == ':' || (cp=strchr(opts, c)) == NULL) { + /* if arg sentinel as option or other invalid option, + handle the error and return '?' */ + ERR(": illegal option -- ", (char)c); + if(argv[optind][++sp] == '\0') { + optind++; + sp = 1; + } + return('?'); + } + if(*++cp == ':') { + /* if option is given an argument... */ + if(argv[optind][sp+1] != '\0') + /* and the OptArg is in that CmdLineArg, return it... */ + optarg = &argv[optind++][sp+1]; + else if(++optind >= argc) { + /* but if the OptArg isn't there and the next CmdLineArg + isn't either, handle the error... */ + ERR(": option requires an argument -- ", (char)c); + sp = 1; + return('?'); + } else + /* but if there is another CmdLineArg there, return that */ + optarg = argv[optind++]; + /* and set up for the next CmdLineArg */ + sp = 1; + } else { + /* no arg for this opt, so null arg and set up for next option */ + if(argv[optind][++sp] == '\0') { + sp = 1; + optind++; + } + optarg = NULL; + } + return(c); +} |