/*	$OpenBSD: getopt_long.c,v 1.22 2006/10/04 21:29:04 jmc Exp $	*/
/*	$NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $	*/

/*
 * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Sponsored in part by the Defense Advanced Research Projects
 * Agency (DARPA) and Air Force Research Laboratory, Air Force
 * Materiel Command, USAF, under agreement number F39502-99-1-0512.
 */
/*
 * Copyright (c) 2000 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Dieter Baron and Thomas Klausner.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <string.h>
#include "getopt.h"
#include "getopt_common.h"

#include <logging/log.h>
LOG_MODULE_DECLARE(getopt);

#define GNU_COMPATIBLE		/* Be more compatible, configure's use us! */

#define PRINT_ERROR	((state->opterr) && (*options != ':'))

#define FLAG_PERMUTE	0x01	/* permute non-options to the end of argv */
#define FLAG_ALLARGS	0x02	/* treat non-options as args to option "-1" */
#define FLAG_LONGONLY	0x04	/* operate as getopt_long_only */

/* return values */
#define	BADCH		(int)'?'
#define	BADARG		((*options == ':') ? (int)':' : (int)'?')
#define	INORDER	1

#define	EMSG		""

#ifdef GNU_COMPATIBLE
#define NO_PREFIX	(-1)
#define D_PREFIX	0
#define DD_PREFIX	1
#define W_PREFIX	2
#endif

static int getopt_internal(struct getopt_state *, int, char * const *,
			   const char *, const struct option *, int *, int);
static int parse_long_options(struct getopt_state *, char * const *,
			      const char *, const struct option *, int *, int,
			      int);
static int gcd(int, int);
static void permute_args(int, int, int, char *const *);

/* Error messages */
#define RECARGCHAR "option requires an argument -- %c"
#define ILLOPTCHAR "illegal option -- %c" /* From P1003.2 */
#ifdef GNU_COMPATIBLE
static int dash_prefix = NO_PREFIX;
#define GNUOPTCHAR "invalid option -- %c"

#define RECARGSTRING "option `%s%s' requires an argument"
#define AMBIG "option `%s%.*s' is ambiguous"
#define NOARG "option `%s%.*s' doesn't allow an argument"
#define ILLOPTSTRING "unrecognized option `%s%s'"
#else
#define RECARGSTRING "option requires an argument -- %s"
#define AMBIG "ambiguous option -- %.*s"
#define NOARG "option doesn't take an argument -- %.*s"
#define ILLOPTSTRING "unknown option -- %s"
#endif

/*
 * Compute the greatest common divisor of a and b.
 */
static int
gcd(int a, int b)
{
	int c;

	c = a % b;
	while (c != 0) {
		a = b;
		b = c;
		c = a % b;
	}

	return b;
}

/*
 * Exchange the block from nonopt_start to nonopt_end with the block
 * from nonopt_end to opt_end (keeping the same order of arguments
 * in each block).
 */
static void
permute_args(int panonopt_start, int panonopt_end, int opt_end,
	char * const *nargv)
{
	int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
	char *swap;

	/*
	 * compute lengths of blocks and number and size of cycles
	 */
	nnonopts = panonopt_end - panonopt_start;
	nopts = opt_end - panonopt_end;
	ncycle = gcd(nnonopts, nopts);
	cyclelen = (opt_end - panonopt_start) / ncycle;

	for (i = 0; i < ncycle; i++) {
		cstart = panonopt_end+i;
		pos = cstart;
		for (j = 0; j < cyclelen; j++) {
			if (pos >= panonopt_end)
				pos -= nnonopts;
			else
				pos += nopts;
			swap = nargv[pos];
			/* LINTED const cast */
			((char **) nargv)[pos] = nargv[cstart];
			/* LINTED const cast */
			((char **)nargv)[cstart] = swap;
		}
	}
}

/*
 * parse_long_options --
 *	Parse long options in argc/argv argument vector.
 * Returns -1 if short_too is set and the option does not match long_options.
 */
