Browse Source

add getopt reset support

based on proposed patches by Daniel Cegiełka, with minor changes:
- use a weak symbol for optreset so it doesn't clash with namespace
- also reset optpos (position in multi-option arg like -lR)
- also make getopt_long support reset
rs-1.0
Rich Felker 14 years ago
parent
commit
030e526392
  1. 2
      include/getopt.h
  2. 13
      src/misc/getopt.c
  3. 7
      src/misc/getopt_long.c

2
include/getopt.h

@ -7,7 +7,7 @@ extern "C" {
int getopt(int, char * const [], const char *);
extern char *optarg;
extern int optind, opterr, optopt;
extern int optind, opterr, optopt, optreset;
struct option
{

13
src/misc/getopt.c

@ -3,10 +3,13 @@
#include <string.h>
#include <limits.h>
#include <stdlib.h>
#include "libc.h"
char *optarg;
int optind=1, opterr=1, optopt;
static int optpos;
int optind=1, opterr=1, optopt, __optpos, __optreset=0;
#define optpos __optpos
weak_alias(__optreset, optreset);
int getopt(int argc, char * const argv[], const char *optstring)
{
@ -15,6 +18,12 @@ int getopt(int argc, char * const argv[], const char *optstring)
int k, l;
char *optchar;
if (!optind || __optreset) {
__optreset = 0;
__optpos = 0;
optind = 1;
}
if (optind >= argc || !argv[optind] || argv[optind][0] != '-' || !argv[optind][1])
return -1;
if (argv[optind][1] == '-' && !argv[optind][2])

7
src/misc/getopt_long.c

@ -3,8 +3,15 @@
#include <getopt.h>
#include <stdio.h>
extern int __optpos, __optreset;
static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
{
if (!optind || __optreset) {
__optreset = 0;
__optpos = 0;
optind = 1;
}
if (optind >= argc || !argv[optind] || argv[optind][0] != '-') return -1;
if ((longonly && argv[optind][1]) ||
(argv[optind][1] == '-' && argv[optind][2]))

Loading…
Cancel
Save