#include <string.h>
#include <getopt.h>
static void getopterror(int which) {
static char error1[]="Unknown option `-x'.\n";
static char error2[]="Missing argument for `-x'.\n";
if (opterr) {
if (which) {
error2[23]=optopt;
write(2,error2,28);
} else {
error1[17]=optopt;
write(2,error1,22);
}
}
}
int getopt(int argc, char * const argv[], const char *optstring) {
static int lastidx,lastofs;
char *tmp;
if (optind==0) { optind=1; lastidx=0; } /* whoever started setting optind to 0 should be shot */
again:
if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
return -1;
if (argv[optind][1]=='-' && argv[optind][2]==0) {
++optind;
return -1;
}
if (lastidx!=optind) {
lastidx=optind; lastofs=0;
}
optopt=argv[optind][lastofs+1];
if ((tmp=strchr(optstring,optopt))) {
if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */
++optind;
goto again;
}
if (tmp[1]==':') { /* argument expected */
if (tmp[2]==':' || argv[optind][lastofs+2]) { /* "-foo", return "oo" as optarg */
if (!*(optarg=argv[optind]+lastofs+2)) optarg=0;
goto found;
}
optarg=argv[optind+1];
if (!optarg) { /* missing argument */
++optind;
if (*optstring==':') return ':';
getopterror(1);
return ':';
}
++optind;
} else {
++lastofs;
return optopt;
}
found:
++optind;
return optopt;
} else { /* not found */
getopterror(0);
++optind;
return '?';
}
}
LinuxTV legacy CVS <linuxtv.org/cvs>