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