root/lib/getopt1.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. getopt_long
  2. _getopt_long_r
  3. getopt_long_only
  4. _getopt_long_only_r
  5. main

     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 */

/* [<][>][^][v][top][bottom][index][help] */