You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.8 KiB
123 lines
2.8 KiB
3 years ago
|
/* getopt_local.c */
|
||
|
|
||
|
/* Public Domain getopt clone */
|
||
|
|
||
|
/* Part of the ht://Dig package <http://www.htdig.org/> */
|
||
|
/* Copyright (c) 2003 The ht://Dig Group */
|
||
|
/* For copyright details, see the file COPYING in your distribution */
|
||
|
/* or the GNU Library General Public License (LGPL) version 2 or later or later */
|
||
|
/* <http://www.gnu.org/copyleft/lgpl.html> */
|
||
|
|
||
|
/* Added to HtDig code June 2003 by Neal Richter, RightNow Technologies */
|
||
|
|
||
|
/*
|
||
|
** This getopt behaves pretty much like you would expect.
|
||
|
** It does handle arguments like '-ab-' a little differently
|
||
|
** then normal; I think the -- 'stop option processing' should
|
||
|
** be treated like just another option, so that's what mine does.
|
||
|
** Other getopts seem to ignore the second '-' in '-ab-'.
|
||
|
**
|
||
|
** I hereby place this version of getopt in
|
||
|
** the public domain. Do with this what you will.
|
||
|
** I'm sure there is a nicer and faster version out there
|
||
|
** somewhere but I don't care!
|
||
|
**
|
||
|
** Robert Osborne, May 1991.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include "getopt_local.h"
|
||
|
|
||
|
#ifdef GETOPT_LOCAL
|
||
|
|
||
|
int optind = 1;
|
||
|
int opterr = 1;
|
||
|
char *optarg = (char *) 0;
|
||
|
|
||
|
static char *next_arg = (char *) 0;
|
||
|
|
||
|
#define NO_OPT 0
|
||
|
#define OPT_PLAIN 1
|
||
|
#define OPT_ARG 2
|
||
|
|
||
|
|
||
|
/* ----- getopt -------------------------------------- Oct 23, 1999 21:48 ---
|
||
|
*/
|
||
|
int
|
||
|
getopt(int argc, char *argv[], char *optstring)
|
||
|
{
|
||
|
int ret;
|
||
|
int which = NO_OPT;
|
||
|
|
||
|
if (next_arg == (char*) 0)
|
||
|
{
|
||
|
if (argv[optind] == (char *) 0 || argv[optind][0] != '-')
|
||
|
return -1;
|
||
|
next_arg = &argv[optind][1];
|
||
|
}
|
||
|
|
||
|
if ((*next_arg == '\0') || (*next_arg == '-'))
|
||
|
{
|
||
|
optind++;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
while(*optstring)
|
||
|
if (*next_arg == *optstring++)
|
||
|
which = (*optstring == ':') ? OPT_ARG : OPT_PLAIN;
|
||
|
|
||
|
switch (which)
|
||
|
{
|
||
|
case NO_OPT:
|
||
|
case OPT_PLAIN:
|
||
|
ret = *next_arg++;
|
||
|
|
||
|
if (*next_arg == '\0')
|
||
|
{
|
||
|
optind++;
|
||
|
next_arg = (char *)0;
|
||
|
}
|
||
|
|
||
|
if (which == OPT_PLAIN)
|
||
|
return ret;
|
||
|
|
||
|
if (opterr)
|
||
|
fprintf(stderr, "%s: illegal option -- %c\n", argv[0], ret);
|
||
|
|
||
|
return '?';
|
||
|
|
||
|
case OPT_ARG:
|
||
|
ret = *next_arg++;
|
||
|
optind++;
|
||
|
|
||
|
if (*next_arg != '\0')
|
||
|
{
|
||
|
optarg = next_arg;
|
||
|
next_arg = (char*) 0;
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
if (argv[optind] != (char*) 0)
|
||
|
{
|
||
|
optarg = argv[optind];
|
||
|
optind++;
|
||
|
next_arg = (char*) 0;
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
next_arg = (char*) 0;
|
||
|
if (opterr)
|
||
|
fprintf(stderr, "%s: option requires an option -- %c\n",
|
||
|
argv[0], ret);
|
||
|
return '?';
|
||
|
}
|
||
|
|
||
|
return(-1);
|
||
|
}
|
||
|
#elif defined(_MSC_VER) /* _WIN32 */
|
||
|
#error _MSC_VER but !GETOPT_LOCAL
|
||
|
#endif /* GETOPT_LOCAL */
|
||
|
|