Home > Archive > Unix Programming > April 2005 > Shouldn't getopt_long() return ':' for options requiring an argument?
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
Shouldn't getopt_long() return ':' for options requiring an argument?
|
|
| Eric Lilja 2005-04-24, 8:57 pm |
| Hello, consider this C program and its accompanying test script:
#include <stdio.h>
#include <getopt.h>
static void handle_args(int, char **);
int
main(int argc, char **argv)
{
handle_args(argc, argv);
return 0;
}
#define REQUIRES_ARGUMENT 1
static void
handle_args(int argc, char **argv)
{
const struct option long_options[] =
{
{"option_with_argument", REQUIRES_ARGUMENT, NULL, 0},
{NULL, 0, NULL, 0},
};
const char *short_options = "";
int c = 0;
while((c = getopt_long(argc, argv, short_options, long_options, NULL))
!= -1)
{
switch(c)
{
case ':':
{
printf("Missing parameter.\n");
break;
}
case '?':
{
printf("Unknown option.\n");
break;
}
}
}
}
#!/bin/bash
echo "Testing with parameter --option_with_argument=4711"
../getopt_long_problem --option_with_argument=4711
echo -e "\nTesting with parameter --option_with_argument"
../getopt_long_problem --option_with_argument
echo -e "\nTesting with parameter --unknown_option"
../getopt_long_problem --unknown_option
The output when I run the script is:
$ ./probtest.sh
Testing with parameter --option_with_argument=4711
Testing with parameter --option_with_argument
getopt_long_problem: option requires an argument -- option_with_argument
Unknown option.
Testing with parameter --unknown_option
getopt_long_problem: unknown option -- unknown_option
Unknown option.
As you can see, getopt_long() returns '?' for the case where the option
requires arguments and none was supplied, I was under the impression that it
should return ':' for that case and '?' for unknown options (it prints the
correct diagnostic, though). Is this a bug in the implementation of
getopt_long() on my system or are there simply different valid variants of
the implementation?
/ Mikael
| |
| Eric Lilja 2005-04-24, 8:57 pm |
|
"Måns Rullgård" <mru@inprovide.com> wrote:
> "Eric Lilja" <mind er_thisshouldberemoved@gmail.com> writes:
>
>
> [...]
>
>
> man 3 getopt:
>
> If the first character (following any optional '+'or '-'
> described
> above) of optstring is a colon (':'), then getopt() returns ':'
> instead
> of '?' to indicate a missing option argument.
>
Hmm, I must be daft or something, but does that mean that getopt_long() only
returns ':' if the user had supplied --:option_with_argument on the command
line?
> --
> Måns Rullgård
> mru@inprovide.com
/ E
| |
| Eric Lilja 2005-04-24, 8:57 pm |
|
"Måns Rullgård" <mru@inprovide.com> wrote:
> "Eric Lilja" <mind er_thisshouldberemoved@gmail.com> writes:
>
>
> It means the string passed to getopt() (short_options in your example)
> should start with a colon.
>
Thank you, Måns, changing short_options from "" to ":" seems to work, then
'?' is returned for unknown options and ':' is returned for options that
require a value but none was supplied. Does this change to short_options
alter the behaviour in any other way?
/ E
|
|
|
|
|