Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Library for parsing arguments GNU-style? [closed]

I've noticed the basic 'style' of most GNU core applications whereby arguments are:

  • --longoption
  • --longoption=value or --longoption value
  • -abcdefg (multiple options)
  • -iuwww-data (option i, u = www-data)

They follow the above style. I want to avoid writing an argument parser if there's a library that does this using the above style. Is there one you know of?

like image 623
Delan Azabani Avatar asked May 26 '10 14:05

Delan Azabani


People also ask

What library is Getopt in C?

getopt is a C library function used to parse command-line options of the Unix/POSIX style. It is a part of the POSIX specification, and is universal to Unix-like systems. It is also the name of a Unix program for parsing command line arguments in shell scripts.

What is argv [] in C?

The argv argument is a vector of C strings; its elements are the individual command line argument strings. The file name of the program being run is also included in the vector as the first element; the value of argc counts this element.

What way can you define the options of option argument?

Option arguments are information needed by an option, as opposed to regular operand arguments. For example, the fgrep program's -f option means "use the contents of the following file as a list of strings to search for." See Figure 2.1.


1 Answers

getopt_long will do the job, here is an example from http://www.gnu.org/s/libc/manual/html_node/Getopt-Long-Option-Example.html

 #include <stdio.h>
 #include <stdlib.h>
 #include <getopt.h>

 /* Flag set by ‘--verbose’. */
 static int verbose_flag;

 int
 main (argc, argv)
      int argc;
      char **argv;
 {
   int c;

   while (1)
     {
       static struct option long_options[] =
         {
           /* These options set a flag. */
           {"verbose", no_argument,       &verbose_flag, 1},
           {"brief",   no_argument,       &verbose_flag, 0},
           /* These options don't set a flag.
              We distinguish them by their indices. */
           {"add",     no_argument,       0, 'a'},
           {"append",  no_argument,       0, 'b'},
           {"delete",  required_argument, 0, 'd'},
           {"create",  required_argument, 0, 'c'},
           {"file",    required_argument, 0, 'f'},
           {0, 0, 0, 0}
         };
       /* getopt_long stores the option index here. */
       int option_index = 0;

       c = getopt_long (argc, argv, "abc:d:f:",
                        long_options, &option_index);

       /* Detect the end of the options. */
       if (c == -1)
         break;

       switch (c)
         {
         case 0:
           /* If this option set a flag, do nothing else now. */
           if (long_options[option_index].flag != 0)
             break;
           printf ("option %s", long_options[option_index].name);
           if (optarg)
             printf (" with arg %s", optarg);
           printf ("\n");
           break;

         case 'a':
           puts ("option -a\n");
           break;

         case 'b':
           puts ("option -b\n");
           break;

         case 'c':
           printf ("option -c with value `%s'\n", optarg);
           break;

         case 'd':
           printf ("option -d with value `%s'\n", optarg);
           break;

         case 'f':
           printf ("option -f with value `%s'\n", optarg);
           break;

         case '?':
           /* getopt_long already printed an error message. */
           break;

         default:
           abort ();
         }
     }

   /* Instead of reporting ‘--verbose’
      and ‘--brief’ as they are encountered,
      we report the final status resulting from them. */
   if (verbose_flag)
     puts ("verbose flag is set");

   /* Print any remaining command line arguments (not options). */
   if (optind < argc)
     {
       printf ("non-option ARGV-elements: ");
       while (optind < argc)
         printf ("%s ", argv[optind++]);
       putchar ('\n');
     }

   exit (0);
 }
like image 57
ZelluX Avatar answered Oct 05 '22 08:10

ZelluX