summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/unistd/Makefile2
-rw-r--r--libc/unistd/getopt.c19
-rw-r--r--libc/unistd/getopt_vars.c40
-rw-r--r--libc/unistd/gnu_getopt.c37
4 files changed, 60 insertions, 38 deletions
diff --git a/libc/unistd/Makefile b/libc/unistd/Makefile
index 0299a0a24..13da721a8 100644
--- a/libc/unistd/Makefile
+++ b/libc/unistd/Makefile
@@ -26,7 +26,7 @@ LIBC=$(TOPDIR)libc.a
DIRS:=
CSRC=execl.c execlp.c execv.c execvep.c execvp.c getcwd.c getopt.c \
- sleep.c getpass.c sysconf_src.c
+ sleep.c getpass.c sysconf_src.c getopt_vars.c
# TESTING -- comment this out if it breaks for you
ifeq ($(TARGET_ARCH), $(NATIVE_ARCH))
diff --git a/libc/unistd/getopt.c b/libc/unistd/getopt.c
index a850d9bde..ec5c988f5 100644
--- a/libc/unistd/getopt.c
+++ b/libc/unistd/getopt.c
@@ -21,10 +21,10 @@
#include <stdio.h>
#include <string.h>
-int opterr __attribute__ ((__weak__)) = 1; /* error => print message */
-int optind __attribute__ ((__weak__)) = 1; /* next argv[] index */
-int optopt __attribute__ ((__weak__)) = 1; /* Set for unknown arguments */
-char *optarg __attribute__ ((__weak__)) = NULL; /* option parameter if any */
+extern int opterr; /* error => print message */
+extern int optind; /* next argv[] index */
+extern int optopt; /* Set for unknown arguments */
+extern char *optarg; /* option parameter if any */
static int Err(name, mess, c) /* returns '?' */
char *name; /* program name argv[0] */
@@ -54,7 +54,16 @@ int getopt (int argc, char *const *argv, const char *optstring)
register char *cp; /* -> option in `optstring' */
optarg = NULL;
-
+
+ /* initialise getopt vars */
+ if (optind == 0)
+ {
+ optind = 1;
+ opterr = 1;
+ optopt = 1;
+ optarg = NULL;
+ }
+
if (sp == 1) { /* fresh argument */
if (optind >= argc /* no more arguments */
|| argv[optind][0] != '-' /* no more options */
diff --git a/libc/unistd/getopt_vars.c b/libc/unistd/getopt_vars.c
new file mode 100644
index 000000000..6dcb73ad7
--- /dev/null
+++ b/libc/unistd/getopt_vars.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+
+/*
+ * Getopt vars shared between getopt and gnu_getopt
+ */
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg = NULL;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* XXX 1003.2 says this must be 1 before any call. */
+int optind = 0;
+
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
diff --git a/libc/unistd/gnu_getopt.c b/libc/unistd/gnu_getopt.c
index 05f97a09c..0b1c68b8f 100644
--- a/libc/unistd/gnu_getopt.c
+++ b/libc/unistd/gnu_getopt.c
@@ -52,28 +52,12 @@ extern int _getopt_internal (int argc, char *const *argv,
#ifdef L__gnu_getopt_internal
-/* For communication from `getopt' to the caller.
- When `getopt' finds an option that takes an argument,
- the argument value is returned here.
- Also, when `ordering' is RETURN_IN_ORDER,
- each non-option ARGV-element is returned here. */
+/* external getopt vars */
-char *optarg = NULL;
-
-/* Index in ARGV of the next element to be scanned.
- This is used for communication to and from the caller
- and for communication between successive calls to `getopt'.
-
- On entry to `getopt', zero means this is the first call; initialize.
-
- When `getopt' returns EOF, this is the index of the first of the
- non-option elements that the caller should itself scan.
-
- Otherwise, `optind' communicates from one call to the next
- how much of ARGV has been scanned so far. */
-
-/* XXX 1003.2 says this must be 1 before any call. */
-int optind = 0;
+extern int optind;
+extern int opterr;
+extern int optopt;
+extern char *optarg;
/* The next char to be scanned in the option-element
in which the last option character we returned was found.
@@ -84,17 +68,6 @@ int optind = 0;
static char *nextchar;
-/* Callers store zero here to inhibit the error message
- for unrecognized options. */
-
-int opterr = 1;
-
-/* Set to an option character which was unrecognized.
- This must be initialized on some systems to avoid linking in the
- system's own getopt implementation. */
-
-int optopt = '?';
-
/* Describe how to deal with options that follow non-option ARGV-elements.
If the caller did not specify anything,