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

📄 getopt.c

📁 Intercom 是一个 Unix系统上灵活的语音传输软件。支持标准音频压缩比如GSM, G.711, and G.72x和其他音频编码。Intercom专为高速网络设计来传输高品质的语音
💻 C
📖 第 1 页 / 共 3 页
字号:
	      else		{		  /* +option or -option */#if defined _LIBC && defined USE_IN_LIBIO		  __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"),			      argv[0], argv[optind][0], nextchar);#else		  fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),			   argv[0], argv[optind][0], nextchar);#endif		}#if defined _LIBC && defined USE_IN_LIBIO	      if (_IO_fwide (stderr, 0) > 0)		__fwprintf (stderr, L"%s", buf);	      else		fputs (buf, stderr);	      free (buf);#endif	    }	  nextchar = (char *) "";	  optind++;	  optopt = 0;	  return '?';	}    }  /* Look at and handle the next short option-character.  */  {    char c = *nextchar++;    char *temp = my_index (optstring, c);    /* Increment `optind' when we start to process its last character.  */    if (*nextchar == '\0')      ++optind;    if (temp == NULL || c == ':')      {	if (print_errors)	  {#if defined _LIBC && defined USE_IN_LIBIO	      char *buf;#endif	    if (posixly_correct)	      {		/* 1003.2 specifies the format of this message.  */#if defined _LIBC && defined USE_IN_LIBIO		__asprintf (&buf, _("%s: illegal option -- %c\n"),			    argv[0], c);#else		fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);#endif	      }	    else	      {#if defined _LIBC && defined USE_IN_LIBIO		__asprintf (&buf, _("%s: invalid option -- %c\n"),			    argv[0], c);#else		fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);#endif	      }#if defined _LIBC && defined USE_IN_LIBIO	    if (_IO_fwide (stderr, 0) > 0)	      __fwprintf (stderr, L"%s", buf);	    else	      fputs (buf, stderr);	    free (buf);#endif	  }	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 (*nextchar != '\0')	  {	    optarg = nextchar;	    /* If we end this ARGV-element by taking the rest as an arg,	       we must advance to the next element now.  */	    optind++;	  }	else if (optind == argc)	  {	    if (print_errors)	      {		/* 1003.2 specifies the format of this message.  */#if defined _LIBC && defined USE_IN_LIBIO		char *buf;		__asprintf (&buf, _("%s: option requires an argument -- %c\n"),			    argv[0], c);		if (_IO_fwide (stderr, 0) > 0)		  __fwprintf (stderr, L"%s", buf);		else		  fputs (buf, stderr);		free (buf);#else		fprintf (stderr, _("%s: option requires an argument -- %c\n"),			 argv[0], c);#endif	      }	    optopt = c;	    if (optstring[0] == ':')	      c = ':';	    else	      c = '?';	    return c;	  }	else	  /* We already incremented `optind' once;	     increment it again when taking next ARGV-elt as argument.  */	  optarg = argv[optind++];	/* optarg is now the argument, see if it's in the	   table of longopts.  */	for (nextchar = nameend = 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, nextchar, nameend - nextchar))	    {	      if ((unsigned int) (nameend - 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;		__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),			    argv[0], argv[optind]);		if (_IO_fwide (stderr, 0) > 0)		  __fwprintf (stderr, L"%s", buf);		else		  fputs (buf, stderr);		free (buf);#else		fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),			 argv[0], argv[optind]);#endif	      }	    nextchar += strlen (nextchar);	    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)		  optarg = nameend + 1;		else		  {		    if (print_errors)		      {#if defined _LIBC && defined USE_IN_LIBIO			char *buf;			__asprintf (&buf, _("\%s: option `-W %s' doesn't allow an argument\n"),				    argv[0], pfound->name);			if (_IO_fwide (stderr, 0) > 0)			  __fwprintf (stderr, L"%s", buf);			else			  fputs (buf, stderr);			free (buf);#else			fprintf (stderr, _("\%s: option `-W %s' doesn't allow an argument\n"),				 argv[0], pfound->name);#endif		      }		    nextchar += strlen (nextchar);		    return '?';		  }	      }	    else if (pfound->has_arg == 1)	      {		if (optind < argc)		  optarg = argv[optind++];		else		  {		    if (print_errors)		      {#if defined _LIBC && defined USE_IN_LIBIO			char *buf;			__asprintf (&buf, _("\%s: option `%s' requires an argument\n"),				    argv[0], argv[optind - 1]);			if (_IO_fwide (stderr, 0) > 0)			  __fwprintf (stderr, L"%s", buf);			else			  fputs (buf, stderr);			free (buf);#else			fprintf (stderr,				 _("%s: option `%s' requires an argument\n"),				 argv[0], argv[optind - 1]);#endif		      }		    nextchar += strlen (nextchar);		    return optstring[0] == ':' ? ':' : '?';		  }	      }	    nextchar += strlen (nextchar);	    if (longind != NULL)	      *longind = option_index;	    if (pfound->flag)	      {		*(pfound->flag) = pfound->val;		return 0;	      }	    return pfound->val;	  }	  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 (*nextchar != '\0')	      {		optarg = nextchar;		optind++;	      }	    else	      optarg = NULL;	    nextchar = NULL;	  }	else	  {	    /* This is an option that requires an argument.  */	    if (*nextchar != '\0')	      {		optarg = nextchar;		/* If we end this ARGV-element by taking the rest as an arg,		   we must advance to the next element now.  */		optind++;	      }	    else if (optind == argc)	      {		if (print_errors)		  {		    /* 1003.2 specifies the format of this message.  */#if defined _LIBC && defined USE_IN_LIBIO		    char *buf;		    __asprintf (&buf,				_("%s: option requires an argument -- %c\n"),				argv[0], c);		    if (_IO_fwide (stderr, 0) > 0)		      __fwprintf (stderr, L"%s", buf);		    else		      fputs (buf, stderr);		    free (buf);#else		    fprintf (stderr,			     _("%s: option requires an argument -- %c\n"),			     argv[0], c);#endif		  }		optopt = c;		if (optstring[0] == ':')		  c = ':';		else		  c = '?';	      }	    else	      /* We already incremented `optind' once;		 increment it again when taking next ARGV-elt as argument.  */	      optarg = argv[optind++];	    nextchar = NULL;	  }      }    return c;  }}intgetopt (argc, argv, optstring)     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 (argc, argv)     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 + -