diff options
Diffstat (limited to 'libc')
| -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, | 
