(root)/
tar-1.35/
gnu/
getopt1.c
       1  /* getopt_long and getopt_long_only entry points for GNU getopt.
       2     Copyright (C) 1987-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library and is also part of gnulib.
       4     Patches to this file should be submitted to both projects.
       5  
       6     The GNU C Library is free software; you can redistribute it and/or
       7     modify it under the terms of the GNU Lesser General Public
       8     License as published by the Free Software Foundation; either
       9     version 2.1 of the License, or (at your option) any later version.
      10  
      11     The GNU C Library is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14     Lesser General Public License for more details.
      15  
      16     You should have received a copy of the GNU Lesser General Public
      17     License along with the GNU C Library; if not, see
      18     <https://www.gnu.org/licenses/>.  */
      19  
      20  #ifndef _LIBC
      21  # include <config.h>
      22  #endif
      23  
      24  #include "getopt.h"
      25  #include "getopt_int.h"
      26  
      27  int
      28  getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
      29  	     const struct option *long_options, int *opt_index)
      30  {
      31    return _getopt_internal (argc, (char **) argv, options, long_options,
      32  			   opt_index, 0, 0);
      33  }
      34  
      35  int
      36  _getopt_long_r (int argc, char **argv, const char *options,
      37  		const struct option *long_options, int *opt_index,
      38  		struct _getopt_data *d)
      39  {
      40    return _getopt_internal_r (argc, argv, options, long_options, opt_index,
      41  			     0, d, 0);
      42  }
      43  
      44  /* Like getopt_long, but '-' as well as '--' can indicate a long option.
      45     If an option that starts with '-' (not '--') doesn't match a long option,
      46     but does match a short option, it is parsed as a short option
      47     instead.  */
      48  
      49  int
      50  getopt_long_only (int argc, char *__getopt_argv_const *argv,
      51  		  const char *options,
      52  		  const struct option *long_options, int *opt_index)
      53  {
      54    return _getopt_internal (argc, (char **) argv, options, long_options,
      55  			   opt_index, 1, 0);
      56  }
      57  
      58  int
      59  _getopt_long_only_r (int argc, char **argv, const char *options,
      60  		     const struct option *long_options, int *opt_index,
      61  		     struct _getopt_data *d)
      62  {
      63    return _getopt_internal_r (argc, argv, options, long_options, opt_index,
      64  			     1, d, 0);
      65  }
      66  
      67  
      68  #ifdef TEST
      69  
      70  #include <stdio.h>
      71  #include <stdlib.h>
      72  
      73  int
      74  main (int argc, char **argv)
      75  {
      76    int c;
      77    int digit_optind = 0;
      78  
      79    while (1)
      80      {
      81        int this_option_optind = optind ? optind : 1;
      82        int option_index = 0;
      83        static const struct option long_options[] =
      84        {
      85  	{"add", 1, 0, 0},
      86  	{"append", 0, 0, 0},
      87  	{"delete", 1, 0, 0},
      88  	{"verbose", 0, 0, 0},
      89  	{"create", 0, 0, 0},
      90  	{"file", 1, 0, 0},
      91  	{0, 0, 0, 0}
      92        };
      93  
      94        c = getopt_long (argc, argv, "abc:d:0123456789",
      95  		       long_options, &option_index);
      96        if (c == -1)
      97  	break;
      98  
      99        switch (c)
     100  	{
     101  	case 0:
     102  	  printf ("option %s", long_options[option_index].name);
     103  	  if (optarg)
     104  	    printf (" with arg %s", optarg);
     105  	  printf ("\n");
     106  	  break;
     107  
     108  	case '0':
     109  	case '1':
     110  	case '2':
     111  	case '3':
     112  	case '4':
     113  	case '5':
     114  	case '6':
     115  	case '7':
     116  	case '8':
     117  	case '9':
     118  	  if (digit_optind != 0 && digit_optind != this_option_optind)
     119  	    printf ("digits occur in two different argv-elements.\n");
     120  	  digit_optind = this_option_optind;
     121  	  printf ("option %c\n", c);
     122  	  break;
     123  
     124  	case 'a':
     125  	  printf ("option a\n");
     126  	  break;
     127  
     128  	case 'b':
     129  	  printf ("option b\n");
     130  	  break;
     131  
     132  	case 'c':
     133  	  printf ("option c with value '%s'\n", optarg);
     134  	  break;
     135  
     136  	case 'd':
     137  	  printf ("option d with value '%s'\n", optarg);
     138  	  break;
     139  
     140  	case '?':
     141  	  break;
     142  
     143  	default:
     144  	  printf ("?? getopt returned character code 0%o ??\n", c);
     145  	}
     146      }
     147  
     148    if (optind < argc)
     149      {
     150        printf ("non-option ARGV-elements: ");
     151        while (optind < argc)
     152  	printf ("%s ", argv[optind++]);
     153        printf ("\n");
     154      }
     155  
     156    exit (0);
     157  }
     158  
     159  #endif /* TEST */