view src/ploki/opt.c @ 8203:b0fcb29e2ce7

<b_jonas> learn Silent initial consonants in English are: write, wrong, wrist, wrap, wreck, wrest, wrestle, wriggle, wrinkle, wrath, wraith, wreath, wrangle, wren, wright, wrought, wring, writ, writhe, wry; know, knife, knock, knee, knight, knob, knot, knit, knack, knout, knuckle; psychology, psalm, pseudo, psychic, psionics; gnaw, gnash, gnome, gnu, gnat; pneumatic; mnemonic; chthonic; phthisis; bdellium.
author HackBot
date Sun, 29 May 2016 20:52:46 +0000
parents ac0403686959
children
line wrap: on
line source

#include "opt.h"

#include <string.h>

int opt_ind;
int opt_err;
const char *opt_arg;
static const char *nextchar;

int opt_get(int argc, char *const *argv, const char *opts) {
	const char *p;

	if (!nextchar || !*nextchar) {
		if (opt_ind < argc)
			++opt_ind;
		if (opt_ind >= argc || argv[opt_ind][0] != '-' || !argv[opt_ind][1]) {
			return -1;
		}
		if (argv[opt_ind][1] == '-' && argv[opt_ind][2] == '\0') {
			++opt_ind;
			return -1;
		}
		nextchar = argv[opt_ind] + 1;
	}

	if ((p = strchr(opts, *nextchar)) && (*p != ':' || p == opts)) {
		if (p[1] == ':') {
			if (nextchar[1]) {
				opt_arg = nextchar + 1;
			} else if (opt_ind + 1 >= argc) {
				opt_arg = NULL;
			} else {
				opt_arg = argv[++opt_ind];
			}
			nextchar = NULL;
		} else {
			++nextchar;
		}
		return p[0];
	}

	opt_err = *nextchar++;
	return '\0';
}

#if 0
void opt_reset(void) {
	opt_ind = 0;
	nextchar = NULL;
}
#endif