/* $PostgreSQL: pgsql/src/port/getopt.c,v 1.14 2009/06/11 14:49:15 momjian Exp $ */

/* This is used by psql under Win32 */

/*
 * Copyright (c) 1987, 1993, 1994
 *	The Regents of the University of California.  All rights reserved.
 *
 * 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.
 * 3. Neither the name of the University nor the names of its contributors
 *	  may be used to endorse or promote products derived from this software
 *	  without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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
 */

#include "c.h"

#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getopt.c	8.3 (Berkeley) 4/27/95";
#endif   /* LIBC_SCCS and not lint */


/*
 * On some versions of Solaris, opterr and friends are defined in core libc
 * rather than in a separate getopt module.  Define these variables only
 * if configure found they aren't there by default.  (We assume that testing
 * opterr is sufficient for all of these except optreset.)
 */
#ifndef HAVE_INT_OPTERR

int			opterr = 1,			/* if error message should be printed */
			optind = 1,			/* index into parent argv vector */
			optopt;				/* character checked for validity */
char	   *optarg;				/* argument associated with option */
#else

extern int	opterr;
extern int	optind;
extern int	optopt;
extern char *optarg;
#endif

#ifndef HAVE_INT_OPTRESET
int			optreset;			/* reset getopt */
#else
extern int	optreset;
#endif

#define BADCH	(int)'?'
#define BADARG	(int)':'
#define EMSG	""

/*
 * getopt
 *	Parse argc/argv argument vector.
 */
int
getopt(nargc, nargv, ostr)
int			nargc;
char	   *const * nargv;
const char *ostr;
{
	static char *place = EMSG;	/* option letter processing */
	char	   *oli;			/* option letter list index */

	if (optreset || !*place)
	{							/* update scanning pointer */
		optreset = 0;
		if (optind >= nargc || *(place = nargv[optind]) != '-')
		{
			place = EMSG;
			return -1;
		}
		if (place[1] && *++place == '-' && place[1] == '\0')
		{						/* found "--" */
			++optind;
			place = EMSG;
			return -1;
		}
	}							/* option letter okay? */
	if ((optopt = (int) *place++) == (int) ':' ||
		!(oli = strchr(ostr, optopt)))
	{
		/*
		 * if the user didn't specify '-' as an option, assume it means -1.
		 */
		if (optopt == (int) '-')
			return -1;
		if (!*place)
			++optind;
		if (opterr && *ostr != ':')
			(void) fprintf(stderr,
						   "illegal option -- %c\n", optopt);
		return BADCH;
	}
	if (*++oli != ':')
	{							/* don't need argument */
		optarg = NULL;
		if (!*place)
			++optind;
	}
	else
	{							/* need an argument */
		if (*place)				/* no white space */
			optarg = place;
		else if (nargc <= ++optind)
		{						/* no arg */
			place = EMSG;
			if (*ostr == ':')
				return BADARG;
			if (opterr)
				(void) fprintf(stderr,
							   "option requires an argument -- %c\n",
							   optopt);
			return BADCH;
		}
		else
			/* white space */
			optarg = nargv[optind];
		place = EMSG;
		++optind;
	}
	return optopt;				/* dump back option letter */
}
