For Programmers: Free Programming Magazines  


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" <minder_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" <minder_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


Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com