⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getopt.c

📁 制作2.6内核的CLFS时 使用的diffutils-2.8.7.tar.gz包
💻 C
📖 第 1 页 / 共 3 页
字号:
		if (_IO_fwide (stderr, 0) > 0)		  __fwprintf (stderr, L"%s", buf);		else		  fputs (buf, stderr);		((_IO_FILE *) stderr)->_flags2 = old_flags2;		_IO_funlockfile (stderr);		free (buf);	      }#endif	  }	d->optopt = c;	return '?';      }    /* Convenience. Treat POSIX -W foo same as long option --foo */    if (temp[0] == 'W' && temp[1] == ';')      {	char *nameend;	const struct option *p;	const struct option *pfound = NULL;	int exact = 0;	int ambig = 0;	int indfound = 0;	int option_index;	/* This is an option that requires an argument.  */	if (*d->__nextchar != '\0')	  {	    d->optarg = d->__nextchar;	    /* If we end this ARGV-element by taking the rest as an arg,	       we must advance to the next element now.  */	    d->optind++;	  }	else if (d->optind == argc)	  {	    if (print_errors)	      {		/* 1003.2 specifies the format of this message.  */#if defined _LIBC && defined USE_IN_LIBIO		char *buf;		if (__asprintf (&buf,				_("%s: option requires an argument -- %c\n"),				argv[0], c) >= 0)		  {		    _IO_flockfile (stderr);		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;		    if (_IO_fwide (stderr, 0) > 0)		      __fwprintf (stderr, L"%s", buf);		    else		      fputs (buf, stderr);		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;		    _IO_funlockfile (stderr);		    free (buf);		  }#else		fprintf (stderr, _("%s: option requires an argument -- %c\n"),			 argv[0], c);#endif	      }	    d->optopt = c;	    if (optstring[0] == ':')	      c = ':';	    else	      c = '?';	    return c;	  }	else	  /* We already incremented `d->optind' once;	     increment it again when taking next ARGV-elt as argument.  */	  d->optarg = argv[d->optind++];	/* optarg is now the argument, see if it's in the	   table of longopts.  */	for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';	     nameend++)	  /* Do nothing.  */ ;	/* Test all long options for either exact match	   or abbreviated matches.  */	for (p = longopts, option_index = 0; p->name; p++, option_index++)	  if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))	    {	      if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))		{		  /* Exact match found.  */		  pfound = p;		  indfound = option_index;		  exact = 1;		  break;		}	      else if (pfound == NULL)		{		  /* First nonexact match found.  */		  pfound = p;		  indfound = option_index;		}	      else		/* Second or later nonexact match found.  */		ambig = 1;	    }	if (ambig && !exact)	  {	    if (print_errors)	      {#if defined _LIBC && defined USE_IN_LIBIO		char *buf;		if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),				argv[0], argv[d->optind]) >= 0)		  {		    _IO_flockfile (stderr);		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;		    if (_IO_fwide (stderr, 0) > 0)		      __fwprintf (stderr, L"%s", buf);		    else		      fputs (buf, stderr);		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;		    _IO_funlockfile (stderr);		    free (buf);		  }#else		fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),			 argv[0], argv[d->optind]);#endif	      }	    d->__nextchar += strlen (d->__nextchar);	    d->optind++;	    return '?';	  }	if (pfound != NULL)	  {	    option_index = indfound;	    if (*nameend)	      {		/* Don't test has_arg with >, because some C compilers don't		   allow it to be used on enums.  */		if (pfound->has_arg)		  d->optarg = nameend + 1;		else		  {		    if (print_errors)		      {#if defined _LIBC && defined USE_IN_LIBIO			char *buf;			if (__asprintf (&buf, _("\%s: option `-W %s' doesn't allow an argument\n"),					argv[0], pfound->name) >= 0)			  {			    _IO_flockfile (stderr);			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;			    ((_IO_FILE *) stderr)->_flags2			      |= _IO_FLAGS2_NOTCANCEL;			    if (_IO_fwide (stderr, 0) > 0)			      __fwprintf (stderr, L"%s", buf);			    else			      fputs (buf, stderr);			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;			    _IO_funlockfile (stderr);			    free (buf);			  }#else			fprintf (stderr, _("\%s: option `-W %s' doesn't allow an argument\n"),				 argv[0], pfound->name);#endif		      }		    d->__nextchar += strlen (d->__nextchar);		    return '?';		  }	      }	    else if (pfound->has_arg == 1)	      {		if (d->optind < argc)		  d->optarg = argv[d->optind++];		else		  {		    if (print_errors)		      {#if defined _LIBC && defined USE_IN_LIBIO			char *buf;			if (__asprintf (&buf, _("\%s: option `%s' requires an argument\n"),					argv[0], argv[d->optind - 1]) >= 0)			  {			    _IO_flockfile (stderr);			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;			    ((_IO_FILE *) stderr)->_flags2			      |= _IO_FLAGS2_NOTCANCEL;			    if (_IO_fwide (stderr, 0) > 0)			      __fwprintf (stderr, L"%s", buf);			    else			      fputs (buf, stderr);			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;			    _IO_funlockfile (stderr);			    free (buf);			  }#else			fprintf (stderr,				 _("%s: option `%s' requires an argument\n"),				 argv[0], argv[d->optind - 1]);#endif		      }		    d->__nextchar += strlen (d->__nextchar);		    return optstring[0] == ':' ? ':' : '?';		  }	      }	    d->__nextchar += strlen (d->__nextchar);	    if (longind != NULL)	      *longind = option_index;	    if (pfound->flag)	      {		*(pfound->flag) = pfound->val;		return 0;	      }	    return pfound->val;	  }	  d->__nextchar = NULL;	  return 'W';	/* Let the application handle it.   */      }    if (temp[1] == ':')      {	if (temp[2] == ':')	  {	    /* This is an option that accepts an argument optionally.  */	    if (*d->__nextchar != '\0')	      {		d->optarg = d->__nextchar;		d->optind++;	      }	    else	      d->optarg = NULL;	    d->__nextchar = NULL;	  }	else	  {	    /* This is an option that requires an argument.  */	    if (*d->__nextchar != '\0')	      {		d->optarg = d->__nextchar;		/* If we end this ARGV-element by taking the rest as an arg,		   we must advance to the next element now.  */		d->optind++;	      }	    else if (d->optind == argc)	      {		if (print_errors)		  {		    /* 1003.2 specifies the format of this message.  */#if defined _LIBC && defined USE_IN_LIBIO		    char *buf;		    if (__asprintf (&buf, _("\%s: option requires an argument -- %c\n"),				    argv[0], c) >= 0)		      {			_IO_flockfile (stderr);			int old_flags2 = ((_IO_FILE *) stderr)->_flags2;			((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;			if (_IO_fwide (stderr, 0) > 0)			  __fwprintf (stderr, L"%s", buf);			else			  fputs (buf, stderr);			((_IO_FILE *) stderr)->_flags2 = old_flags2;			_IO_funlockfile (stderr);			free (buf);		      }#else		    fprintf (stderr,			     _("%s: option requires an argument -- %c\n"),			     argv[0], c);#endif		  }		d->optopt = c;		if (optstring[0] == ':')		  c = ':';		else		  c = '?';	      }	    else	      /* We already incremented `optind' once;		 increment it again when taking next ARGV-elt as argument.  */	      d->optarg = argv[d->optind++];	    d->__nextchar = NULL;	  }      }    return c;  }}int_getopt_internal (int argc, char *const *argv, const char *optstring,		  const struct option *longopts, int *longind, int long_only){  int result;  getopt_data.optind = optind;  getopt_data.opterr = opterr;  result = _getopt_internal_r (argc, argv, optstring, longopts,			       longind, long_only, &getopt_data);  optind = getopt_data.optind;  optarg = getopt_data.optarg;  optopt = getopt_data.optopt;  return result;}intgetopt (int argc, char *const *argv, const char *optstring){  return _getopt_internal (argc, argv, optstring,			   (const struct option *) 0,			   (int *) 0,			   0);}#endif	/* Not ELIDE_CODE.  */#ifdef TEST/* Compile with -DTEST to make an executable for use in testing   the above definition of `getopt'.  */intmain (int argc, char **argv){  int c;  int digit_optind = 0;  while (1)    {      int this_option_optind = optind ? optind : 1;      c = getopt (argc, argv, "abc:d:0123456789");      if (c == -1)	break;      switch (c)	{	case '0':	case '1':	case '2':	case '3':	case '4':	case '5':	case '6':	case '7':	case '8':	case '9':	  if (digit_optind != 0 && digit_optind != this_option_optind)	    printf ("digits occur in two different argv-elements.\n");	  digit_optind = this_option_optind;	  printf ("option %c\n", c);	  break;	case 'a':	  printf ("option a\n");	  break;	case 'b':	  printf ("option b\n");	  break;	case 'c':	  printf ("option c with value `%s'\n", optarg);	  break;	case '?':	  break;	default:	  printf ("?? getopt returned character code 0%o ??\n", c);	}    }  if (optind < argc)    {      printf ("non-option ARGV-elements: ");      while (optind < argc)	printf ("%s ", argv[optind++]);      printf ("\n");    }  exit (0);}#endif /* TEST */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -