Imported libargv version 2.4.0.
This commit is contained in:
parent
5ad045c241
commit
b9c9b4eb68
@ -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
|
||||
@ -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
115
libargv/NEWS
Normal 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
18
libargv/SMakefile
Normal 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
|
||||
2948
libargv/argv.c
2948
libargv/argv.c
File diff suppressed because it is too large
Load Diff
460
libargv/argv.h
460
libargv/argv.h
@ -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
833
libargv/argv.texi
Normal 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, ©, 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
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
46
libargv/configure.in
Normal 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)
|
||||
@ -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, ¶meters, "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, ¶meters, "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));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user