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

	_DIAGASSERT(nargv != NULL);
	_DIAGASSERT(ostr != NULL);

	if (optreset || !*place) {		/* update scanning pointer */
		optreset = 0;
		if (optind >= nargc || *(place = nargv[optind]) != '-') {
			place = EMSG;
			return (-1);
		}
		if (place[1] && *++place == '-') {	/* found "--" */
			/* ++optind; */
			place = EMSG;
			return (-2);
		}
	}					/* 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,
			    "%s: illegal option -- %c\n", __progname(nargv[0]), 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 ((opterr) && (*ostr != ':'))
				(void)fprintf(stderr,
				    "%s: option requires an argument -- %c\n",
				    __progname(nargv[0]), optopt);
			return (BADARG);
		} else				/* white space */
			optarg = nargv[optind];
		place = EMSG;
		++optind;
	}
	return (optopt);			/* dump back option letter */
}
Пример #2
0
/*
 * getopt_long --
 *	Parse argc/argv argument vector.
 */
int
getopt_long(int nargc, char * const * nargv, 
    const char * options, const struct option * long_options, int * index)
//     int nargc;
//     char * const * nargv;
//     const char * options;
//     const struct option * long_options;
//     int * index;
{
	int retval;

	if ((retval = getopt_internal(nargc, nargv, options)) == -2) {
		char *current_argv = nargv[optind++] + 2, *has_equal;
		int i, match = -1;
		size_t current_argv_len;

		if (*current_argv == '\0') {
			return(-1);
		}
		if ((has_equal = strchr(current_argv, '='))) {
			current_argv_len = has_equal - current_argv;
			has_equal++;
		} else
			current_argv_len = strlen(current_argv);

		for (i = 0; long_options[i].name; i++) {
			if (strncmp(current_argv, long_options[i].name, current_argv_len))
				continue;

			if (strlen(long_options[i].name) == current_argv_len) {
				match = i;
				break;
			}
			if (match == -1)
				match = i;
		}
		if (match != -1) {
			if (long_options[match].has_arg) {
				if (has_equal)
					optarg = has_equal;
				else
					optarg = nargv[optind++];
			}
			if ((long_options[match].has_arg == 1) && (optarg == NULL)) {
				/* Missing option, leading : indecates no error */
				if ((opterr) && (*options != ':'))
					fprintf(stderr,
				      "%s: option requires an argument -- %s\n",
				      __progname(nargv[0]), current_argv);
				return (BADARG);
			}
		} else { /* No matching argument */
			if ((opterr) && (*options != ':'))
				fprintf(stderr,
				    "%s: illegal option -- %s\n", __progname(nargv[0]), current_argv);
			return (BADCH);
		}
		if (long_options[match].flag) {
			*long_options[match].flag = long_options[match].val;
			retval = 0;
		} else
			retval = long_options[match].val;
		if (index)
			*index = match;
	}
	return(retval);
}
Пример #3
0
int cdo_getopt_long(int argc, char * const *argv, const char *optstring, const struct cdo_option *longopts, int *longindex)
{
  int retval;

  assert(argv != NULL);
  assert(optstring != NULL);
  assert(longopts != NULL);
  /* index may be NULL */

  if ( (retval = cdo_getopt_internal(argc, argv, optstring)) == -2 )
    {
      char *current_argv = argv[CDO_optind++] + 2, *has_equal;
      int i, current_argv_len, match = -1;

      if ( *current_argv == '\0' ) return(-1);

      if ( (has_equal = strchr(current_argv, '=')) != NULL )
	{
	  current_argv_len = has_equal - current_argv;
	  has_equal++;
	}
      else
	current_argv_len = strlen(current_argv);

      for ( i = 0; longopts[i].name; i++ )
	{ 
	  if ( strncmp(current_argv, longopts[i].name, current_argv_len) )
	    continue;

	  if ( strlen(longopts[i].name) == (unsigned)current_argv_len )
	    { 
	      match = i;
	      break;
	    }

	  if ( match == -1 ) match = i;
	}
	
      if ( match != -1 )
	{
	  if ( longopts[match].has_arg == required_argument ||
	       longopts[match].has_arg == optional_argument )
	    {
	      if ( has_equal )
		CDO_optarg = has_equal;
	      else
		CDO_optarg = argv[CDO_optind++];
	    }
	  
	  if ( (longopts[match].has_arg == required_argument) && (CDO_optarg == NULL) )
	    {
	      /* Missing argument, leading: indicates no error should be generated */
	      if ( (CDO_opterr) && (*optstring != ':') )
		fprintf(stderr, "%s: option requires an argument -- %s\n", __progname(argv[0]), current_argv);
	      return (BADARG);
	    }
	}
      else
	{ /* No matching argument */
	  if ( (CDO_opterr) && (*optstring != ':') )
	    fprintf(stderr, "%s: illegal option -- %s\n", __progname(argv[0]), current_argv);

	  return (BADCH);
	}
	
      if ( longopts[match].flag )
	{
	  *longopts[match].flag = longopts[match].val;
	  retval = 0;
	}
      else 
	retval = longopts[match].val;
  
      if ( longindex ) *longindex = match;
    }
  
  return (retval);
}
/*
 * getopt_long --
 *	Parse argc/argv argument vector.
 */
