2005-10-05 15:23:51 +00:00
|
|
|
my_getopt - a command-line argument parser
|
|
|
|
Copyright 1997-2002, Benjamin Sittler
|
|
|
|
|
|
|
|
The author can be reached by sending email to <bsittler@iname.com>.
|
|
|
|
|
|
|
|
The version of my_getopt in this package (1.4) has a BSD-like license;
|
|
|
|
see the file LICENSE for details. Version 1.0 of my_getopt was similar
|
|
|
|
to the GPL'ed version of my_getopt included with SMOKE-16 Version 1,
|
|
|
|
Release 19990717. SMOKE-16 packages are available from:
|
|
|
|
|
|
|
|
http://geocities.com/bsittler/#smoke16
|
|
|
|
|
|
|
|
OVERVIEW OF THE ARGUMENT PARSER
|
|
|
|
===============================
|
|
|
|
|
|
|
|
The getopt(), getopt_long() and getopt_long_only() functions parse
|
|
|
|
command line arguments. The argc and argv parameters passed to these
|
|
|
|
functions correspond to the argument count and argument list passed to
|
|
|
|
your program's main() function at program start-up. Element 0 of the
|
|
|
|
argument list conventionally contains the name of your program. Any
|
|
|
|
remaining arguments starting with "-" (except for "-" or "--" by
|
|
|
|
themselves) are option arguments, some of include option values. This
|
|
|
|
family of getopt() functions allows intermixed option and non-option
|
|
|
|
arguments anywhere in the argument list, except that "--" by itself
|
|
|
|
causes the remaining elements of the argument list to be treated as
|
|
|
|
non-option arguments.
|
|
|
|
|
|
|
|
[ See the parts of this document labeled "DOCUMENTATION" and
|
|
|
|
"WHY RE-INVENT THE WHEEL?" for a more information. ]
|
|
|
|
|
|
|
|
FILES
|
|
|
|
=====
|
|
|
|
|
|
|
|
The following four files constitute the my_getopt package:
|
|
|
|
|
|
|
|
LICENSE - license and warranty information for my_getopt
|
|
|
|
my_getopt.c - implementation of my getopt replacement
|
|
|
|
my_getopt.h - interface for my getopt replacement
|
|
|
|
getopt.h - a header file to make my getopt look like GNU getopt
|
|
|
|
|
|
|
|
USAGE
|
|
|
|
=====
|
|
|
|
|
|
|
|
To use my_getopt in your application, include the following line to
|
|
|
|
your main program source:
|
|
|
|
|
|
|
|
#include "getopt.h"
|
|
|
|
|
|
|
|
This line should appear after your standard system header files to
|
|
|
|
avoid conflicting with your system's built-in getopt.
|
|
|
|
|
|
|
|
Then compile my_getopt.c into my_getopt.o, and link my_getopt.o into
|
|
|
|
your application:
|
|
|
|
|
|
|
|
$ cc -c my_getopt.c
|
|
|
|
$ ld -o app app.o ... my_getopt.o
|
|
|
|
|
|
|
|
To avoid conflicting with standard library functions, the function
|
|
|
|
names and global variables used by my_getopt all begin with `my_'. To
|
|
|
|
ensure compatibility with existing C programs, the `getopt.h' header
|
|
|
|
file uses the C preprocessor to redefine names like getopt, optarg,
|
|
|
|
optind, and so forth to my_getopt, my_optarg, my_optind, etc.
|
|
|
|
|
|
|
|
SAMPLE PROGRAM
|
|
|
|
==============
|
|
|
|
|
|
|
|
There is also a public-domain sample program:
|
|
|
|
|
|
|
|
main.c - main() for a sample program using my_getopt
|
|
|
|
Makefile - build script for the sample program (called `copy')
|
|
|
|
|
|
|
|
To build and test the sample program:
|
|
|
|
|
|
|
|
$ make
|
|
|
|
$ ./copy -help
|
|
|
|
$ ./copy -version
|
|
|
|
|
|
|
|
The sample program bears a slight resemblance to the UNIX `cat'
|
|
|
|
utility, but can be used rot13-encode streams, and can redirect output
|
|
|
|
to a file.
|
|
|
|
|
|
|
|
DOCUMENTATION
|
|
|
|
=============
|
|
|
|
|
|
|
|
There is not yet any real documentation for my_getopt. For the moment,
|
|
|
|
use the Linux manual page for getopt. It has its own copyright and
|
|
|
|
license; view the file `getopt.3' in a text editor for more details.
|
|
|
|
|
|
|
|
getopt.3 - the manual page for GNU getopt
|
|
|
|
getopt.txt - preformatted copy of the manual page for GNU getopt,
|
|
|
|
for your convenience
|
|
|
|
|
|
|
|
WHY RE-INVENT THE WHEEL?
|
|
|
|
========================
|
|
|
|
|
|
|
|
I re-implemented getopt, getopt_long, and getopt_long_only because
|
2018-04-14 17:38:34 +00:00
|
|
|
there were noticeable bugs in several versions of the GNU
|
2005-10-05 15:23:51 +00:00
|
|
|
implementations, and because the GNU versions aren't always available
|
|
|
|
on some systems (*BSD, for example.) Other systems don't include any
|
|
|
|
sort of standard argument parser (Win32 with Microsoft tools, for
|
|
|
|
example, has no getopt.)
|
|
|
|
|
|
|
|
These should do all the expected Unix- and GNU-style argument
|
2018-04-14 17:38:34 +00:00
|
|
|
parsing, including permutation, bunching, long options with single or
|
2005-10-05 15:23:51 +00:00
|
|
|
double dashes (double dashes are required if you use
|
|
|
|
my_getopt_long,) and optional arguments for both long and short
|
|
|
|
options. A word with double dashes all by themselves halts argument
|
|
|
|
parsing. A required long option argument can be in the same word as
|
|
|
|
the option name, separated by '=', or in the next word. An optional
|
|
|
|
long option argument must be in the same word as the option name,
|
|
|
|
separated by '='.
|
|
|
|
|
|
|
|
As with the GNU versions, a '+' prefix to the short option
|
|
|
|
specification (or the POSIXLY_CORRECT environment variable) disables
|
2018-04-14 17:38:34 +00:00
|
|
|
permutation, a '-' prefix to the short option specification returns 1
|
2005-10-05 15:23:51 +00:00
|
|
|
for non-options, ':' after a short option indicates a required
|
|
|
|
argument, and '::' after a short option specification indicates an
|
|
|
|
optional argument (which must appear in the same word.) If you'd like
|
2018-04-14 17:38:34 +00:00
|
|
|
to receive ':' instead of '?' for missing option arguments, prefix the
|
2005-10-05 15:23:51 +00:00
|
|
|
short option specification with ':'.
|
|
|
|
|
|
|
|
The original intent was to re-implement the documented behavior of
|
|
|
|
the GNU versions, but I have found it necessary to emulate some of
|
|
|
|
the undocumented behavior as well. Some programs depend on it.
|
|
|
|
|
|
|
|
KNOWN BUGS
|
|
|
|
==========
|
|
|
|
|
|
|
|
The GNU versions support POSIX-style -W "name=value" long
|
|
|
|
options. Currently, my_getopt does not support these, because I
|
|
|
|
don't have any documentation on them (other than the fact that they
|
|
|
|
are enabled by "W;" in the short option specification.) As a
|
|
|
|
temporary workaround, my_getopt treats "W;" in the short option
|
|
|
|
string identically to "W:".
|
|
|
|
|
|
|
|
The GNU versions support internationalized/localized
|
|
|
|
messages. Currently, my_getopt does not.
|
|
|
|
|
|
|
|
There should be re-entrant versions of all these functions so that
|
|
|
|
multiple threads can parse arguments simultaneously.
|