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