(root)/
gawk-5.2.2/
support/
getopt1.c
       1  /* getopt_long and getopt_long_only entry points for GNU getopt.
       2     Copyright (C) 1987-2016 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <http://www.gnu.org/licenses/>.  */
      18  
      19  #ifdef HAVE_CONFIG_H
      20  #include <config.h>
      21  #endif
      22  
      23  #ifdef _LIBC
      24  # include <getopt.h>
      25  #else
      26  # include "getopt.h"
      27  #endif
      28  #include "getopt_int.h"
      29  
      30  #include <stdio.h>
      31  
      32  /* Comment out all this code if we are using the GNU C Library, and are not
      33     actually compiling the library itself.  This code is part of the GNU C
      34     Library, but also included in many other GNU distributions.  Compiling
      35     and linking in this code is a waste when using the GNU C library
      36     (especially if it is a shared library).  Rather than having every GNU
      37     program understand `configure --with-gnu-libc' and omit the object files,
      38     it is simpler to just do this in the source for each such file.  */
      39  
      40  #define GETOPT_INTERFACE_VERSION 2
      41  #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
      42  #include <gnu-versions.h>
      43  #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
      44  #define ELIDE_CODE
      45  #endif
      46  #endif
      47  
      48  /* !@#$%^&*() !!!!!!!! */
      49  #ifdef GAWK
      50  #undef ELIDE_CODE
      51  #endif
      52  
      53  #ifndef ELIDE_CODE
      54  
      55  
      56  /* This needs to come after some library #include
      57     to get __GNU_LIBRARY__ defined.  */
      58  #ifdef __GNU_LIBRARY__
      59  #include <stdlib.h>
      60  #endif
      61  
      62  #ifndef	NULL
      63  #define NULL 0
      64  #endif
      65  
      66  int
      67  getopt_long (int argc, char *const *argv, const char *options,
      68  	     const struct option *long_options, int *opt_index)
      69  {
      70    return _getopt_internal (argc, argv, options, long_options, opt_index, 0, 0);
      71  }
      72  
      73  int
      74  _getopt_long_r (int argc, char *const *argv, const char *options,
      75  		const struct option *long_options, int *opt_index,
      76  		struct _getopt_data *d)
      77  {
      78    return _getopt_internal_r (argc, argv, options, long_options, opt_index,
      79  			     0, d, 0);
      80  }
      81  
      82  /* Like getopt_long, but '-' as well as '--' can indicate a long option.
      83     If an option that starts with '-' (not '--') doesn't match a long option,
      84     but does match a short option, it is parsed as a short option
      85     instead.  */
      86  
      87  int
      88  getopt_long_only (int argc, char *const *argv, const char *options,
      89  		  const struct option *long_options, int *opt_index)
      90  {
      91    return _getopt_internal (argc, argv, options, long_options, opt_index, 1, 0);
      92  }
      93  
      94  int
      95  _getopt_long_only_r (int argc, char *const *argv, const char *options,
      96  		     const struct option *long_options, int *opt_index,
      97  		     struct _getopt_data *d)
      98  {
      99    return _getopt_internal_r (argc, argv, options, long_options, opt_index,
     100  			     1, d, 0);
     101  }
     102  
     103  #endif	/* Not ELIDE_CODE.  */
     104  
     105  #ifdef TEST
     106  
     107  #include <stdio.h>
     108  
     109  int
     110  main (int argc, char **argv)
     111  {
     112    int c;
     113    int digit_optind = 0;
     114  
     115    while (1)
     116      {
     117        int this_option_optind = optind ? optind : 1;
     118        int option_index = 0;
     119        static struct option long_options[] =
     120        {
     121  	{"add", 1, 0, 0},
     122  	{"append", 0, 0, 0},
     123  	{"delete", 1, 0, 0},
     124  	{"verbose", 0, 0, 0},
     125  	{"create", 0, 0, 0},
     126  	{"file", 1, 0, 0},
     127  	{0, 0, 0, 0}
     128        };
     129  
     130        c = getopt_long (argc, argv, "abc:d:0123456789",
     131  		       long_options, &option_index);
     132        if (c == -1)
     133  	break;
     134  
     135        switch (c)
     136  	{
     137  	case 0:
     138  	  printf ("option %s", long_options[option_index].name);
     139  	  if (optarg)
     140  	    printf (" with arg %s", optarg);
     141  	  printf ("\n");
     142  	  break;
     143  
     144  	case '0':
     145  	case '1':
     146  	case '2':
     147  	case '3':
     148  	case '4':
     149  	case '5':
     150  	case '6':
     151  	case '7':
     152  	case '8':
     153  	case '9':
     154  	  if (digit_optind != 0 && digit_optind != this_option_optind)
     155  	    printf ("digits occur in two different argv-elements.\n");
     156  	  digit_optind = this_option_optind;
     157  	  printf ("option %c\n", c);
     158  	  break;
     159  
     160  	case 'a':
     161  	  printf ("option a\n");
     162  	  break;
     163  
     164  	case 'b':
     165  	  printf ("option b\n");
     166  	  break;
     167  
     168  	case 'c':
     169  	  printf ("option c with value `%s'\n", optarg);
     170  	  break;
     171  
     172  	case 'd':
     173  	  printf ("option d with value `%s'\n", optarg);
     174  	  break;
     175  
     176  	case '?':
     177  	  break;
     178  
     179  	default:
     180  	  printf ("?? getopt returned character code 0%o ??\n", c);
     181  	}
     182      }
     183  
     184    if (optind < argc)
     185      {
     186        printf ("non-option ARGV-elements: ");
     187        while (optind < argc)
     188  	printf ("%s ", argv[optind++]);
     189        printf ("\n");
     190      }
     191  
     192    exit (0);
     193  }
     194  
     195  #endif /* TEST */