summaryrefslogtreecommitdiff
path: root/lib/libkeynote/getopt.c
diff options
context:
space:
mode:
authorAngelos D. Keromytis <angelos@cvs.openbsd.org>1999-10-01 01:08:32 +0000
committerAngelos D. Keromytis <angelos@cvs.openbsd.org>1999-10-01 01:08:32 +0000
commitd784a738139448819b0f9634632e144f11ce8445 (patch)
treeddb2a252f194b7508d200750332f53694f046fe8 /lib/libkeynote/getopt.c
parent364f2dadf3054e5812ecc352689f96ed5d1ab7a9 (diff)
Update for version 2.0
Diffstat (limited to 'lib/libkeynote/getopt.c')
-rw-r--r--lib/libkeynote/getopt.c92
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);
+}