mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 23:04:20 +01:00
2dda17b390
git-svn-id: file:///svn/toku/tokudb@11784 c7de825b-a66e-492c-adef-691d508d4ae1
76 lines
1.5 KiB
C
76 lines
1.5 KiB
C
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
char *optarg;
|
|
int optind;
|
|
|
|
static const char *match(char c, const char *optstring) {
|
|
int i;
|
|
for (i=0;optstring[i]; i++)
|
|
if (c == optstring[i])
|
|
return &optstring[i];
|
|
return 0;
|
|
}
|
|
|
|
int getopt(int argc, char * const argv[], const char *optstring) {
|
|
static int nextargc = 0;
|
|
static int nextchar = 0;
|
|
char *arg;
|
|
const char *theopt;
|
|
|
|
// first time initialization
|
|
if (nextargc == 0) {
|
|
nextargc = 1;
|
|
optind = 1;
|
|
nextchar = 0;
|
|
}
|
|
|
|
again:
|
|
optarg = 0;
|
|
optind = nextargc;
|
|
// last arg
|
|
if (nextargc >= argc)
|
|
return -1;
|
|
|
|
arg = argv[nextargc];
|
|
if (!arg[nextchar]) {
|
|
nextargc++;
|
|
nextchar = 0;
|
|
goto again;
|
|
}
|
|
if (!nextchar) {
|
|
// not an option
|
|
if (arg[0] != '-')
|
|
return -1;
|
|
// end of options "--"
|
|
if (arg[1] == '-') {
|
|
nextargc++;
|
|
optind = nextargc;
|
|
return -1;
|
|
}
|
|
nextchar = 1;
|
|
}
|
|
// try to match the arg with the options
|
|
theopt = match(arg[nextchar++], optstring);
|
|
if (!theopt)
|
|
return '?';
|
|
|
|
if (theopt[1] == ':') {
|
|
if (arg[nextchar]) {
|
|
optarg = &arg[nextchar];
|
|
nextargc++;
|
|
nextchar = 0;
|
|
} else if (nextargc >= argc) {
|
|
nextargc++;
|
|
nextchar = 0;
|
|
return -1;
|
|
} else {
|
|
nextargc++;
|
|
nextchar = 0;
|
|
optarg = argv[nextargc++];
|
|
}
|
|
}
|
|
return theopt[0];
|
|
}
|
|
|
|
|