1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2010 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                  Common Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*            http://www.opensource.org/licenses/cpl1.0.txt             *
11*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23/*
24 * Glenn Fowler
25 * AT&T Research
26 *
27 * command line option parse interface
28 */
29
30#ifndef _OPTION_H
31#define _OPTION_H
32
33#include <ast.h>
34
35#define OPT_VERSION	20070319L
36
37#define OPT_USER	(1L<<16)	/* first user flag bit		*/
38
39struct Opt_s;
40struct Optdisc_s;
41
42typedef int (*Optinfo_f)(struct Opt_s*, Sfio_t*, const char*, struct Optdisc_s*);
43
44typedef struct Optdisc_s
45{
46	unsigned long	version;	/* OPT_VERSION			*/
47	unsigned long	flags;		/* OPT_* flags			*/
48	char*		catalog;	/* error catalog id		*/
49	Optinfo_f	infof;		/* runtime info function	*/
50} Optdisc_t;
51
52/* NOTE: Opt_t member order fixed by a previous binary release */
53
54#ifndef _OPT_PRIVATE_
55#define _OPT_PRIVATE_	\
56	char		pad[3*sizeof(void*)];
57#endif
58
59typedef struct Opt_s
60{
61	int		again;		/* see optjoin()		*/
62	char*		arg;		/* {:,#} string argument	*/
63	char**		argv;		/* most recent argv		*/
64	int		index;		/* argv index			*/
65	char*		msg;		/* error/usage message buffer	*/
66	long		num;		/* OBSOLETE -- use number	*/
67	int		offset;		/* char offset in argv[index]	*/
68	char		option[8];	/* current flag {-,+} + option  */
69	char		name[64];	/* current long name or flag	*/
70	Optdisc_t*	disc;		/* user discipline		*/
71	intmax_t	number;		/* # numeric argument		*/
72	unsigned char	assignment;	/* option arg assigment op	*/
73	unsigned char	pads[sizeof(void*)-1];
74	_OPT_PRIVATE_
75} Opt_t;
76
77#if _BLD_ast && defined(__EXPORT__)
78#define extern		extern __EXPORT__
79#endif
80#if !_BLD_ast && defined(__IMPORT__)
81#define extern		extern __IMPORT__
82#endif
83
84extern Opt_t*		_opt_infop_;
85
86#define opt_info	(*_opt_infop_)
87
88#undef	extern
89
90#define optinit(d,f)	(memset(d,0,sizeof(*(d))),(d)->version=OPT_VERSION,(d)->infof=(f),opt_info.disc=(d))
91
92#if _BLD_ast && defined(__EXPORT__)
93#define extern		__EXPORT__
94#endif
95
96extern int		optget(char**, const char*);
97extern int		optjoin(char**, ...);
98extern char*		opthelp(const char*, const char*);
99extern char*		optusage(const char*);
100extern int		optstr(const char*, const char*);
101extern int		optesc(Sfio_t*, const char*, int);
102extern Opt_t*		optctx(Opt_t*, Opt_t*);
103
104#undef	extern
105
106#endif
107