summaryrefslogtreecommitdiff
path: root/support/poster/getopt.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/poster/getopt.c
Initial commit
Diffstat (limited to 'support/poster/getopt.c')
-rw-r--r--support/poster/getopt.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/support/poster/getopt.c b/support/poster/getopt.c
new file mode 100644
index 0000000000..2c9ac302fa
--- /dev/null
+++ b/support/poster/getopt.c
@@ -0,0 +1,110 @@
+/* transcript/src/getopt.c
+ *
+ * public domain getopt from mod.sources
+ * RCSID: $Header: getopt.c,v 2.1 85/11/24 11:49:10 shore Rel $
+ */
+
+/*
+** This is a public domain version of getopt(3).
+** Bugs, fixes to:
+** Keith Bostic
+** ARPA: keith@seismo
+** UUCP: seismo!keith
+** Added NO_STDIO, opterr handling, Rich $alz (mirror!rs).
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+** Error macro. Maybe we want stdio, maybe we don't.
+** The (undocumented?) variable opterr tells us whether or not
+** to print errors.
+*/
+
+#ifdef NO_STDIO
+
+#define tell(s) \
+ if (opterr) \
+ { \
+ char ebuf[2]; \
+ (void)write(2, nargv, (unsigned int)strlen(nargv)); \
+ (void)write(2, s, (unsigned int)strlen(s)); \
+ ebuf[0] = optopt; \
+ ebuf[1] = '\n'; \
+ (void)write(2, ebuf, 2); \
+ }
+
+#else
+
+#define tell(s) \
+ if (opterr) \
+ (void)fputs(*nargv, stderr), \
+ (void)fputs(s,stderr), \
+ (void)fputc(optopt, stderr), \
+ (void)fputc('\n', stderr)
+
+#endif
+
+
+/* Global variables. */
+static char EMSG[] = "";
+int opterr = 1; /* undocumented error-suppressor*/
+int optind = 1; /* index into argv vector */
+int optopt; /* char checked for validity */
+char *optarg; /* arg associated with option */
+
+
+
+getopt(nargc, nargv, ostr)
+ int nargc;
+ char **nargv;
+ char *ostr;
+{
+ static char *place = EMSG; /* option letter processing */
+ register char *oli; /* option letter list 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 = *place++) == ':' || (oli = strchr(ostr, optopt)) == NULL)
+ {
+ if (!*place)
+ optind++;
+ tell(": illegal option -- ");
+ goto Bad;
+ }
+ if (*++oli != ':') /* don't need argument */
+ {
+ optarg = NULL;
+ if (!*place)
+ optind++;
+ }
+ else /* need an argument */
+ {
+ if (*place)
+ optarg = place; /* no white space */
+ else
+ if (nargc <= ++optind)
+ {
+ place = EMSG;
+ tell(": option requires an argument -- ");
+ goto Bad;
+ }
+ else
+ optarg = nargv[optind]; /* white space */
+ place = EMSG;
+ optind++;
+ }
+ return(optopt); /* dump back option letter */
+Bad:
+ return('?');
+}