1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* getopt_long and getopt_long_only entry points for GNU getopt. 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 1987-1994, 1996-1998, 2004, 2006, 2009-2012 Free Software 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Foundation, Inc. 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This file is part of the GNU C Library. 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is free software: you can redistribute it and/or modify 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it under the terms of the GNU General Public License as published by 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation; either version 3 of the License, or 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang (at your option) any later version. 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is distributed in the hope that it will be useful, 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU General Public License for more details. 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang You should have received a copy of the GNU General Public License 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef _LIBC 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <getopt.h> 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <config.h> 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "getopt.h" 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getopt_int.h" 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h> 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This needs to come after some library #include 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project to get __GNU_LIBRARY__ defined. */ 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef __GNU_LIBRARY__ 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h> 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef NULL 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define NULL 0 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgetopt_long (int argc, char *__getopt_argv_const *argv, const char *options, 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang const struct option *long_options, int *opt_index) 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return _getopt_internal (argc, (char **) argv, options, long_options, 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang opt_index, 0, 0); 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_getopt_long_r (int argc, char **argv, const char *options, 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang const struct option *long_options, int *opt_index, 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang struct _getopt_data *d) 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return _getopt_internal_r (argc, argv, options, long_options, opt_index, 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 0, d, 0); 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Like getopt_long, but '-' as well as '--' can indicate a long option. 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project If an option that starts with '-' (not '--') doesn't match a long option, 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but does match a short option, it is parsed as a short option 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project instead. */ 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgetopt_long_only (int argc, char *__getopt_argv_const *argv, 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *options, 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang const struct option *long_options, int *opt_index) 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return _getopt_internal (argc, (char **) argv, options, long_options, 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang opt_index, 1, 0); 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_getopt_long_only_r (int argc, char **argv, const char *options, 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang const struct option *long_options, int *opt_index, 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang struct _getopt_data *d) 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return _getopt_internal_r (argc, argv, options, long_options, opt_index, 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1, d, 0); 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef TEST 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h> 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (int argc, char **argv) 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int c; 88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int digit_optind = 0; 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (1) 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int this_option_optind = optind ? optind : 1; 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int option_index = 0; 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang static const struct option long_options[] = 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang {"add", 1, 0, 0}, 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang {"append", 0, 0, 0}, 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang {"delete", 1, 0, 0}, 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang {"verbose", 0, 0, 0}, 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang {"create", 0, 0, 0}, 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang {"file", 1, 0, 0}, 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang {0, 0, 0, 0} 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project }; 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project c = getopt_long (argc, argv, "abc:d:0123456789", 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang long_options, &option_index); 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (c == -1) 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project switch (c) 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang case 0: 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("option %s", long_options[option_index].name); 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (optarg) 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf (" with arg %s", optarg); 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("\n"); 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '0': 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '1': 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '2': 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '3': 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '4': 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '5': 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '6': 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '7': 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '8': 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '9': 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (digit_optind != 0 && digit_optind != this_option_optind) 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("digits occur in two different argv-elements.\n"); 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang digit_optind = this_option_optind; 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("option %c\n", c); 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang case 'a': 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("option a\n"); 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang case 'b': 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("option b\n"); 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang case 'c': 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("option c with value '%s'\n", optarg); 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang case 'd': 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("option d with value '%s'\n", optarg); 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '?': 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang break; 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang default: 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("?? getopt returned character code 0%o ??\n", c); 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (optind < argc) 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project printf ("non-option ARGV-elements: "); 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (optind < argc) 16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang printf ("%s ", argv[optind++]); 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project printf ("\n"); 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project exit (0); 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* TEST */ 171