blob: e2991eec663b548d7133ef364acee34063c89a60 [file] [log] [blame]
<html lang="en">
<head>
<title>Argp Example 3 - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Argp-Examples.html#Argp-Examples" title="Argp Examples">
<link rel="prev" href="Argp-Example-2.html#Argp-Example-2" title="Argp Example 2">
<link rel="next" href="Argp-Example-4.html#Argp-Example-4" title="Argp Example 4">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Argp-Example-3"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Argp-Example-4.html#Argp-Example-4">Argp Example 4</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Argp-Example-2.html#Argp-Example-2">Argp Example 2</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Argp-Examples.html#Argp-Examples">Argp Examples</a>
<hr>
</div>
<h5 class="subsubsection">25.3.11.3 A Program Using Argp with User Options</h5>
<p>This program uses the same features as example 2, adding user options
and arguments.
<p>We now use the first four fields in <code>argp</code> (see <a href="Argp-Parsers.html#Argp-Parsers">Argp Parsers</a>)
and specify <code>parse_opt</code> as the parser function. See <a href="Argp-Parser-Functions.html#Argp-Parser-Functions">Argp Parser Functions</a>.
<p>Note that in this example, <code>main</code> uses a structure to communicate
with the <code>parse_opt</code> function, a pointer to which it passes in the
<code>input</code> argument to <code>argp_parse</code>. See <a href="Argp.html#Argp">Argp</a>. It is retrieved
by <code>parse_opt</code> through the <code>input</code> field in its <code>state</code>
argument. See <a href="Argp-Parsing-State.html#Argp-Parsing-State">Argp Parsing State</a>. Of course, it's also possible to
use global variables instead, but using a structure like this is
somewhat more flexible and clean.
<pre class="smallexample"> /* <span class="roman">Argp example #3 -- a program with options and arguments using argp</span> */
/* <span class="roman">This program uses the same features as example 2, and uses options and
arguments.
We now use the first four fields in ARGP, so here's a description of them:
OPTIONS -- A pointer to a vector of struct argp_option (see below)
PARSER -- A function to parse a single option, called by argp
ARGS_DOC -- A string describing how the non-option arguments should look
DOC -- A descriptive string about this program; if it contains a
vertical tab character (\v), the part after it will be
printed *following* the options
The function PARSER takes the following arguments:
KEY -- An integer specifying which option this is (taken
from the KEY field in each struct argp_option), or
a special key specifying something else; the only
special keys we use here are ARGP_KEY_ARG, meaning
a non-option argument, and ARGP_KEY_END, meaning
that all arguments have been parsed
ARG -- For an option KEY, the string value of its
argument, or NULL if it has none
STATE-- A pointer to a struct argp_state, containing
various useful information about the parsing state; used here
are the INPUT field, which reflects the INPUT argument to
argp_parse, and the ARG_NUM field, which is the number of the
current non-option argument being parsed
It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the
given KEY wasn't recognized, or an errno value indicating some other
error.
Note that in this example, main uses a structure to communicate with the
parse_opt function, a pointer to which it passes in the INPUT argument to
argp_parse. Of course, it's also possible to use global variables
instead, but this is somewhat more flexible.
The OPTIONS field contains a pointer to a vector of struct argp_option's;
that structure has the following fields (if you assign your option
structures using array initialization like this example, unspecified
fields will be defaulted to 0, and need not be specified):
NAME -- The name of this option's long option (may be zero)
KEY -- The KEY to pass to the PARSER function when parsing this option,
*and* the name of this option's short option, if it is a
printable ascii character
ARG -- The name of this option's argument, if any
FLAGS -- Flags describing this option; some of them are:
OPTION_ARG_OPTIONAL -- The argument to this option is optional
OPTION_ALIAS -- This option is an alias for the
previous option
OPTION_HIDDEN -- Don't show this option in --help output
DOC -- A documentation string for this option, shown in --help output
An options vector should be terminated by an option with all fields zero.</span> */
#include &lt;argp.h&gt;
const char *argp_program_version =
"argp-ex3 1.0";
const char *argp_program_bug_address =
"&lt;bug-gnu-utils@gnu.org&gt;";
/* <span class="roman">Program documentation.</span> */
static char doc[] =
"Argp example #3 -- a program with options and arguments using argp";
/* <span class="roman">A description of the arguments we accept.</span> */
static char args_doc[] = "ARG1 ARG2";
/* <span class="roman">The options we understand.</span> */
static struct argp_option options[] = {
{"verbose", 'v', 0, 0, "Produce verbose output" },
{"quiet", 'q', 0, 0, "Don't produce any output" },
{"silent", 's', 0, OPTION_ALIAS },
{"output", 'o', "FILE", 0,
"Output to FILE instead of standard output" },
{ 0 }
};
/* <span class="roman">Used by </span><code>main</code><span class="roman"> to communicate with </span><code>parse_opt</code><span class="roman">.</span> */
struct arguments
{
char *args[2]; /* <var>arg1</var><span class="roman"> &amp; </span><var>arg2</var> */
int silent, verbose;
char *output_file;
};
/* <span class="roman">Parse a single option.</span> */
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
{
/* <span class="roman">Get the </span><var>input</var><span class="roman"> argument from </span><code>argp_parse</code><span class="roman">, which we
know is a pointer to our arguments structure.</span> */
struct arguments *arguments = state-&gt;input;
switch (key)
{
case 'q': case 's':
arguments-&gt;silent = 1;
break;
case 'v':
arguments-&gt;verbose = 1;
break;
case 'o':
arguments-&gt;output_file = arg;
break;
case ARGP_KEY_ARG:
if (state-&gt;arg_num &gt;= 2)
/* <span class="roman">Too many arguments.</span> */
argp_usage (state);
arguments-&gt;args[state-&gt;arg_num] = arg;
break;
case ARGP_KEY_END:
if (state-&gt;arg_num &lt; 2)
/* <span class="roman">Not enough arguments.</span> */
argp_usage (state);
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
/* <span class="roman">Our argp parser.</span> */
static struct argp argp = { options, parse_opt, args_doc, doc };
int main (int argc, char **argv)
{
struct arguments arguments;
/* <span class="roman">Default values.</span> */
arguments.silent = 0;
arguments.verbose = 0;
arguments.output_file = "-";
/* <span class="roman">Parse our arguments; every option seen by </span><code>parse_opt</code><span class="roman"> will
be reflected in </span><code>arguments</code><span class="roman">.</span> */
argp_parse (&amp;argp, argc, argv, 0, 0, &amp;arguments);
printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n"
"VERBOSE = %s\nSILENT = %s\n",
arguments.args[0], arguments.args[1],
arguments.output_file,
arguments.verbose ? "yes" : "no",
arguments.silent ? "yes" : "no");
exit (0);
}
</pre>
</body></html>