/***********************************************************************
*                                                                      *
*               This software is part of the ast package               *
*           Copyright (c) 1984-2006 AT&T Knowledge Ventures            *
*                      and is licensed under the                       *
*                  Common Public License, Version 1.0                  *
*                      by AT&T Knowledge Ventures                      *
*                                                                      *
*                A copy of the License is available at                 *
*            http://www.opensource.org/licenses/cpl1.0.txt             *
*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
*                                                                      *
*              Information and Software Systems Research               *
*                            AT&T Research                             *
*                           Florham Park NJ                            *
*                                                                      *
*                 Glenn Fowler <gsf@research.att.com>                  *
*                                                                      *
***********************************************************************/
#pragma prototyped
/*
 * Glenn Fowler
 * AT&T Research
 *
 * make option attributes and flag mappings
 *
 * omitted letters are avilable for option flags:
 *
 *	abcdefghijklmnopqrstuvwxyz
 *      --------------------------
 *	ABCDEFGHIJK MNOPQRSTUV X  
 *	abcdefg ijkl no  rst vwx z
 */

#define OPT(o)		(o&((1<<9)-1))	/* get opt char from code	*/
#define Of		(1<<8)		/* cannot be set by flag	*/

#define Oa		(1<<9)		/* multiple string values added	*/
#define Ob		(1<<10)		/* boolean value		*/
#define Oi		(1<<11)		/* state.* sense inverted	*/
#define Om		(1<<13)		/* internal option		*/
#define On		(1<<14)		/* numeric value		*/
#define Oo		(1<<15)		/* flag sense opposite		*/
#define Os		(1L<<16)	/* string value			*/
#define Ov		(1L<<17)	/* value is optional		*/
#define Ox		(1L<<18)	/* not expanded in $(-)		*/

#define OPT_COMPILE	(1L<<26)	/* compile into object		*/
#define OPT_DECLARE	(1L<<27)	/* compile declaration		*/
#define OPT_DEFAULT	(1L<<28)	/* := default value		*/
#define OPT_EXTERNAL	(1L<<29)	/* external by name		*/
#define OPT_READONLY	(1L<<30)	/* cannot reset til state.user	*/
#define OPT_SET		(1L<<31)	/* explicitly set		*/

#define OPT_accept	('A'|Ob)	/* accept existing targets	*/
#define OPT_alias	('a'|Ob)	/* directory aliasing enabled	*/
#define OPT_base	('b'|Ob|Ox)	/* compile base|global rules	*/
#define OPT_believe	('B'|On)	/* believe state from this level*/
#define OPT_byname	('o'|Oa|Os|Ox)	/* command line option by name	*/
#define OPT_compile	('c'|Ob|Ox)	/* force makefile compilation	*/
#define OPT_compatibility ('C'|Ob|Ox)	/* disable compatibility msgs	*/
#define OPT_corrupt	('X'|Os|Ov)	/* corrupt statefile action	*/
#define OPT_cross	('J'|Ob)	/* don't run gen'd executables	*/
#define OPT_debug	('d'|Oi|On)	/* debug trace level		*/
#define OPT_define	('D'|Os|Ox)	/* passed to preprocessor	*/
#define OPT_errorid	('E'|Os)	/* append to error output id	*/
#define OPT_exec	('n'|Ob|Oo)	/* execute shell actions	*/
#define OPT_expandview	('x'|Ob)	/* expand paths if fsview!=0	*/
#define OPT_explain	('e'|Ob)	/* explain actions		*/
#define OPT_file	('f'|Oa|Os|Ox)	/* next arg is makefile		*/
#define OPT_force	('F'|Ob)	/* force targets to be updated	*/
#define OPT_global	('g'|Oa|Os)	/* next arg is global makefile	*/
#define OPT_ignore	('i'|Ob)	/* ignore shell action errors	*/
#define OPT_ignorelock	('K'|Ob)	/* ignore state file locking	*/
#define OPT_include	('I'|Os|Ox)	/* passed to preprocessor	*/
#define OPT_intermediate ('G'|Ob)	/* force intermediate targets	*/
#define OPT_jobs	('j'|On)	/* job concurrency level	*/
#define OPT_keepgoing	('k'|Ob)	/* do sibling prereqs on error	*/
#define OPT_list	('l'|Ob|Ox)	/* list info and don't make	*/
#define OPT_mam		('M'|Os)	/* generate mam			*/
#define OPT_never	('N'|Ob)	/* really - don't exec anything	*/
#define OPT_option	(101|Oa|Of|Os|Ox)/* define new option by name	*/
#define OPT_override	(102|Ob|Of|Ox)	/* override selected algorithms	*/
#define OPT_preprocess	('P'|Ob)	/* preprocess all makefiles	*/
#define OPT_questionable ('Q'|On)	/* enable questionable code	*/
#define OPT_readonly	('R'|Ob)	/* current vars|opts readonly	*/
#define OPT_readstate	('S'|On|Ov)	/* read state file on startup	*/
#define OPT_regress	('q'|Ob)	/* output for regression test	*/
#define OPT_reread	(103|Ob|Of|Ox)	/* force re-read all makefiles	*/
#define OPT_ruledump	('r'|Ob|Ox)	/* dump rule definitions	*/
#define OPT_scan	(104|Ob|Of)	/* scan|check implicit prereqs	*/
#define OPT_serialize	('O'|Ob)	/* serialize concurrent output	*/
#define OPT_silent	('s'|Ob)	/* run silently			*/
#define OPT_strictview	('V'|Ob)	/* strict views			*/
#define OPT_targetcontext (105|Ob|Of)	/* expand in target dir context	*/
#define OPT_targetprefix (106|Os|Of)	/* source dir target prefix sep	*/
#define OPT_test	('T'|On)	/* enable test code		*/
#define OPT_tolerance	('z'|On)	/* time comparison tolerance	*/
#define OPT_touch	('t'|Ob)	/* touch out of date targets	*/
#define OPT_undef	('U'|Os|Ox)	/* passed to preprocessor	*/
#define OPT_vardump	('v'|Ob|Ox)	/* dump variable definitions	*/
#define OPT_warn	('w'|Ob)	/* enable source file warnings	*/
#define OPT_writeobject	(107|Of|Os|Ov|Ox)/* write recompiled object	*/
#define OPT_writestate	(108|Of|Os|Ov|Ox)/* write state file on exit	*/

struct Option_s; typedef struct Option_s Option_t;

struct Option_s				/* option table entry		*/
{
	char*		name;		/* option name			*/
	unsigned long	flags;		/* O[a-z] and OPT_[A-Z]+ flags	*/
	char*		value;		/* overloaded value		*/
	char*		set;		/* call this on set		*/
	char*		description;	/* description			*/
	char*		arg;		/* arg name			*/
	Option_t*	next;		/* external option list link	*/
};

extern Option_t*	optflag(int);
extern void		optcheck(int);
extern void		optinit(void);
