diff options
-rw-r--r-- | libc/unistd/Makefile | 2 | ||||
-rw-r--r-- | libc/unistd/getopt.c | 19 | ||||
-rw-r--r-- | libc/unistd/getopt_vars.c | 40 | ||||
-rw-r--r-- | libc/unistd/gnu_getopt.c | 37 |
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, |