Imported libargv version 2.4.0.

This commit is contained in:
Peter Simons 2000-12-13 15:37:35 +00:00
parent 5ad045c241
commit b9c9b4eb68
11 changed files with 3541 additions and 1246 deletions

View File

@ -1,67 +0,0 @@
#
# libargv Makefile
#
# $Header$
#
# Make Rules:
# ===========
#
.c.o:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
# Compiler Flags:
# ===============
#
CFLAGS = -Wall -ansi -pedantic
CPPFLAGS=
#
# Labels:
# =======
#
SRCS = argv.c
OBJS = $(SRCS:.c=.o)
MANFILES= $(SRCS:.c=.3)
#
# Targets
#
.PHONY: all clean realclean distclean man depend
all: libargv.a
test: test.o libargv.a
$(CC) test.o libargv.a -o test
clean:
rm -f test libargv.a *.o *.3 *.core
realclean: clean
distclean: realclean
man:
depend:
makedepend -Y /usr/include $(SRCS)
@rm -f Makefile.bak
#
# Actions
#
libargv.a: $(OBJS)
rm -f $@
$(AR) cr $@ $(OBJS)
$(RANLIB) $@
#
# Dependencies
#
argv.o: _argv.h argv.h

View File

@ -1,11 +0,0 @@
#
# libargv
#
# $Id$
#
./libargv.a: ./argv.o
$(AR) cr $@ ./argv.o
$(RANLIB) $@
./argv.o: ./argv.c ./_argv.h ./argv.h

115
libargv/NEWS Normal file
View File

@ -0,0 +1,115 @@
-------------------------------------------------------------------------------
$Id$
-------------------------------------------------------------------------------
Version 2.4.0:
* Migrated the web support functions out to argv_web.[ch].
* Made a number of general code cleaning, format updating improvements.
* Added argv_value_string function to convert a variable into string.
* Added support for negative numbers.
Version 2.3.1:
* Added ARGV_FLAG_MAND which is used to set any option as mandatory.
* Renamed ARGV_ARRAY to be ARGV_FLAG_ARRAY.
* Fixed --argv-file to handle non close arguments.
* We now allow mandatory boolean args.
* Added ARGV_SIZE and ARGV_U_SIZE and renumbered the types.
* Updated the docs a tad.
* Renamed ARGV_CHARP to ARGV_CHAR_P.
Version 2.3.0:
* Renamed aa_entryn aa_entry_n.
* Added new ARGV_SIZE type to handle 10k and 15m.
* Added other enable/disable forms: yes/no, on/off, 1/0.
* Added lasttog env setting to have -- toggle last-arg on/off.
Version 2.2.0:
* Added --argv-file functionality.
* Improved usage message handing.
* Added argv_interactive flag which will exit on errors.
* Added argv_error_stream which can be set to FILE * were errors go.
* Removed some unresolved references: strcasecmp, strdup.
* Fixed some porting problems to Unixware. Unsigned chars.
* Improved the non-interactive workings of the library.
Version 2.0.2:
* CHARP types now strdup'd and then freed.
* Added BOOL_ARG for a variable which expects a yes or no.
* Added U_INT and U_LONG arg variable types.
* Re-added --usage-all for printing all the available options.
* Added web argument processing of environmental variables.
Version 2.0.1:
* Fixed a bug with XOR processing.
* Added ARGV_INCR variable type which increments variable.
* Improved some of the configuration for strings, etc.
* Added displaying of type and value with --argv-display.
Version 2.0.0:
* Added some new/better sections to the manual.
* Added new --argv-display routine to dump argument values.
* argv_shell initial version working for shell scripts.
* Added argv_was_used() call using the in structure used flag.
* Added better mechanisms for const definition.
* Finally added the env variable processing for GLOBAL_ARGV.
Version 1.2.2:
* Inlined version.h into argv.h
* Added new configure cc-ansi macro.
Version 1.2.1:
* Updated the manual a bit.
* Fixed problems with STDC arguments.
* Simplified the including of argv files into other modules.
* Merged in most external files into argv.c, argv.h, argv_loc.h
Version 1.2.0:
* minor fixes
Version 1.1.9:
* added argv_copy_args()
* added argv_argv and argv_argc global variables
* removed argv_zero
Version 1.1.8:
* More compatibility functions added.
Version 1.1.7:
* Added the ability to take NULL arg arrays.
Version 1.1.6:
* Worked on manual README and other notes files.
* Added ARGV_XOR functionality.
* Added -D=5 functionality.
* Removed LGPL copyright and put in its place fully free notices.
Version 1.1.5:
* Added ARGV_BOOL_NEG for booleans that get set to false if used.
* Added lots of files and configuration scripts.
* Added ARGV_MAYBE and probably some creepy crawlies.
Version 1.1.3:
* Removed ARGV_MORE and ARGV_PROCESS and argv_process now returns void.
* Fixed up default printing of long special-options.
Version 1.1.2:
* Added short-option help.
* Added array processing. Moved arg_t -> argv_t.
* Finally complete de-local'izing the code.

18
libargv/SMakefile Normal file
View File

@ -0,0 +1,18 @@
#
# Skeleton Makefile -- process with smake to create real Makefile.
#
# $Header$
#
.opt -o GNUmakefile.in
LIBRARY = argv
SRCS = argv.c
.include <library.smk>
.include <autoconf.base.smk>
test: test.o libargv.a
$(CC) $(LDFLAGS) -o $@ $^
clean-local::
rm -f test test.o

File diff suppressed because it is too large Load Diff

View File

