summaryrefslogtreecommitdiff
path: root/win32/getopt
diff options
context:
space:
mode:
authorNicolas "Pixel" Noble <pixel@nobis-crew.org>2014-07-31 18:18:18 +0200
committerNicolas "Pixel" Noble <pixel@nobis-crew.org>2014-07-31 18:18:18 +0200
commit680a012532e2d962a55c1a588900c3b52c0d6b69 (patch)
tree613b0399000e5c72290efa2497cf008fbccb12df /win32/getopt
parent3c97ca53d8279f0f16ca2f82a703bafa517e39f3 (diff)
parentee0ffcb7bcb46d3d129bd262781d54afa736ffbb (diff)
Merge branch 'master' of /pub/repo.git/Balau
Diffstat (limited to 'win32/getopt')
-rw-r--r--win32/getopt/getopt.c129
-rw-r--r--win32/getopt/getopt.h17
2 files changed, 146 insertions, 0 deletions
diff --git a/win32/getopt/getopt.c b/win32/getopt/getopt.c
new file mode 100644
index 0000000..6d74b39
--- /dev/null
+++ b/win32/getopt/getopt.c
@@ -0,0 +1,129 @@
+/*
+ I got this off net.sources from Henry Spencer.
+ It is a public domain getopt(3) like in System V.
+ I have made the following modifications:
+
+ index(s,c) was added because too many people could
+ not compile getopt without it.
+
+ A test main program was added, ifdeffed by GETOPT.
+ This main program is a public domain implementation
+ of the getopt(1) program like in System V. The getopt
+ program can be used to standardize shell option handling.
+ e.g. cc -DGETOPT getopt.c -o getopt
+*/
+#include <stdio.h>
+
+#ifndef lint
+static char sccsfid[] = "@(#) getopt.c 5.0 (UTZoo) 1985";
+#endif
+
+#define ARGCH (int)':'
+#define BADCH (int)'?'
+#define EMSG ""
+#define ENDARGS "--"
+
+/* this is included because index is not on some UNIX systems */
+static
+char *
+index (s, c)
+register char *s;
+register int c;
+ {
+ while (*s)
+ if (c == *s) return (s);
+ else s++;
+ return (NULL);
+ }
+
+/*
+ * get option letter from argument vector
+ */
+int opterr = 1, /* useless, never set or used */
+ optind = 1, /* index into parent argv vector */
+ optopt; /* character checked for validity */
+char *optarg; /* argument associated with option */
+
+#define tell(s) fputs(*nargv,stderr);fputs(s,stderr); \
+ fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);
+
+
+getopt(nargc,nargv,ostr)
+int nargc;
+char **nargv,
+ *ostr;
+{
+ static char *place = EMSG; /* option letter processing */
+ register char *oli; /* option letter list index */
+ char *index();
+
+ if(!*place) { /* update scanning pointer */
+ if(optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) return(EOF);
+ if (*place == '-') { /* found "--" */
+ ++optind;
+ return(EOF);
+ }
+ } /* option letter okay? */
+ if ((optopt = (int)*place++) == ARGCH || !(oli = index(ostr,optopt))) {
+ if(!*place) ++optind;
+ tell(": illegal option -- ");
+ }
+ if (*++oli != ARGCH) { /* don't need argument */
+ optarg = NULL;
+ if (!*place) ++optind;
+ }
+ else { /* need an argument */
+ if (*place) optarg = place; /* no white space */
+ else if (nargc <= ++optind) { /* no arg */
+ place = EMSG;
+ tell(": option requires an argument -- ");
+ }
+ else optarg = nargv[optind]; /* white space */
+ place = EMSG;
+ ++optind;
+ }
+ return(optopt); /* dump back option letter */
+}
+
+
+#ifdef GETOPT
+
+#ifndef lint
+static char sccspid[] = "@(#) getopt.c 5.1 (WangInst) 6/15/85";
+#endif
+
+main (argc, argv) char **argv;
+ {
+ char *optstring = argv[1];
+ char *argv0 = argv[0];
+ extern int optind;
+ extern char *optarg;
+ int opterr = 0;
+ int C;
+ char *opi;
+ if (argc == 1)
+ {
+ fprintf (stderr, "Usage: %s optstring args\n", argv0);
+ exit (1);
+ }
+ argv++;
+ argc--;
+ argv[0] = argv0;
+ while ((C = getopt (argc, argv, optstring)) != EOF)
+ {
+ if (C == BADCH) opterr++;
+ printf ("-%c ", C);
+ opi = index (optstring, C);
+ if (opi && opi[1] == ARGCH)
+ if (optarg)
+ printf ("\"%s\" ", optarg);
+ else opterr++;
+ }
+ printf ("%s", ENDARGS);
+ while (optind < argc)
+ printf (" \"%s\"", argv[optind++]);
+ putchar ('\n');
+ exit (opterr);
+ }
+
+#endif
diff --git a/win32/getopt/getopt.h b/win32/getopt/getopt.h
new file mode 100644
index 0000000..f77cb17
--- /dev/null
+++ b/win32/getopt/getopt.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int getopt(int nargc, char ** nargv, char * ostr);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+extern int opterr = 1;
+extern int optind = 1;
+extern int optopt;
+extern char * optarg;