static int
parse_long_options(struct getopt_state *state, char * const *nargv,
		   const char *options,	const struct option *long_options,
		   int *idx, int short_too, int flags)
{
	char *current_argv, *has_equal;
#ifdef GNU_COMPATIBLE
	char *current_dash;
#endif
	size_t current_argv_len;
	int i, match, exact_match, second_partial_match;

	current_argv = state->place;
#ifdef GNU_COMPATIBLE
	switch (dash_prefix) {
	case D_PREFIX:
		current_dash = "-";
		break;
	case DD_PREFIX:
		current_dash = "--";
		break;
	case W_PREFIX:
		current_dash = "-W ";
		break;
	default:
		current_dash = "";
		break;
	}
#endif
	match = -1;
	exact_match = 0;
	second_partial_match = 0;

	state->optind++;

	has_equal = strchr(current_argv, '=');
	if (has_equal != NULL) {
		/* argument found (--option=arg) */
		current_argv_len = has_equal - current_argv;
		has_equal++;
	} else
		current_argv_len = strlen(current_argv);

	for (i = 0; long_options[i].name; i++) {
		/* find matching long option */
		if (strncmp(current_argv, long_options[i].name,
		    current_argv_len))
			continue;

		if (strlen(long_options[i].name) == current_argv_len) {
			/* exact match */
			match = i;
			exact_match = 1;
			break;
		}
		/*
		 * If this is a known short option, don't allow
		 * a partial match of a single character.
		 */
		if (short_too && current_argv_len == 1)
			continue;

		if (match == -1)        /* first partial match */
			match = i;
		else if ((flags & FLAG_LONGONLY) ||
			 long_options[i].has_arg !=
			     long_options[match].has_arg ||
			 long_options[i].flag != long_options[match].flag ||
			 long_options[i].val != long_options[match].val)
			second_partial_match = 1;
	}
	if (!exact_match && second_partial_match) {
		/* ambiguous abbreviation */
		if (PRINT_ERROR)
			LOG_WRN(AMBIG,
#ifdef GNU_COMPATIBLE
			     current_dash,
#endif
			     (int)current_argv_len,
			     current_argv);
		state->optopt = 0;
		return BADCH;
	}
	if (match != -1) {		/* option found */
		if (long_options[match].has_arg == no_argument
		    && has_equal) {
			if (PRINT_ERROR)
				LOG_WRN(NOARG,
#ifdef GNU_COMPATIBLE
				     current_dash,
#endif
				     (int)current_argv_len,
				     current_argv);
			/*
			 * XXX: GNU sets optopt to val regardless of flag
			 */
			if (long_options[match].flag == NULL)
				state->optopt = long_options[match].val;
			else
				state->optopt = 0;
#ifdef GNU_COMPATIBLE
			return BADCH;
#else
			return BADARG;
#endif
		}
		if (long_options[match].has_arg == required_argument ||
		    long_options[match].has_arg == optional_argument) {
			if (has_equal)
				state->optarg = has_equal;
			else if (long_options[match].has_arg ==
			    required_argument) {
				/*
				 * optional argument doesn't use next nargv
				 */
				state->optarg = nargv[state->optind++];
			}
		}
		if ((long_options[match].has_arg == required_argument)
		    && (state->optarg == NULL)) {
			/*
			 * Missing argument; leading ':' indicates no error
			 * should be generated.
			 */
			if (PRINT_ERROR)
				LOG_WRN(RECARGSTRING,
#ifdef GNU_COMPATIBLE
				    current_dash,
#endif
				    current_argv);
			/*
			 * XXX: GNU sets optopt to val regardless of flag
			 */
			if (long_options[match].flag == NULL)
				state->optopt = long_options[match].val;
			else
				state->optopt = 0;
			--state->optind;
			return BADARG;
		}
	} else {			/* unknown option */
		if (short_too) {
			--state->optind;
			return -1;
		}
		if (PRINT_ERROR)
			LOG_WRN(ILLOPTSTRING,
#ifdef GNU_COMPATIBLE
			      current_dash,
#endif
			      current_argv);
		state->optopt = 0;
		return BADCH;
	}
	if (idx)
		*idx = match;
	if (long_options[match].flag) {
		*long_options[match].flag = long_options[match].val;
		return 0;
	} else
		return long_options[match].val;
}