@ -1,90 +1,398 @@
/*
* $Source$
* $Revision$
* $Date$
* $Source$
* $Revision$
* $Date$
*
* Copyright (C) 1995 by Gray Watson <gray.watson@letters.com>
* Copyright (c) 1999 by Gray Watson <gray.watson@letters.com>.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software for
* any purpose and without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies, and that the name of Gray Watson not be used in advertising
* or publicity pertaining to distribution of the document or software
* without specific, written prior permission.
*
* Gray Watson makes no representations about the suitability of the
* software described herein for any purpose. It is provided "as is"
* without express or implied warranty.
*/
#ifndef __LIB_ARGV_H__
#define __LIB_ARGV_H__ 1
#include <stdio.h>
/********** Prototypes **********/
#define ARGV_PNT void *
typedef struct {
char ar_short_arg; /* the char of the arg, 'd' if '-d' */
char *ar_long_arg; /* long version of arg, 'delete' */
short ar_type; /* type of option, see values below */
ARGV_PNT ar_variable; /* address of variable that is arg */
char *ar_var_label; /* label for variable descriptions */
char *ar_comment; /* comment for usage message */
} argv_t;
typedef struct {
int aa_entryn; /* number of elements in aa_entrees */
ARGV_PNT aa_entries; /* entry list specified */
} argv_array_t;
#define ARGV_ARRAY_COUNT(array) ((array).aa_entryn)
#define ARGV_ARRAY_ENTRY(array, type, which) \
(((type *)(array).aa_entries)[which])
#define ARGV_LAST ((char)255)
#define ARGV_MAND ((char)254)
#define ARGV_MAYBE ((char)253)
#define ARGV_OR ((char)252)
#define ARGV_ONE_OF ((char)251)
#define ARGV_XOR ((char)251)
#define ARGV_BOOL 1 /* boolean type, sets to ARGV_TRUE */
#define ARGV_BOOL_NEG 2 /* like bool but sets to ARGV_FALSE */
#define ARGV_BOOL_ARG 3 /* like bool but takes a yes/no arg */
#define ARGV_CHAR 4 /* single character */
#define ARGV_CHARP 5 /* same as STRING */
#define ARGV_STRING 5 /* character string */
#define ARGV_FLOAT 6 /* floating pointer number */
#define ARGV_SHORT 7 /* integer number */
#define ARGV_INT 8 /* integer number */
#define ARGV_U_INT 9 /* unsigned integer number */
#define ARGV_LONG 10 /* long integer number */
#define ARGV_U_LONG 11 /* unsinged long integer number */
#define ARGV_BIN 12 /* binary number (0s and 1s) */
#define ARGV_OCT 13 /* octal number, (base 8) */
#define ARGV_HEX 14 /* hexadecimal number, (base 16) */
#define ARGV_INCR 15 /* int arg which gets ++ each time */
#define ARGV_TYPE(t) ((t) & 0x3F) /* strip off all but the var type */
#define ARGV_ARRAY (1 << 14) /* OR with type to indicate array */
#define ARGV_USAGE_SHORT 1 /* print short usage messages */
#define ARGV_USAGE_LONG 2 /* print long-format usage messages */
#define ARGV_USAGE_DEFAULT 3 /* default usage messages */
#define ARGV_FALSE 0
#define ARGV_TRUE 1
#ifndef __ARGV_H__
#define __ARGV_H__
#ifdef __cplusplus
extern "C" {
#endif
extern char argv_program[/* PROGRAM_NAME + 1 */];
extern char **argv_argv;
extern int argv_argc;
extern char *argv_help_string;
extern char *argv_version_string;
extern char argv_interactive;
extern FILE *argv_error_stream;
extern int argv_process(argv_t *args, const int argc, char **argv);
extern int argv_web_process_string(argv_t *args, const char *arg0,
const char *string,
const char *delim);
extern int argv_web_process(argv_t *args, const char *arg0);
extern int argv_usage(const argv_t *args, const int which);
extern int argv_was_used(const argv_t *args, const char arg);
extern void argv_cleanup(const argv_t *args);
extern int argv_copy_args(char *buf, const int max_size);
/*
* Version string for the library
*
* NOTE to gray: whenever this is changed, corresponding Changlog and
* NEWS entries *must* be entered and 2 entries in argv.texi must be
* updated.
*
* ARGV LIBRARY VERSION -- 2.4.0
*/
/*
* Generic and standardized argument processor. You describe the arguments
* that you are looking for along with their types and these routines do the
* work to convert them into values.
*
* These routines also provide standardized error and usage messages as well
* as good usage documentation and long and short options.
*/
#include <stdio.h> /* have to for FILE * below */
/* this defines what type the standard void memory-pointer is */
typedef void * ARGV_PNT;
/*
* argument information structure. this specifies the allowable options
* and some information about each one.
*
* { 'O', "optimize", ARGV_BOOL, &optimize, NULL, "turn on optimization" }
* { 'c', "config", ARGV_CHAR_P, &config, "file", "configuration file" }
*/
typedef struct {
char ar_short_arg; /* the char of the arg, 'd' if '-d' */
char *ar_long_arg; /* long version of arg, 'delete' */
unsigned int ar_type; /* type of option, see values below */
ARGV_PNT ar_variable; /* address of variable that is arg */
char *ar_var_label; /* label for variable descriptions */
char *ar_comment; /* comment for usage message */
} argv_t;
/*
* argument array type. when ARGV_ARRAY is |'d with the ar_type in the above
* structure then multiple instances of the option are allowed and each
* instance is stored into the following structure that MUST be in ar_variable
* in the above arg_t structure.
* NOTE: after the arguments have been processed, if aa_entryn is > 0 then
* aa_entries needs to be free'd by user. argv_cleanup() can be used for this
*/
typedef struct {
int aa_entry_n; /* number of elements in aa_entrees */
ARGV_PNT aa_entries; /* entry list specified */
} argv_array_t;
/* extract the count of the elements from an argv ARRAY */
#define ARGV_ARRAY_COUNT(array) ((array).aa_entry_n)
/* extract WHICH entry of TYPE from an argv ARRAY */
#define ARGV_ARRAY_ENTRY(array, type, which) \
(((type *)(array).aa_entries)[which])
/* extract a pointer to WHICH entry of TYPE from an argv ARRAY */
#define ARGV_ARRAY_ENTRY_P(array, type, which) \
(((type *)(array).aa_entries) + which)
/* special ar_short_arg value to mark the last entry in the argument array */
#define ARGV_LAST ((char)255)
/*
* special ar_short_arg value to mark mandatory arguments (i.e. arguments that
* *must* be specified. for arguments that are not optional like [-b].
* to have a variable number of mandatory args then make the last MAND
* entry be a ARG_ARRAY type.
*/
#define ARGV_MAND ((char)254)
/*
* special ar_short_arg value to mark that there is the possibility of
* a mandatory argument here if one is specified.
*/
#define ARGV_MAYBE ((char)253)
/*
* special ar_short_arg value to say that the previous and next arguments in
* the list should not be used together.
* {'a'...}, {ARG_OR}, {'b'...}, {ARG_OR}, {'c'...} means
* the user should only specific -a or -b or -c but not 2 or more.
*/
#define ARGV_OR ((char)252)
/*
* special ar_short_arg value that is the same as ARGV_OR but one of the args
* must be used.
* {'a'...}, {ARG_ONE_OF}, {'b'...}, {ARG_ONE_OF}, {'c'...} means
* the user must specify one of -a or -b or -c but not 2 or more.
* ARGV_XOR is there for compatibility with older versions.
*/
#define ARGV_ONE_OF ((char)251)
#define ARGV_XOR ((char)251)
/*
* ar_type values of arg_t
* NOTE: if this list is changed, some defines in argv_loc need to be changed
*/
#define ARGV_BOOL 1 /* boolean type, sets to ARGV_TRUE */
#define ARGV_BOOL_NEG 2 /* like bool but sets to ARGV_FALSE */
#define ARGV_BOOL_ARG 3 /* like bool but takes a yes/no arg */
#define ARGV_CHAR 4 /* single character */
#define ARGV_CHAR_P 5 /* same as STRING */
#define ARGV_SHORT 6 /* short integer number */
#define ARGV_U_SHORT 7 /* unsigned short integer number */
#define ARGV_INT 8 /* integer number */
#define ARGV_U_INT 9 /* unsigned integer number */
#define ARGV_LONG 10 /* long integer number */
#define ARGV_U_LONG 11 /* unsinged long integer number */
#define ARGV_FLOAT 12 /* floating pointer number */
#define ARGV_DOUBLE 13 /* double floating pointer number */
#define ARGV_BIN 14 /* binary number (0s and 1s) */
#define ARGV_OCT 15 /* octal number, (base 8) */
#define ARGV_HEX 16 /* hexadecimal number, (base 16) */
#define ARGV_INCR 17 /* int arg which gets ++ each time */
#define ARGV_SIZE 18 /* long arg which knows mMbBkKgG */
#define ARGV_U_SIZE 19 /* u_long arg which knows mMbBkKgG */
#define ARGV_BOOL_INT 20 /* like bool but takes an integer var*/
#define ARGV_BOOL_INT_NEG 21 /* like bool-neg but with an integer */
#define ARGV_BOOL_INT_ARG 22 /* like bool-arg but with an integer */
#define ARGV_TYPE(t) ((t) & 0x3F) /* strip off all but the var type */
#define ARGV_FLAG_ARRAY (1 << 14) /* OR with type to indicate array */
#define ARGV_FLAG_MAND (1 << 13) /* OR with type to mark mandatory */
/* NOTE: other internal flags defined in argv_loc.h */
/* argv_usage which argument values */
#define ARGV_USAGE_SHORT 1 /* print short usage messages */
#define ARGV_USAGE_LONG 2 /* print long-format usage messages */
#define ARGV_USAGE_DEFAULT 3 /* default usage messages */
/* boolean type settings */
#define ARGV_FALSE 0
#define ARGV_TRUE 1
/*<<<<<<<<<< The below prototypes are auto-generated by fillproto */
/* This is a processed version of argv[0], pre-path removed: /bin/ls -> ls */
extern
char argv_program[/* PROGRAM_NAME + 1 */];
/* A global value of argv from main after argv_process has been called */
extern
char **argv_argv;
/* A global value of argc from main after argv_process has been called */
extern
int argv_argc;
/* This should be set externally to provide general program help to user */
extern
char *argv_help_string;
/* This should be set externally to provide version information to the user */
extern
char *argv_version_string;
/*
* Are we running interactively? This will exit on errors. Set to
* false to return error codes instead.
*/
extern
int argv_interactive;
/*
* The FILE stream that argv out_puts all its errors. Set to NULL to
* not dump any error messages. Default is stderr.
*/
extern
FILE *argv_error_stream;
/*
* int argv_process_no_env
*
* DESCRIPTION:
*
* Process the user arguments with an argv_t structure array. Like
* argv_process_args but without the processing of the argv
* environmental variables.
*
* RETURNS:
*
* Success - 0
*
* Failure - -1
*
* ARGUMENTS:
*
* args - Array of argv_t structures.
*
* arg_c - Number of arguments in the argv array.
*
* argv - Array of character pointers terminated by 0L.
*/
extern
int argv_process_no_env(argv_t *args, const int arg_c, char **argv);
/*
* int argv_process
*
* DESCRIPTION:
*
* Processes a number of arguments depending on the argument array.
* This routine will not modify the argv array in any way.
*
* NOTE: it will modify the args array by setting various flags in the
* type field. returns 0 if no error else -1.
*
* ARGUMENTS:
*
* args - Array of argv_t structures that we are using to process the
* user argument array. If null then an empty array is used.
*
* argc - Number of arguments in the argv argument array.
*
* argv - Array of character pointer arguments terminated by a 0L.
*/
extern
int argv_process(argv_t *args, const int argc, char **argv);
/*
* int argv_usage
*
* DESCRIPTION:
*
* Print the standard usage messages for our argument array. You can
* specify whether you want to see a short or long usage messages.
*
* NOTE: if this is called before argv_process then the program name
* may be invalid.
*
* RETURNS:
*
* Success - 0
*
* Failure - -1
*
* ARGUMENTS:
*
* args - Our argument array to print the usage messages about. If
* null then an empty array is used.
*
* which - Either ARGV_USAGE_SHORT (for short usage messages),
* ARGV_USAGE_LONG (for long usage messages), or ARGV_USAGE_DEFAULT
* (the user's default either long or short).
*/
extern
int argv_usage(const argv_t *args, const int which);
/*
* int argv_was_used
*
* DESCRIPTION:
*
* See if an argument was used in a previous call to argv_process.
*
* RETURNS:
*
* 1 if yes it was used, else 0 if not.
*
* ARGUMENTS:
*
* args - Argument list to search.
*
* short_arg - Short argument to see if it was used.
*/
extern
int argv_was_used(const argv_t *args, const char short_arg);
/*
* int argv_long_was_used
*
* DESCRIPTION:
*
* See if a long argument was used in a previous call to argv_process.
*
* RETURNS:
*
* 1 if yes it was used, else 0 if not.
*
* ARGUMENTS:
*
* args - Argument list to search.
*
* long_arg - Long argument to see if it was used.
*/
extern
int argv_long_was_used(const argv_t *args, const char *long_arg);
/*
* void argv_cleanup
*
* DESCRIPTION:
*
* Frees up any allocations associated with the argument array during
* argv_process. This should be done at the end of the program or
* after all the arguments have been referenced.
*
* RETURNS:
*
* None.
*
* ARGUMENTS:
*
* args - Argument array we are cleaning up.
*/
extern
void argv_cleanup(const argv_t *args);
/*
* int argv_copy_args
*
* DESCRIPTION:
*
* Copy all the arguements (not including the 0th) one after the other
* into the user specified buffer.
*
* NOTE: you can get the 0th argument from argv_argv[0] or
* argv_program.
*
* RETURNS:
*
* Success - 0
*
* Failure - -1
*
* ARGUMENTS:
*
* buf - Buffer to copy all of the user arguments into.
*
* buf_size - Size of the buffer.
*/
extern
int argv_copy_args(char *buf, const int buf_size);
/*
* int argv_value_string
*
* DESCRIPTION:
*
* Convert the value of a RC entry to its string equivalent in the
* buffer provided.
*
* RETURNS:
*
* Length of bytes copied into the buffer.
*
* ARGUMENTS:
*
* argv_entry_p - Pointer to an entry in a argv_t list.
*
* buf - Buffer to convert the value into.
*
* buf_size - Size of the buffer.
*/
extern
int argv_value_string(const argv_t *argv_entry_p, char *buf,
const int buf_size);
/*<<<<<<<<<< This is end of the auto-generated output from fillproto. */
#ifdef __cplusplus
}
#endif
#endif /* !__LIB_ARGV_H__ */
#endif /* ! __ARGV_H__ */

