getsubopt - get sub options from an argument

#include <stdio.h>

int getsubopt(optionp, tokens, valuep)
char **optionp;
char * const *tokens;
char **valuep;

The getsubopt parses a string containing tokens delimited by one or
more tab, space or comma (’,’) characters. It is intended for use
in parsing groups of option arguments provided as part of a utility
command line.

The argument optionp is a pointer to a pointer to the string. The
argument tokens is a pointer to a NULL-terminated array of pointers
to strings.

The getsubopt function returns the zero-based offset of the pointer
in the tokens array referencing a string which matches the first
token in the string, or, -1 if the string contains no tokens or
tokens does not contain a matching string.

If the token is of the form "name=value", the location referenced
by valuep will be set to point to the start of the "value"
portion of the token.

On return from optionp will be set to point to the start of the
next token in the string, or the null at the end of the string if
no more tokens are present. The external variable suboptarg will
be set to point to the start of the current token, or NULL if no
tokens were present. The argument valuep will be set to point to
the "value" portion of the token, or NULL if no "value" portion
was present.

char *tokens[] = {
#define ONE 0
#define TWO 1


extern char *optarg, *suboptarg;
char *options, *value;

while ((ch = getopt(argc, argv, "ab:")) != -1) {
switch(ch) {
case ’a’:
/* process "a" option */
case ’b’:
options = optarg;
while (*options) {
switch(getsubopt(&options, tokens, &value)) {
case ONE:
/* process "one" sub option */
case TWO:
/* process "two" sub option */
if (!value)
error("no value for two");
i = atoi(value);
case -1:
if (suboptarg)
error("illegal sub option %s", suboptarg);
error("missing sub option");

getopt(3), strsep(3)