/*
 * getopt_internal --
 *	Parse argc/argv argument vector.  Called by user level routines.
 */
static int
getopt_internal(struct getopt_state *state, int nargc, char * const *nargv,
		const char *options, const struct option *long_options,
		int *idx, int flags)
{
	char *oli;				/* option letter list index */
	int optchar, short_too;

	if (options == NULL)
		return -1;

	/*
	 * Disable GNU extensions if options string begins with a '+'.
	 */
#ifdef GNU_COMPATIBLE
	if (*options == '-')
		flags |= FLAG_ALLARGS;
	else if (*options == '+')
		flags &= ~FLAG_PERMUTE;
#else
	if (*options == '+')
		flags &= ~FLAG_PERMUTE;
	else if (*options == '-')
		flags |= FLAG_ALLARGS;
#endif
	if (*options == '+' || *options == '-')
		options++;

	/*
	 * XXX Some GNU programs (like cvs) set optind to 0 instead of
	 * XXX using optreset.  Work around this braindamage.
	 */
	if (state->optind == 0)
		state->optind = state->optreset = 1;

	state->optarg = NULL;
	if (state->optreset)
		state->nonopt_start = state->nonopt_end = -1;
start:
	if (state->optreset || !*(state->place)) {/* update scanning pointer */
		state->optreset = 0;
		if (state->optind >= nargc) {          /* end of argument vector */
			state->place = EMSG;
			if (state->nonopt_end != -1) {
				/* do permutation, if we have to */
				permute_args(state->nonopt_start,
					     state->nonopt_end,
					     state->optind, nargv);
				state->optind -= state->nonopt_end -
						state->nonopt_start;
			} else if (state->nonopt_start != -1) {
				/*
				 * If we skipped non-options, set optind
				 * to the first of them.
				 */
				state->optind = state->nonopt_start;
			}
			state->nonopt_start = state->nonopt_end = -1;
			return -1;
		}
		state->place = nargv[state->optind];
		if (*(state->place) != '-' ||
#ifdef GNU_COMPATIBLE
		    state->place[1] == '\0') {
#else
		    (state->place[1] == '\0' && strchr(options, '-') == NULL)) {
#endif
			state->place = EMSG;		/* found non-option */
			if (flags & FLAG_ALLARGS) {
				/*
				 * GNU extension:
				 * return non-option as argument to option 1
				 */
				state->optarg = nargv[state->optind++];
				return INORDER;
			}
			if (!(flags & FLAG_PERMUTE)) {
				/*
				 * If no permutation wanted, stop parsing
				 * at first non-option.
				 */
				return -1;
			}
			/* do permutation */
			if (state->nonopt_start == -1) {
				state->nonopt_start = state->optind;
			} else if (state->nonopt_end != -1) {
				permute_args(state->nonopt_start,
					     state->nonopt_end,
					     state->optind,
					     nargv);
				state->nonopt_start = state->optind -
				    (state->nonopt_end - state->nonopt_start);
				state->nonopt_end = -1;
			}
			state->optind++;
			/* process next argument */
			goto start;
		}
		if (state->nonopt_start != -1 && state->nonopt_end == -1) {
			state->nonopt_end = state->optind;
		}

		/*
		 * If we have "-" do nothing, if "--" we are done.
		 */
		if (state->place[1] != '\0' && *++(state->place) == '-' &&
		    state->place[1] == '\0') {
			state->optind++;
			state->place = EMSG;
			/*
			 * We found an option (--), so if we skipped
			 * non-options, we have to permute.
			 */
			if (state->nonopt_end != -1) {
				permute_args(state->nonopt_start,
					     state->nonopt_end,
					     state->optind,
					     nargv);
				state->optind -= state->nonopt_end -
						 state->nonopt_start;
			}
			state->nonopt_start = state->nonopt_end = -1;
			return -1;
		}
	}

	/*
	 * Check long options if:
	 *  1) we were passed some
	 *  2) the arg is not just "-"
	 *  3) either the arg starts with -- we are getopt_long_only()
	 */
	if (long_options != NULL && state->place != nargv[state->optind] &&
	    (*(state->place) == '-' || (flags & FLAG_LONGONLY))) {
		short_too = 0;
#ifdef GNU_COMPATIBLE
		dash_prefix = D_PREFIX;
#endif
		if (*(state->place) == '-') {
			state->place++;		/* --foo long option */
#ifdef GNU_COMPATIBLE
			dash_prefix = DD_PREFIX;
#endif
		} else if (*(state->place) != ':' && strchr(options,
						       *(state->place)) != NULL)
			short_too = 1;		/* could be short option too */

		optchar = parse_long_options(state, nargv, options,
					     long_options, idx, short_too,
					     flags);
		if (optchar != -1) {
			state->place = EMSG;
			return optchar;
		}
	}
	optchar = (int)*(state->place)++;
	oli = strchr(options, optchar);
	if (optchar == (int)':' ||
	    (optchar == (int)'-' && *(state->place) != '\0') ||
	    oli == NULL) {
		/*
		 * If the user specified "-" and  '-' isn't listed in
		 * options, return -1 (non-option) as per POSIX.
		 * Otherwise, it is an unknown option character (or ':').
		 */
		if (optchar == (int)'-' && *(state->place) == '\0') {
			return -1;
		}
		if (!*(state->place)) {
			++state->optind;
		}
#ifdef GNU_COMPATIBLE
		if (PRINT_ERROR) {
			LOG_WRN(GNUOPTCHAR, optchar);
		}
#else
		if (PRINT_ERROR) {
			LOG_WRN(ILLOPTCHAR, optchar);
		}
#endif
		state->optopt = optchar;
		return BADCH;
	}
	if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
		/* -W long-option */
		if (*(state->place)) {		/* no space */
			; /* NOTHING */
		} else if (++(state->optind) >= nargc) {	/* no arg */
			state->place = EMSG;
			if (PRINT_ERROR) {
				LOG_WRN(RECARGCHAR, optchar);
			}
			state->optopt = optchar;
			return BADARG;
		} else if ((state->optind) < nargc) {
			state->place = nargv[state->optind];
		}
#ifdef GNU_COMPATIBLE
		dash_prefix = W_PREFIX;
#endif
		optchar = parse_long_options(state, nargv, options,
					     long_options, idx, 0, flags);
		state->place = EMSG;
		return optchar;
	}
	if (*++oli != ':') {			/* doesn't take argument */
		if (!*(state->place)) {
			++state->optind;
		}
	} else {				/* takes (optional) argument */
		state->optarg = NULL;
		if (*(state->place)) {			/* no white space */
			state->optarg = state->place;
		} else if (oli[1] != ':') {	/* arg not optional */
			if (++state->optind >= nargc) {	/* no arg */
				state->place = EMSG;
				if (PRINT_ERROR) {
					LOG_WRN(RECARGCHAR, optchar);
				}
				state->optopt = optchar;
				return BADARG;
			}
			state->optarg = nargv[state->optind];
		}
		state->place = EMSG;
		++state->optind;
	}
	/* dump back option letter */
	return optchar;
}

/*
 * getopt_long --
 *	Parse argc/argv argument vector.
 */
int
getopt_long(int nargc, char *const *nargv,
	    const char *options, const struct option *long_options,
	    int *idx)
{
	struct getopt_state *state;
	int ret;

	/* Get state of the current thread */
	state = getopt_state_get();

	ret = getopt_internal(state, nargc, nargv, options, long_options, idx,
			      FLAG_PERMUTE);

	z_getopt_global_state_update(state);

	return ret;
}

/*
 * getopt_long_only --
 *	Parse argc/argv argument vector.
 */
int
getopt_long_only(int nargc, char *const *nargv,
		 const char *options, const struct option *long_options,
		 int *idx)
{
	struct getopt_state *state;
	int ret;

	/* Get state of the current thread */
	state = getopt_state_get();

	ret = getopt_internal(state, nargc, nargv, options, long_options, idx,
			      FLAG_PERMUTE|FLAG_LONGONLY);

	z_getopt_global_state_update(state);

	return ret;
}
