/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
// vim: expandtab:ts=8:sw=4:softtabstop=4:
#include <toku_portability.h>
#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];
}