/*
**  PARSEARGS.H -- declarations for argument vector parser
**
**	$Header: parseargs.h,v 2.0 89/12/24 00:56:29 eric Exp $
**
**	Author:
**		Eric Allman
**		University of California, Berkeley
*/

#ifndef ARGDESC

#ifndef _USEFUL_H_
#include <useful.h>
#endif

#define ARGDESC		struct _argdesc

ARGDESC
{
	char	ad_name;	/* flag name */
	char	ad_flags;	/* flags */
	BOOL	(*ad_type) ARGS((ARGDESC *, char *, BOOL));
				/* function to parse value */
	ARBPTR	ad_valp;	/* pointer to value storage area */
	char	*ad_prompt;	/* prompt string */
};

/* bits for ad_flags */
#define ARGREQ		0x01	/* required argument */
#define ARGOPT		0x00	/* optional argument pseudo-flag */
#define ARGHIDDEN	0x02	/* don't display in usage message */
#define ARGGIVEN	0x08	/* (internal) argument has been specified */
#define ARGLIST		0x10	/* Argument is a list handler */

/* types available for ad_type */
extern BOOL	argBool ARGS((ARGDESC *, char *, BOOL));
extern BOOL	argChar ARGS((ARGDESC *, char *, BOOL));
extern BOOL	argStr ARGS((ARGDESC *, char *, BOOL));
extern BOOL	argInt ARGS((ARGDESC *, char *, BOOL));
extern BOOL	argShort ARGS((ARGDESC *, char *, BOOL));
extern BOOL	argLong ARGS((ARGDESC *, char *, BOOL));
extern BOOL	argFloat ARGS((ARGDESC *, char *, BOOL));
extern BOOL	argDouble ARGS((ARGDESC *, char *, BOOL));
extern BOOL	listStr ARGS((ARGDESC *, char *, BOOL));

struct arglist {
	struct arglist *nl_next;
	ARBPTR nl_val;
};

#define L_NEXT(l) ((l)->nl_next)		/* Next elt of list */
#define L_STRING(e) ((char *)((e)->nl_val))	/* Elt as a string */

#define ENDOFARGS	{ '\0' }

#endif