833
libargv/argv.texi Normal file
View File

@ -0,0 +1,833 @@
\input texinfo @c -*-texinfo-*-
@c %**start of header
@setfilename argv.info
@settitle Argv Tutorial
@c %**end of header
@c ================================================================
@c This file has the new style title page commands.
@c Also, it uses `@@include' files instead of `@@input' files.
@c Run using special version of `texinfo.tex'.
@c Also, run `makeinfo' rather than `texinfo-format-buffer'.
@c ================================================================
@c ================================================================
@c $Id$
@c ================================================================
@ifinfo
This file is an introduction to the Argv library which handles the
process of command-line arguments.
Copyright 1992 to 1998 by Gray Watson.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries a copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).
@end ignore
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
chapter entitled ``Copying'' are included exactly as in the original,
and provided that the entire resulting derived work is distributed under
the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that the chapter entitled ``Copying'' may be included in a
translation approved by the author instead of in the original English.
@end ifinfo
@titlepage
@title Argv Library
@subtitle Version 2.4.0
@subtitle October 1998
@author Gray Watson
@page
Copyright 1992 to 1998 by Gray Watson.
Published by Gray Watson
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
chapter entitled ``Copying'' are included exactly as in the original,
and provided that the entire resulting derived work is distributed under
the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that the chapter entitled ``Copying'' may be included in a
translation approved by the author instead of in the original English.
@end titlepage
@node Top, Copying, (dir), (dir)
@top Argv Library
@ifinfo
Version 2.4.0 -- October 1998
@end ifinfo
@cindex introduction
@cindex author
The argv library has been designed to handle the argument processing
needs of most Unix software and to provide a consistent usage framework
for user applications.
The library is reasonably portable having been run successfully on at
least the following operating systems: AIX, BSDI, DG/UX, FreeBSD, HPUX,
Irix, Linux, MS-DOG, NeXT, OSF, Solaris, SunOS, Ultrix, Unixware, and
even Unicos on a Cray Y-MP.
The package includes the library, configuration scripts, shell-script
utility application, test program, and extensive documentation (text,
texi, info, ps). Documentation is available online at URL
@code{http://www.letters.com/argv/}.
The library is available via ftp from @samp{ftp.letters.com} in the
@file{/src/argv} directory. @xref{How To Get}. I can be reached via my
web page @samp{http://www.letters.com/~gray/} with any questions or
feedback. Please include the version number of the library that you are
using as well as your machine and operating system types.
Gray Watson.
@menu
* Copying:: Library copying conditions.
* Overview:: Description of how to use the library.
* Details:: Details about the library's operations.
* General Usage:: Invoking Programs Which Use the Library.
* Plugs:: A couple soapbox comments.
* Index of Concepts:: Index of concepts in the manual.
@ifinfo
* Full Node Listings:: Listing of all the nodes in the manual.
@end ifinfo
@end menu
@node Copying, Overview, Top, Top
@chapter Library Copying Conditions
@cindex copying
@cindex license
@cindex library permissions
@cindex permissions of the library
Copyright 1992 to 1998 by Gray Watson.
Gray Watson makes no representations about the suitability of the
software described herein for any purpose. It is provided ``as is''
without express or implied warranty. The name of Gray Watson cannot be
used in advertising or publicity pertaining to distribution of the
document or software without specific, written prior permission.
Permission to use, copy, modify, and distribute this software for any
purpose and without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies, and
that the name of Gray Watson not be used in advertising or publicity
pertaining to distribution of the document or software without specific,
written prior permission.
Gray Watson makes no representations about the suitability of the
software described herein for any purpose. It is provided "as is"
without express or implied warranty.
@node Overview, Details, Copying, Top
@chapter How to Use the Library
@menu
* Concepts:: General concepts behind the library.
* How To Get:: How to get the library.
* Installation:: How to install the library.
* Getting Started:: Getting started with the library.
@end menu
@node Concepts, How To Get, Overview, Overview
@section The General Concepts Behind the Library
@cindex command line arguments
@cindex unix command line
One thing that almost all Unix executables need to do is process the
@dfn{command line arguments}. Whether this is to enable verbose mode or
specify the files for a utility to work on, code has to be written to
process these user specified options.
@example
int main(int argc, char **argv)
@{
...
@}
@end example
As you must know, the command line arguments in most Unix systems are
passed in as arguments to @code{main()} (seen above). The @code{argc}
integer argument contains the number of arguments specified. The
@code{argv} variable holds the arguments themselves. It can be thought
of as a pointer to a list of character pointers -- or an array of
character pointers.
To get a particular argument from @code{argv}, you use @code{argv[x]}
where @code{x} is an integer whose value is from 0 to @code{argc - 1}.
In most Unix implementations, the zeroth argument is always the name the
program was executed with. For instance, if you typed @samp{./ls -al},
@code{argc} would equal 2 and the value of @code{argv[0]} would be
@samp{"./ls"}. The value for @code{argv[1]} would be @samp{"-al"}.
@cindex getopt
Currently, most programmers either write code on a per program basis to
process arguments or they use the @code{getopt()} routine. Writing
argument processing code for each program results in improper and
inconsistent argument handling. Although better, @code{getopt()} does
not provide the structure needed to ensure conformity in argument
processing and still requires significant code to be written by the
programmer.
The goal for this library was to achieve a standardized way of
processing arguments -- especially in terms of error and usage messages.
Important consideration was also given to reducing the programming time
necessary to enable the functionality.
@node How To Get, Installation, Concepts, Overview
@section How to get the library.
@cindex downloading the library
@cindex getting the source
The newest versions of the argv library are available via anonymous ftp
from @samp{ftp.letters.com} in the @file{/src/argv} directory.
@cindex anonymous ftp
@cindex ftp
To use anonymous ftp, you ftp to the site and when the system prompts
you for a login-id or username you enter @kbd{anonymous}. When it
prompts you for a password you enter your email address. You then can
change-directory (cd) into @file{/src/argv} and get the @file{README}
and @file{argv.tar.gz} files.
The versions in this repository also include such files as a
postscript version of the manual and other large files which may not
have been included in the distribution you received.
@node Installation, Getting Started, How To Get, Overview
@section Installing the Library
@cindex installing the library
@cindex compiling the library
@cindex building the library
@cindex configuring the library
@cindex making the library
To configure, compile, and install the library, follow these steps
carefully.
@enumerate
@cindex configure script
@cindex conf.h file
@item Type @kbd{sh ./configure} to configure the library. You may want
to first examine the @file{config.help} file for some information about
configure. Configure should generate the @file{Makefile} and some
configuration files automatically.
@emph{NOTE}: It seems that some versions of tr (especially from HP-UX)
don't understand @code{tr '[a-z]' '[A-Z]'}. Since configure uses tr
often, you may need to either get GNU's tr (in their textutils package)
or generate the @file{Makefile} and @file{conf.h} files by hand.
@item You may want to examine the @file{Makefile} and @file{conf.h} files
created by configure to make sure it did its job correctly.
@item Typing @kbd{make} should be enough to build @file{libargv.a}
and the @file{argv_shell} utility. If it does not work, please send me
some notes so future users can profit from your experiences.
@cindex ANSI-C compiler
@cindex Deansify.pl script
@emph{NOTE}: The code is pretty dependent on a good ANSI-C compiler. If
the configure script gives the @samp{WARNING} that you do not have an
ANSI-C compiler, you may still be able to add some sort of option to
your compiler to make it ANSI. If there such is an option, please send
it to the author so it can be added to the configure script. Otherwise,
you will have to try @kbd{make noansi}. This will run the
@file{Deansify.pl} perl script on the code which:
@itemize @bullet
@item @emph{WARNING}: modifies the source code in place
@item changes all @code{void *} references to @code{char *}.
@item fixes all functions to remove @code{foo(char * var)} declarations.
@end itemize
If it doesn't work you may have to do Deansify.pl's job by hand.
@item Typing @kbd{make tests} should build the @file{argv_t} test
program. This can be run and given arguments to test the various
library features.
@item Typing @kbd{make install} should install the @file{libargv.a}
library in @file{/usr/local/lib}, the @file{argv_shell} utility in
@file{/usr/local/bin}, and the @file{argv.info} documentation file in
@file{/usr/local/info}.
You may have specified a @samp{--prefix=PATH} option to configure in
which can @samp{/usr/local} will have been replaced with @samp{PATH}.
@end enumerate
See the Getting Started section to get up and running with the library.
@xref{Getting Started}.
@node Getting Started, , Installation, Overview
@section Getting Started with the Library
@cindex quick start
@cindex getting started
@cindex jump start
@cindex how to begin
@cindex where to begin
This section should give you a quick idea on how to get going.
@enumerate
@item Make sure you have the latest version of the library. It is
available via anonymous ftp from @samp{ftp.letters.com} in the
@file{/src/argv} directory. @xref{How To Get}.
@item Follow the installation instructions on how to configure and
make and install the library (i.e. type: @kbd{make install}).
@xref{Installation}.
@item Examine the @file{argv_t.c} test program source to see an
example of how to program with the library. After adding the
appropriate @code{argv_t} structure array to your main source file, you
need to compile and link your programs with the library.
@item The first time your program is run, the library makes a number
of checks as to the validity of the argument structures being used. You
may have to note and fix reported problems.
@item Run your program with the @samp{--usage} argument and voila.
@end enumerate
@node Details, General Usage, Overview, Top
@chapter The Library's Operations
@menu
* Argv_t Structure:: The argv_t structure and it's usage.
* Special Short Args:: The special ar_short_arg values.
* Types of Variables:: The different variable types.
* Variable Arrays:: Using arguments which ``absorb'' arrays.
@end menu
@node Argv_t Structure, Special Short Args, Details, Details
@section The argv_t Structure and It's Usage
The argv_t argument structure is as follows:
@example
typedef struct @{
char ar_short_arg; /* short argument */
char *ar_long_arg; /* long argument */
short ar_type; /* type of variable */
void *ar_variable; /* point to variable to set */
char *ar_var_label; /* label for var description */
char *ar_help_label; /* help lable for the arg */
@} argv_t;
@end example
The @code{ar_short_arg} element contains the character value of the
short option ('d' for @samp{-d}) or special codes such as ARGV_LAST
which identifies the last element in the array. @xref{Special Short
Args}.
The @code{ar_long_arg} element (if not-NULL) holds the string which is
the long version of @code{ar_short_arg}. For instance, with @samp{-d},
you might have "delete". This would mean that @samp{-d} and
@samp{--delete} would be equivalent. @samp{--} is the long-option
prefix per POSIX specs.
You would define an array of these arguments at the top of the file with
@code{main()} in it.
@example
static char copy = ARGV_FALSE;
static argv_t args[] = @{
@{ 'c', "copy", ARGV_BOOL, &copy, NULL, "copy-files flag" @},
@{ 'g', "group", ARGV_CHAR_P, &group, "group", "name of group to set" @},
...
@{ ARGV_LAST @}
@};
...
int main(int argc, char ** argv)
@{
argv_process(args, argc, argv);
@}
@end example
@node Special Short Args, Types of Variables, Argv_t Structure, Details
@section The Special ar_short_arg Values
There are 3 types of arguments:
@table @dfn
@item optional
Arguments that may or may not be supplied by the user.
@item mandatory
Arguments that must be supplied by the user. For instance grep must be
given an expression on the command line.
If the argument is a mandatory argument which has no -%c prefix then the
@code{ar_short_arg} element should be assigned ARGV_MAND.
@item maybe
Arguments that might be specified by the caller but are not mandatory.
For instance, you can grep a file or you can grep standard-input. The
file should be a maybe argument.
If this is a maybe argument then use ARGV_MAYBE in the
@code{ar_short_arg} field.
@end table
To mark the last entry in the structure list use ARGV_LAST. ARGV_OR
also works.
@node Types of Variables, Variable Arrays, Special Short Args, Details
@section The argv_t Structure and It's Usage
Ar_type holds the type of the argument whether an optional argument or
mandatory. Below are the available values for this field.
@table @code
@item ARGV_BOOL
character type, sets the variable to ARGV_TRUE if used
@item ARGV_BOOL_NEG
like ARGV_BOOL but sets the variable to ARGV_FALSE if used
@item ARGV_BOOL_ARG
like ARGV_BOOL but takes a yes/no argument
@item ARGV_CHAR
a single character
@item ARGV_CHAR_P
a string of characters (character pointer)
@item ARGV_FLOAT
a floating pointer number
@item ARGV_SHORT
a short integer number
@item ARGV_INT
an integer number
@item ARGV_U_INT
an unsigned integer number
@item ARGV_LONG
a long integer number
@item ARGV_U_LONG
an unsigned long integer number
@item ARGV_BIN
a binary base-2 number (0s and 1s)
@item ARGV_OCT
an octal base-8 number (0 to 7)
@item ARGV_HEX
a hexadecimal base-16 number (0 to 9 and A to F)
@item ARGV_INCR
a integer type which is incremented each time it is specified
@item ARGV_SIZE
a long integer size number which understands b for bytes, k for
kilobytes, m for megabytes, and g for gigabytes
@item ARGV_U_SIZE
an unsigned long integer version of ARGV_SIZE
@item ARGV_BOOL_INT
like ARGV_BOOL except the variable is an integer and not a character
@item ARGV_BOOL_INT_NEG
like ARGV_BOOL_NEG except the variable is an integer and not a character
@item ARGV_BOOL_INT_ARG
like ARGV_BOOL_ARG except the variable is an integer and not a character
@end table
For printing out of the type of the argument on the command line, use
the @samp{--argv-display} option which will display the argument, its
type and value. It will display the variables' default values if no
arguments specified before it on the command line otherwise it will show
the values the variables are set to after processing the arguments.
Basically the argument processing routines, examine the type of the
variable, absorb another argument (if necessary), and then translate the
string argument (if necessary) and write the data into the address
stored in the ar_variable field.
ARGV_BOOL, ARGV_BOOL_NEG, ARGV_INCR, ARGV_BOOL_INT, and
ARGV_BOOL_INT_NEG are special in the above list in that they do not
require another argument. With @samp{ls -l}, for example, the @samp{-l}
flag lives on its own. With @samp{install -m 444 @dots{}}, on the other
hand, @samp{444} is an octal number argument associated with @samp{-m}
and will be translated and assigned to the @samp{-m} mode variable.
@node Variable Arrays, , Types of Variables, Details
@section Using Arguments Which ``Absorb'' Arrays.
Needs to be written. Sorry.
@node General Usage, Plugs, Details, Top
@chapter Invoking Programs Which Use the Library
@menu
* Usage Messages:: How to get usage messages from argv programs.
* Specifying Arguments:: How to specify arguments to argv programs.
* Long Versus Short:: Long versus short arguments.
* Global Environment Variable:: Settings for all argv programs.
* Program Environment Variable:: Arguments for a specific argv program.
@end menu
@node Usage Messages, Specifying Arguments, General Usage, General Usage
@section How to get usage messages from argv programs
If a program @samp{install} has the library compiled in you should be
able to do a @samp{install --usage-long} to get the long-format usage
message.
@example
Usage: install
[-c] or --copy-files = copy file(s), don't move %t
[-g group] or --group-id = group id name (default bin) %s
[-m octal-mode] or --mode-value = permissions mode value %o
[-o owner] or --owner-id = owner id name (default bin) %s
[-s] or --strip = strip destination binary %t
[file(s)] directory/destination = files to install or mkdir arg
@end example
In the above example, the program install's usage message is detailed.
The @samp{[-c]} line details the copy-files flag. You can either enable
it with a @samp{-c} or @samp{--copy-files}. The description of the flag
follows with lastly, a @samp{%t} showing that it is a @dfn{true/false}
flag.
The @samp{[-g]} line shows the group-id flag. It is different from the
@samp{-c} flag since, if used, it takes a group string argument (notice
the @samp{%s} at the end of the line indicating it takes a string
argument).
@samp{install --usage-short} or just @samp{--usage} will get you a
condensed usage message:
@example
Usage: install [-cs] [-g group] [-m octal-mode] [-o owner] [file(s)]
directory/destination
@end example
@node Specifying Arguments, Long Versus Short, Usage Messages, General Usage
@section How to Specify Arguments to Argv Programs
Specifying arguments to a program which uses the library is quite
straight-forward and standardized. Once you have learned how to do it
once, you can use any program with it.
There are five basic types of arguments as defined by the library:
@table @dfn
@item true/false flags
Do not have an associated value and the program will get a True if one
is specified else False.
The @samp{-c} in @samp{install -c}.
@item variable flags
Have an associate value which will be supplied to the program.
The @samp{-m} in @samp{install -m 0644} will get the value @samp{0644}.
@item values
Arguments without a @samp{-} and are associated values for the variable
flags.
@item mandatory
Arguments without a @samp{-} but are @emph{not} associated to variable
flags. These can be supplied to the program if allowed. They are
mandatory in that they must be supplied. If the program asks for 3
arguments, 3 must be supplied. @emph{NOTE} that order is important with
these.
The @samp{from} and @samp{to} arguments in @samp{install from to}.
@item maybe
These are the same as the mandatory arguments except they are optional
arguments and can but do not have to be supplied.
The @samp{file} argument in @samp{ls file} since @samp{ls} does not
require a file to be listed to work.
@end table
The values for the variable flags are assigned in a straight
First-In-First-Out queue. In @samp{install -m -g 0644 bin}, the value
@samp{0644} is assigned to the @samp{-m} flag and the value @samp{bin}
is assigned to @samp{-g}.
Additional values that cannot be matched to variable flags will become
mandatory or maybe arguments if the program is configured to accept
them.
@example
install from -c -m -g 0644 -o wheel -s jim to
@end example
In the previous convoluted example, @samp{from} and @samp{to} are
mandatory arguments, @samp{-c} and @samp{-s} are true/false flags,
@samp{-m} gets assigned @samp{0644}, @samp{-g} gets @samp{wheel}, and
@samp{-o} gets @samp{jim}. It would be much easier to write it as:
@example
install -cs -m 0644 -g wheel -o jim to from
@end example
@node Long Versus Short, Global Environment Variable, Specifying Arguments, General Usage
@section Long Versus Short Arguments
Needs to be written. Sorry.
@node Global Environment Variable, Program Environment Variable, Long Versus Short, General Usage
@section Global Settings For All Argv Programs
@cindex environment variable
@cindex GLOBAL_ARGV
An @dfn{environment variable} is a variable that is part of the user's
working environment and is shared by all the programs. The
@samp{GLOBAL_ARGV} variable is used by the argv library to customize its
behavior at runtime. It can be set by hand and should probably be
entered into your shell's runtime configuration or @dfn{RC} file.
@cindex C shell usage
@cindex csh usage
@cindex tcsh usage
To set the variable, C shell (csh or tcsh) users need to invoke:
@example
setenv GLOBAL_ARGV value
@end example
@cindex Bourne shell usage
@cindex sh usage
@cindex bash usage
@cindex ksh usage
@cindex zsh usage
Bourne shell (sh, bash, ksh, or zsh) users should use:
@example
GLOBAL_ARGV=value
export GLOBAL_ARGV
@end example
The value in the above example is a comma separated list of tokens each
having a corresponding value. The tokens and their values are described
below:
@itemize @bullet
@item close -- close argument acceptance
Enables the handling of arguments such as @samp{-m=444} where @samp{-m}
is a flag and @samp{444} is its value.
Values: disable, enable.
@itemize @bullet
@item disable -- treat @samp{=} like a normal argument
@item enable (default) -- enable the @samp{-x=10} format
@end itemize
@item env -- environment variable handling
Enables the processing of the @samp{ARGV_*} variables. If you have a
set of options that you always use for @samp{ls} for instance, you cat
set the @samp{ARGV_LS} environmental variable to hold these options.
For instance: @samp{setenv ARGV_LS "-sCF"}.
Values: none, before, after.
@itemize @bullet
@item none -- No processed at all
@item before (default) -- options from env variable are processed
Before command line
@item after -- env options processed After command line
@end itemize
@item error -- handling of usage errors
Whenever you do not use a command correctly, this token determines how
the library reports errors to you.
Values: none, see, short, shortrem, long, all.
@itemize @bullet
@item none -- on errors print nothing but error message
@item see (default) -- on errors print see --usage for more info.
@item short -- on errors print the short-format usage messages
@item shortrem -- on errors print short-format + how to get long
@item long -- on errors print the long-format usage messages
@item all -- on errors print the long-format usage messages + help, etc.
@end itemize
@item multi -- the handling of arguments specified more than once
If you use am argument twice on the command line, this token determines
if the library should say it is an error.
Values: accept, reject.
@itemize @bullet
@item accept (default) -- it's NOT an error if specified more than once
@item reject -- it's an error if specified more than once
@end itemize
@item usage -- usage messages for --usage
Determines what messages the library prints when you use the
@samp{--usage} option.
Values: short, shortrem, long, all.
@itemize @bullet
@item short (default) -- default is the short-format messages
@item shortrem -- default is the short-format messages + how to get long
@item long -- default is the long-format messages
@item all -- default is the long-format messages + help, usage, version
@end itemize
@end itemize
Examples:
@example
# accept -x=10, no env variables, long messages on errors,
# accept multiple uses, and print all messages on --usage.
setenv GLOBAL_ARGV close=accept,env=none,error=long,multi=accept,usage=all
# process env variable options before command line,
# and reject multiple argument uses
setenv GLOBAL_ARGV env=before,error=long,multi=reject
@end example
@node Program Environment Variable, , Global Environment Variable, General Usage
@section Arguments For a Specific Argv Program
Needs to be written. Sorry.
@node Plugs, Index of Concepts, General Usage, Top
@chapter Plugs and Soapbox Comments
@cindex plugs
@cindex soapbox comments
Since I have your attention I would like to talk for a second about a
couple of things that I feel strongly about. If you would like any more
information about the below, please mail to the supplied addresses or
drop me a line with any questions.
@table @asis
@item The Electronic Frontier Foundation (EFF)
@cindex EFF
@cindex Electronic Frontier Foundation
The EFF is a organization committed to ensuring that the rules,
regulations, and laws being applied to emerging communications
technologies are in keeping with our society's highest traditions of the
free and open flow of ideas and information while protecting personal
privacy. http://www.eff.org/
@item Computer Professionals for Social Responsibility (CPSR)
@cindex CPSR
@cindex Computer Professionals for Social Responsibility
CPSR is a public-interest alliance of computer scientists and others
interested in the impact of computer technology on society. We work to
influence decisions regarding the development and use of computers
because those decisions have far-reaching consequences and reflect basic
values and priorities. http://www.cpsr.org/
@end table
@node Index of Concepts, Full Node Listings, Plugs, Top
@unnumbered Concept Index
@printindex cp
@contents
@ifinfo
@node Full Node Listings, , Index of Concepts, Top
@unnumbered Detailed Node Listing
@menu
Top.
* Copying:: Library copying conditions.
* Overview:: Description of how to use the library.
* Details:: Details about the library's operations.
* General Usage:: Invoking Programs Which Use the Library.
* Plugs:: A couple soapbox comments.
* Index of Concepts:: Index of concepts in the manual.
* Full Node Listings:: Listing of all the nodes in the manual.
Overview.
* Concepts:: General concepts behind the library.
* How To Get:: How to get the library.
* Installation:: How to install the library.
* Getting Started:: Getting started with the library.
Details
* Argv_t Structure:: The argv_t structure and it's usage.
* Special Short Args:: The special ar_short_arg values.
* Types of Variables:: The different variable types.
* Variable Arrays:: Using arguments which ``absorb'' arrays.
General Usage
* Usage Messages:: How to get usage messages from argv programs.
* Specifying Arguments:: How to specify arguments to argv programs.
* Long Versus Short:: Long versus short arguments.
* Global Environment Variable:: Settings for all argv programs.
* Program Environment Variable:: Arguments for a specific argv program.
@end menu
@end ifinfo
@bye

View File

@ -1,18 +1,44 @@
/*
* $Source$
* $Revision$
* $Date$
* $Source$
* $Revision$
* $Date$
*
* Copyright (C) 1996,97 by CyberSolutions GmbH.
* All rights reserved.
* Copyright (c) 1996-99 by Peter Simons <simons@cys.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Peter Simons.
*
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "_funclib.h"
#ifdef DEBUG
extern unsigned int DebugModules[];
extern const char * const ModuleTable[];
#include <stdlib.h>
#include <string.h>
#include "argv.h"
/* This routine is a convenient way to enable or disable various
debugging modules according to the wishes of the user. It takes a
@ -39,33 +65,40 @@ extern const char * const ModuleTable[];
*/
int
argvSetDebugLevel(argv_array_t debug /* parameter array as returned by the argv routines */
)
{
argvSetDebugLevel(argv_array_t debug)
{
#ifdef DEBUG
extern const char* const ModuleTable[];
void setDebugLevel(unsigned short, unsigned short);
char * ModuleName;
char * DebugLevel;
unsigned int count, i;
for (count = 0; count < debug.aa_entryn; count++) {
for (count = 0; count < debug.aa_entry_n; count++)
{
ModuleName = strtok(ARGV_ARRAY_ENTRY(debug, char *, count), ",/:");
DebugLevel = strtok(NULL, ",/:");
if (ModuleName == NULL || DebugLevel == NULL
|| atoi(DebugLevel) < 0 || atoi(DebugLevel) > 9) {
if (ModuleName == NULL || DebugLevel == NULL || atoi(DebugLevel) < 0 || atoi(DebugLevel) > 9)
{
fprintf(stderr, "\"%s\" is not a valid debug-level specification.\n",
ARGV_ARRAY_ENTRY(debug, char *, count));
return -1;
}
for (i = 0; ModuleTable[i] != NULL; i++) {
if (!strcasecmp(ModuleName, ModuleTable[i])) {
}
for (i = 0; ModuleTable[i] != NULL; i++)
{
if (!strcasecmp(ModuleName, ModuleTable[i]))
{
setDebugLevel(i, atoi(DebugLevel));
break;
}
}
if (ModuleTable[i] == NULL) {
fprintf(stderr, "\"%s\" is not a valid debug-module name.\n", ModuleName);
return -1;
}
}
return 0;
}
}
}
if (ModuleTable[i] == NULL)
{
fprintf(stderr, "\"%s\" is not a valid debug-module name.\n", ModuleName);
return -1;
}
}
#endif
return 0;
}

View File

@ -1,9 +1,10 @@
/*
* Local defines for the argv module
* $Source$
* $Revision$
* $Date$
*
* Copyright 1995 by Gray Watson
*
* This file is part of the argv library.
* Copyright (c) 1999 by Gray Watson <gray.watson@letters.com>.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software for
* any purpose and without fee is hereby granted, provided that the
@ -13,30 +14,18 @@
* without specific, written prior permission.
*
* Gray Watson makes no representations about the suitability of the
* software described herein for any purpose. It is provided "as is"
* software described herein for any purpose. It is provided "as is"
* without express or implied warranty.
*
* The author may be contacted at gray.watson@letters.com
*
* $Id$
*/
#ifndef __ARGV_LOC_H__
#define __ARGV_LOC_H__
#include "argv.h"
#include "argv.h" /* to get the types */
/*
* global variable and procedure scoping for code readability
*/
#undef EXPORT
#define EXPORT
#undef IMPORT
#define IMPORT extern
#undef LOCAL
#define LOCAL static
#ifdef __cplusplus
extern "C" {
#endif
/*
* generic constants
@ -46,9 +35,6 @@
#define NULL 0L
#endif
#undef NULLC
#define NULLC '\0'
#undef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
@ -76,8 +62,8 @@
#define FILE_LINE_SIZE 1024 /* max size of file lines */
/* internal flags set in the ar_type field */
/* ARGV_ARRAY is defined in argv.h */
#define ARGV_FLAG_USED (1 << 13) /* if arg has been specified */
/* NOTE: other external flags defined in argv.h */
#define ARGV_FLAG_USED (1 << 12) /* if arg has been specified */
/* error messages */
#define USAGE_ERROR_NAME "usage problem"
@ -97,6 +83,7 @@
#define GLOBAL_ERROR "error=" /* error setting */
#define GLOBAL_MULTI "multi=" /* multi setting */
#define GLOBAL_USAGE "usage=" /* usage setting */
#define GLOBAL_LASTTOG "lasttog=" /* last-arg toggle */
#define GLOBAL_CLOSE_DISABLE 1 /* disable close args */
#define GLOBAL_CLOSE_ENABLE 2 /* enable close args */
@ -114,7 +101,10 @@
#define GLOBAL_MULTI_REJECT 11 /* reject multiple arg use */
#define GLOBAL_MULTI_ACCEPT 12 /* accept multiple arg use */
#define GLOBAL_ERROR_NONE 13 /* print only error */
#define GLOBAL_LASTTOG_DISABLE 13 /* toggling of last-arg off */
#define GLOBAL_LASTTOG_ENABLE 14 /* toggling of last-arg on */
#define GLOBAL_ERROR_NONE 15 /* print only error */
#define GLOBAL_ERROR_SEE GLOBAL_USAGE_SEE /* error + see messages */
#define GLOBAL_ERROR_SHORT GLOBAL_USAGE_SHORT /* error + short */
#define GLOBAL_ERROR_SHORTREM GLOBAL_USAGE_SHORTREM /* err + short + remind*/
@ -127,6 +117,7 @@
#define SHORT_PREFIX "-" /* prefix for short args */
#define UNKNOWN_ARG "??" /* unknown argument output */
#define ARG_EQUALS '=' /* to assign value to option */
#define NUMBER_ARG_CHARS "0123456789+-." /* characters in numbers */
/* how to produce the env var using sprintf and the argv_program variable */
#define ENVIRON_FORMAT "ARGV_%s"
@ -175,13 +166,13 @@
/* strcture defining argv types */
typedef struct {
int at_value; /* value of the type */
unsigned int at_value; /* value of the type */
char *at_name; /* name of the type */
int at_size; /* size of type */
unsigned int at_size; /* size of type */
char *at_desc; /* description of the type */
} argv_type_t;
LOCAL argv_type_t argv_types[] = {
static argv_type_t argv_types[] = {
{ ARGV_BOOL, "flag", sizeof(char),
"if option used, set variable to true" },
{ ARGV_BOOL_NEG, "negative flag", sizeof(int),
@ -190,12 +181,12 @@ LOCAL argv_type_t argv_types[] = {
"like flag but you specify with yes/no argument" },
{ ARGV_CHAR, "character", sizeof(char),
"single character" },
{ ARGV_CHARP, "string", sizeof(char *),
{ ARGV_CHAR_P, "string", sizeof(char *),
"multiple characters terminated with a '\\0'" },
{ ARGV_FLOAT, "floating point", sizeof(float),
"real number with decimal point" },
{ ARGV_SHORT, "short integer", sizeof(short),
"decimal short-sized integer value" },
{ ARGV_U_SHORT, "unsigned short integer", sizeof(unsigned short),
"decimal unsigned short-sized integer value" },
{ ARGV_INT, "integer", sizeof(int),
"decimal integer value" },
{ ARGV_U_INT, "unsigned integer", sizeof(unsigned int),
@ -204,6 +195,10 @@ LOCAL argv_type_t argv_types[] = {
"decimal long-sized integer value" },
{ ARGV_U_LONG, "unsigned long", sizeof(unsigned long),
"decimal unsigned long-sized integer value" },
{ ARGV_FLOAT, "floating point", sizeof(float),
"real number with decimal point" },
{ ARGV_DOUBLE, "double floating point", sizeof(double),
"double precision real number with decimal point" },
{ ARGV_BIN, "binary", sizeof(int),
"base 2 value with digits of 0 or 1" },
{ ARGV_OCT, "octal", sizeof(int),
@ -212,62 +207,15 @@ LOCAL argv_type_t argv_types[] = {
"base 16 value with digits from 0-9, A-F" },
{ ARGV_INCR, "increment", sizeof(int),
"increment variable each time option used" },
{ ARGV_SIZE, "long size", sizeof(long),
"size as long int + [bkmg] b=byte,k=kilo,m=meg,g=gig" },
{ ARGV_U_SIZE, "unsigned long size", sizeof(unsigned long),
"size as unsigned long int + [bkmg] b=byte,k=kilo,m=meg,g=gig" },
{ 0 }
};
/******************************** queue code *********************************/
/*
* Generic inline queue defines.
*/
/* declare the arguments needed to maintain a queue for type TYPE */
#define QUEUE_DECLARE(type) \
type *queue_alloc = NULL; \
int queue_head = 0; \
int queue_tail = 0; \
int queue_count = 0; \
int queue_max = 1
#define LOCAL_QUEUE_DECLARE(type) \
static type *queue_alloc = NULL; \
static int queue_head = 0; \
static int queue_tail = 0; \
static int queue_count = 0; \
static int queue_max = 1
/* test to see if the queue has not been allocated */
#define QUEUE_IS_NULL() (queue_alloc == NULL)
/* allocate a mini-queue */
#define QUEUE_ALLOC(type, num) \
do { \
queue_alloc = (type *)malloc(sizeof(type) * num); \
queue_head = 0; \
queue_tail = 0; \
queue_count = 0; \
queue_max = num; \
} while(0)
/* allocate a mini-queue's allocation */
#define QUEUE_FREE() free(queue_alloc)
/* enqueue items from the mini-queue */
#define QUEUE_ENQUEUE(item) \
do { \
queue_alloc[queue_head] = item; \
queue_head = (queue_head + 1) % queue_max; \
queue_count++; \
} while(0)
/* dequeue items from the mini-queue */
#define QUEUE_DEQUEUE(item) \
do { \
item = queue_alloc[queue_tail]; \
queue_tail = (queue_tail + 1) % queue_max; \
queue_count--; \
} while(0)
/* count the number of items in the mini-queue */
#define QUEUE_COUNT() queue_count
#ifdef __cplusplus
}
#endif
#endif /* ! __ARGV_LOC_H__ */

46
libargv/configure.in Normal file
View File

@ -0,0 +1,46 @@
dnl
dnl Process this file with autoconf to produce a configure script.
dnl
dnl NOTE: the beginning comments should be dnl'ed so we get the #!/bin/sh
dnl at the very top of the configure script.
dnl
dnl Copyright 1995 by Gray Watson
dnl
dnl This file is part of the argv library.
dnl
dnl Permission to use, copy, modify, and distribute this software for
dnl any purpose and without fee is hereby granted, provided that the
dnl above copyright notice and this permission notice appear in all
dnl copies, and that the name of Gray Watson not be used in advertising
dnl or publicity pertaining to distribution of the document or software
dnl without specific, written prior permission.
dnl
dnl Gray Watson makes no representations about the suitability of the
dnl software described herein for any purpose. It is provided "as is"
dnl without express or implied warranty.
dnl
dnl The author may be contacted at gray.watson@letters.com
dnl
dnl $Id$
dnl
AC_REVISION($Revision$)dnl
AC_INIT(argv.c)
dnl Checks for paths and programs.
dnl
AC_PROG_CC
AC_PROG_RANLIB
dnl Enable warning flags for gcc.
dnl
if test "$GCC" = yes; then
CFLAGS="$CFLAGS -Wall -pedantic -ansi"
fi
dnl Remove '-g' and '-O2' from the compile flags.
dnl
CFLAGS=`echo $CFLAGS | sed -e "s/-g//" -e "s/-O2//"`
dnl Write results.
dnl
AC_OUTPUT(GNUmakefile)

View File

@ -1,39 +1,65 @@
/*
* $Source$
* $Revision$
* $Date$
* $Source$
* $Revision$
* $Date$
*
* Copyright (C) 1997 by CyberSolutions GmbH.
* All rights reserved.
* Copyright (c) 1996-99 by Peter Simons <simons@cys.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Peter Simons.
*
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "argv.h"
/* These variables should be global/static because the ANSI C standard
doesn't allow to reference to local variables at compile time, as
we do when filling out the args[] array. */
static char * filename = "/tmp/defaultfile";
static char do_something = ARGV_TRUE;
static argv_array_t parameters;
int
main(int argc, char ** argv)
{
argv_t args[] = {
{ 's', "something", ARGV_BOOL_ARG, &do_something, NULL,
"Do something?"},
{ 0, "filename", ARGV_CHARP, &filename, "logfile",
"Path of the logfile."},
{ ARGV_MAND, 0L, ARGV_CHARP | ARGV_ARRAY, &parameters, "parameters",
"Whatever..."},
{ARGV_LAST}
/* These variables should be static because the ANSI C standard
doesn't allow to reference to local variables at compile time,
as would need it when filling out the args[] array. */
static char * filename = "/tmp/defaultfile";
static char do_something = ARGV_TRUE;
static argv_array_t parameters;
argv_t args[] = {
{ 's', "something", ARGV_BOOL_ARG, &do_something, NULL, "Do something?"},
{ 0, "filename", ARGV_CHAR_P, &filename, "logfile", "Path of the logfile."},
{ ARGV_MAND, 0L, ARGV_CHAR_P | ARGV_FLAG_ARRAY, &parameters, "parameters", "Whatever..."},
{ARGV_LAST}
};
unsigned int i;
unsigned int i;
/* Parse the command line. */
argv_help_string = "BigBrother Internet Surveillance Daemon";
argv_help_string = "You need help with a test program?";
argv_version_string = "libargv test programm";
argv_process(args, argc, argv);
@ -43,8 +69,8 @@ main(int argc, char ** argv)
printf("logfile : %s\n", filename);
printf("do_something: %s\n", (do_something == ARGV_TRUE) ? "yes" : "no");
printf("parameters : ");
for (i = 0; i < parameters.aa_entryn; i++) {
if (i+1 < parameters.aa_entryn)
for (i = 0; i < ARGV_ARRAY_COUNT(parameters); i++) {
if (i+1 < ARGV_ARRAY_COUNT(parameters))
printf("'%s', ", ARGV_ARRAY_ENTRY(parameters, char *, i));
else
printf("'%s'", ARGV_ARRAY_ENTRY(parameters, char *, i));