extern "C" int
getopt_long(int nargc, char ** nargv, char * options, struct option * long_options, int * index)
{
	int retval;

	_DIAGASSERT(nargv != NULL);
	_DIAGASSERT(options != NULL);
	_DIAGASSERT(long_options != NULL);
	/* index may be NULL */

	if ((retval = getopt_internal(nargc, nargv, options)) == -2) {
		char *current_argv = nargv[optind++] + 2, *has_equal;
		int i, current_argv_len, match = -1;

		if (*current_argv == '\0') {
			return(-1);
		}
		if ((has_equal = strchr(current_argv, '=')) != NULL) {
			current_argv_len = has_equal - current_argv;
			has_equal++;
		} else
			current_argv_len = strlen(current_argv);

		for (i = 0; long_options[i].name; i++) { 
			if (strncmp(current_argv, long_options[i].name, current_argv_len))
				continue;

			if (strlen(long_options[i].name) == (unsigned)current_argv_len) { 
				match = i;
				break;
			}
			if (match == -1)
				match = i;
		}
		if (match != -1) {
			if (long_options[match].has_arg == required_argument ||
			    long_options[match].has_arg == optional_argument) {
				if (has_equal)
					optarg = has_equal;
				else
					optarg = nargv[optind++];
			}
			if ((long_options[match].has_arg == required_argument)
			    && (optarg == NULL)) {
				/*
				 * Missing argument, leading :
				 * indicates no error should be generated
				 */
				if ((opterr) && (*options != ':'))
					(void)fprintf(stderr,
				      "%s: option requires an argument -- %s\n",
				      __progname(nargv[0]), current_argv);
				return (BADARG);
			}
		} else { /* No matching argument */
			if ((opterr) && (*options != ':'))
				(void)fprintf(stderr,
				    "%s: illegal option -- %s\n", __progname(nargv[0]), current_argv);
			return (BADCH);
		}
		if (long_options[match].flag) {
			*long_options[match].flag = long_options[match].val;
			retval = 0;
		} else 
			retval = long_options[match].val;
		if (index)
			*index = match;
	}
	return(retval);
}
Пример #5
0
int xgetopt(int argc, const char* argv[], const struct xoption* options, int* optind, const char **optarg)
{
	int i, val, match, name_len;
	const char *cur_argv, *embed_arg;

	if(argc < 1 || argv == NULL || options == NULL || optind == NULL || optarg == NULL)
		return -1;

	if(*optind < 1)
		*optind = 1;
	*optarg = NULL;

	if(*optind >= argc)
		return -1;

	match = -1;
	embed_arg = NULL;
	cur_argv = argv[(*optind)++];
	if(*cur_argv == '-') {
		if(*(++cur_argv) != '-') {
			if(*(cur_argv + 1) != '\0')
				embed_arg = cur_argv + 1;
			for(i = 0; options[i].opt != 0 || options[i].name; ++i) {
				if(options[i].opt == 0)
					continue;
				if(*cur_argv == options[i].opt) {
					match = i;
					break;
				}
			}
		}
		else {
			++cur_argv;
			if ((embed_arg = strchr(cur_argv, '=')) == NULL)
				name_len = strlen(cur_argv);
			else {
				name_len = embed_arg - cur_argv;
				++embed_arg;
			}
			for(i = 0; options[i].opt != 0 || options[i].name; ++i) {
				if(strncmp(cur_argv, options[i].name, name_len))
					continue;
				if(strlen(options[i].name) == name_len) {
					match = i;
					break;
				}
			}
		}
	}
	if(match == -1) {
		(void)fprintf(stderr, "%s: illegal option -- %s\n", __progname(argv[0]), cur_argv);
		return BADCH;
	}

	if(options[match].has_arg == xargument_optional
		|| options[match].has_arg == xargument_required) {
		if(embed_arg)
			*optarg = embed_arg;
		else if(*optind < argc && argv[*optind][0] != '-')
			*optarg = argv[(*optind)++];
		else if(options[match].has_arg == xargument_required) {
			(void)fprintf(stderr, "%s: option requires an argument -- %s\n", __progname(argv[0]), cur_argv);
			return BADARG;
		}
	}

	if(options[match].val == -1)
		val = (int)options[i].opt;
	else
		val = options[match].val;

	if(options[match].flag) {
		*options[match].flag = val;
		return 0;
	}
	return val;
}