blob: 35235386b75acefe21e5e39bce4efc893b0cd9c9 [file] [log] [blame]
#include "getopt.h"
#include <stdio.h>
#include <string.h>
#define _getprogname() nargv[0]
int opterr = 1;
int optind = 1;
int optopt = 0;
char* optarg;
int getopt(int argc, char* const argv[], const char* ostr) {
static const char kEmpty[] = "";
static const char* place = kEmpty;
if (!*place) {
if (optind >= argc)
return -1;
const char* arg = argv[optind];
if (arg[0] != '-') {
// Not an option.
return -1;
}
if (arg[1] == '-' && !arg[2]) {
// '--' -> end of options.
return -1;
}
if (!arg[1]) {
// Single '-', If the program wants it, treat it as an option.
// Otherwise, it's the end of options.
if (!strchr(ostr, '-')) {
return -1;
}
optopt = '-';
place = arg + 1;
} else {
optopt = arg[1];
place = arg + 2;
}
};
char* oindex = strchr(ostr, optopt);
if (!oindex) {
// Unsupported option.
(void)fprintf(stderr, "%s: illegal option -- %c\n", argv[0]);
return '?';
}
if (oindex[1] != ':') {
// No argument needed.
optarg = NULL;
if (!*place)
optind++;
return optopt;
}
// This option needs an argument. Either after the option character,
// or the argument that follows.
if (*place) {
optarg = (char *)place;
} else if (argc > ++optind) {
optarg = (char *)argv[optind];
} else if (oindex[2] == ':') {
// Optional argument is missing.
place = kEmpty;
optarg = NULL;
return optopt;
} else {
// Missing argument.
place = kEmpty;
(void)fprintf(stderr, "%s: option requires an argument --%c\n",
argv[0], optopt);
return ':';
}
return optopt;
}