xref: /onnv-gate/usr/src/lib/libast/common/include/ast.h (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #pragma prototyped
234887Schin /*
244887Schin  * Advanced Software Technology Library
254887Schin  * AT&T Research
264887Schin  *
274887Schin  * std + posix + ast
284887Schin  */
294887Schin 
304887Schin #ifndef _AST_H
314887Schin #define _AST_H
324887Schin 
334887Schin #include <ast_version.h>
344887Schin 
354887Schin #ifndef _AST_STD_H
364887Schin #include <ast_std.h>
374887Schin #endif
384887Schin 
394887Schin #ifndef _SFIO_H
404887Schin #include <sfio.h>
414887Schin #endif
424887Schin 
434887Schin #ifndef	ast
444887Schin #define ast		_ast_info
454887Schin #endif
464887Schin 
474887Schin #ifndef PATH_MAX
484887Schin #define PATH_MAX	1024
494887Schin #endif
504887Schin 
514887Schin /*
524887Schin  * workaround botched headers that assume <stdio.h>
534887Schin  */
544887Schin 
554887Schin #ifndef FILE
564887Schin #ifndef _SFIO_H
574887Schin struct _sfio_s;
584887Schin #endif
594887Schin #define FILE		struct _sfio_s
604887Schin #ifndef	__FILE_typedef
614887Schin #define __FILE_typedef	1
624887Schin #endif
634887Schin #ifndef _FILEDEFED
644887Schin #define _FILEDEFED	1
654887Schin #endif
664887Schin #endif
674887Schin 
684887Schin /*
694887Schin  * exit() support -- this matches shell exit codes
704887Schin  */
714887Schin 
724887Schin #define EXIT_BITS	8			/* # exit status bits	*/
734887Schin 
744887Schin #define EXIT_USAGE	2			/* usage exit code	*/
754887Schin #define EXIT_QUIT	((1<<(EXIT_BITS))-1)	/* parent should quit	*/
764887Schin #define EXIT_NOTFOUND	((1<<(EXIT_BITS-1))-1)	/* command not found	*/
774887Schin #define EXIT_NOEXEC	((1<<(EXIT_BITS-1))-2)	/* other exec error	*/
784887Schin 
794887Schin #define EXIT_CODE(x)	((x)&((1<<EXIT_BITS)-1))
804887Schin #define EXIT_CORE(x)	(EXIT_CODE(x)|(1<<EXIT_BITS)|(1<<(EXIT_BITS-1)))
814887Schin #define EXIT_TERM(x)	(EXIT_CODE(x)|(1<<EXIT_BITS))
824887Schin 
834887Schin /*
844887Schin  * NOTE: for compatibility the following work for EXIT_BITS={7,8}
854887Schin  */
864887Schin 
874887Schin #define EXIT_STATUS(x)	(((x)&((1<<(EXIT_BITS-2))-1))?(x):EXIT_CODE((x)>>EXIT_BITS))
884887Schin 
894887Schin #define EXITED_CORE(x)	(((x)&((1<<EXIT_BITS)|(1<<(EXIT_BITS-1))))==((1<<EXIT_BITS)|(1<<(EXIT_BITS-1)))||((x)&((1<<(EXIT_BITS-1))|(1<<(EXIT_BITS-2))))==((1<<(EXIT_BITS-1))|(1<<(EXIT_BITS-2))))
904887Schin #define EXITED_TERM(x)	((x)&((1<<EXIT_BITS)|(1<<(EXIT_BITS-1))))
914887Schin 
924887Schin /*
934887Schin  * astconflist() flags
944887Schin  */
954887Schin 
964887Schin #define ASTCONF_parse		0x0001
974887Schin #define ASTCONF_write		0x0002
984887Schin #define ASTCONF_read		0x0004
994887Schin #define ASTCONF_lower		0x0008
1004887Schin #define ASTCONF_base		0x0010
1014887Schin #define ASTCONF_defined		0x0020
1024887Schin #define ASTCONF_quote		0x0040
1034887Schin #define ASTCONF_table		0x0080
1044887Schin #define ASTCONF_matchcall	0x0100
1054887Schin #define ASTCONF_matchname	0x0200
1064887Schin #define ASTCONF_matchstandard	0x0400
1074887Schin #define ASTCONF_error		0x0800
1084887Schin #define ASTCONF_system		0x1000
1094887Schin #define ASTCONF_AST		0x2000
1104887Schin 
1114887Schin /*
1124887Schin  * pathcanon() flags
1134887Schin  */
1144887Schin 
1154887Schin #define PATH_PHYSICAL	01
1164887Schin #define PATH_DOTDOT	02
1174887Schin #define PATH_EXISTS	04
1184887Schin #define PATH_VERIFIED(n) (((n)&01777)<<5)
1194887Schin 
1204887Schin /*
1214887Schin  * pathaccess() flags
1224887Schin  */
1234887Schin 
1244887Schin #define PATH_READ	004
1254887Schin #define PATH_WRITE	002
1264887Schin #define PATH_EXECUTE	001
1274887Schin #define	PATH_REGULAR	010
1284887Schin #define PATH_ABSOLUTE	020
1294887Schin 
1304887Schin /*
1314887Schin  * touch() flags
1324887Schin  */
1334887Schin 
1344887Schin #define PATH_TOUCH_CREATE	01
1354887Schin #define PATH_TOUCH_VERBATIM	02
1364887Schin 
1374887Schin /*
1384887Schin  * pathcheck() info
1394887Schin  */
1404887Schin 
1414887Schin typedef struct
1424887Schin {
1434887Schin 	unsigned long	date;
1444887Schin 	char*		feature;
1454887Schin 	char*		host;
1464887Schin 	char*		user;
1474887Schin } Pathcheck_t;
1484887Schin 
1494887Schin /*
1504887Schin  * strgrpmatch() flags
1514887Schin  */
1524887Schin 
1534887Schin #define STR_MAXIMAL	01		/* maximal match		*/
1544887Schin #define STR_LEFT	02		/* implicit left anchor		*/
1554887Schin #define STR_RIGHT	04		/* implicit right anchor	*/
1564887Schin #define STR_ICASE	010		/* ignore case			*/
1574887Schin #define STR_GROUP	020		/* (|&) inside [@|&](...) only	*/
1584887Schin 
1594887Schin /*
1604887Schin  * fmtquote() flags
1614887Schin  */
1624887Schin 
1634887Schin #define FMT_ALWAYS	0x01		/* always quote			*/
1644887Schin #define FMT_ESCAPED	0x02		/* already escaped		*/
1654887Schin #define FMT_SHELL	0x04		/* escape $ ` too		*/
1664887Schin #define FMT_WIDE	0x08		/* don't escape 8 bit chars	*/
1674887Schin #define FMT_PARAM	0x10		/* disable FMT_SHELL ${$( quote	*/
1684887Schin 
1694887Schin /*
1704887Schin  * multibyte macros
1714887Schin  */
1724887Schin 
1734887Schin #define mbmax()		(ast.mb_cur_max)
1744887Schin #define mberr()		(ast.tmp_int<0)
1754887Schin 
1764887Schin #define mbcoll()	(ast.mb_xfrm!=0)
1774887Schin #define mbwide()	(mbmax()>1)
1784887Schin 
17910898Sroland.mainz@nrubsig.org #define mbchar(p)	(mbwide()?((ast.tmp_int=(*ast.mb_towc)(&ast.tmp_wchar,(char*)(p),mbmax()))>0?((p+=ast.tmp_int),ast.tmp_wchar):(p+=ast.mb_sync+1,ast.tmp_int)):(*(unsigned char*)(p++)))
1804887Schin #define mbinit()	(mbwide()?(*ast.mb_towc)((wchar_t*)0,(char*)0,mbmax()):0)
1814887Schin #define mbsize(p)	(mbwide()?(*ast.mb_len)((char*)(p),mbmax()):((p),1))
1824887Schin #define mbconv(s,w)	(ast.mb_conv?(*ast.mb_conv)(s,w):((*(s)=(w)),1))
1834887Schin #define mbwidth(w)	(ast.mb_width&&((ast.tmp_int=(*ast.mb_width)(w))>=0||(w)>UCHAR_MAX)?ast.tmp_int:1)
1844887Schin #define mbxfrm(t,f,n)	(mbcoll()?(*ast.mb_xfrm)((char*)(t),(char*)(f),n):0)
1854887Schin 
1864887Schin /*
1874887Schin  * common macros
1884887Schin  */
1894887Schin 
1904887Schin #define elementsof(x)	(sizeof(x)/sizeof(x[0]))
1914887Schin #define integralof(x)	(((char*)(x))-((char*)0))
1924887Schin #define newof(p,t,n,x)	((p)?(t*)realloc((char*)(p),sizeof(t)*(n)+(x)):(t*)calloc(1,sizeof(t)*(n)+(x)))
1934887Schin #define oldof(p,t,n,x)	((p)?(t*)realloc((char*)(p),sizeof(t)*(n)+(x)):(t*)malloc(sizeof(t)*(n)+(x)))
1944887Schin #define pointerof(x)	((void*)((char*)0+(x)))
1954887Schin #define roundof(x,y)	(((x)+(y)-1)&~((y)-1))
1964887Schin #define ssizeof(x)	((int)sizeof(x))
1974887Schin 
1984887Schin #define streq(a,b)	(*(a)==*(b)&&!strcmp(a,b))
1994887Schin #define strneq(a,b,n)	(*(a)==*(b)&&!strncmp(a,b,n))
2004887Schin #define strsignal(s)	fmtsignal(s)
2014887Schin 
2024887Schin #if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
2034887Schin #define NiL		0
2044887Schin #define NoP(x)		(void)(x)
2054887Schin #else
2064887Schin #define NiL		((char*)0)
2074887Schin #define NoP(x)		(&x,1)
2084887Schin #endif
2094887Schin 
2104887Schin #if !defined(NoF)
2114887Schin #define NoF(x)		void _DATA_ ## x () {}
2124887Schin #if !defined(_DATA_)
2134887Schin #define _DATA_
2144887Schin #endif
2154887Schin #endif
2164887Schin 
2174887Schin #if !defined(NoN)
2184887Schin #define NoN(x)		void _STUB_ ## x () {}
2194887Schin #if !defined(_STUB_)
2204887Schin #define _STUB_
2214887Schin #endif
2224887Schin #endif
2234887Schin 
2244887Schin #define NOT_USED(x)	NoP(x)
2254887Schin 
2264887Schin typedef int (*Error_f)(void*, void*, int, ...);
2274887Schin 
2284887Schin typedef int (*Ast_confdisc_f)(const char*, const char*, const char*);
2294887Schin typedef int (*Strcmp_context_f)(const char*, const char*, void*);
2304887Schin typedef int (*Strcmp_f)(const char*, const char*);
2314887Schin 
2324887Schin #if _BLD_ast && defined(__EXPORT__)
2334887Schin #define extern		__EXPORT__
2344887Schin #endif
2354887Schin 
2364887Schin extern char*		astgetconf(const char*, const char*, const char*, int, Error_f);
2374887Schin extern char*		astconf(const char*, const char*, const char*);
2384887Schin extern Ast_confdisc_f	astconfdisc(Ast_confdisc_f);
2394887Schin extern void		astconflist(Sfio_t*, const char*, int, const char*);
2404887Schin extern off_t		astcopy(int, int, off_t);
2414887Schin extern int		astlicense(char*, int, char*, char*, int, int, int);
2424887Schin extern int		astquery(int, const char*, ...);
2434887Schin extern void		astwinsize(int, int*, int*);
2444887Schin 
2454887Schin extern ssize_t		base64encode(const void*, size_t, void**, void*, size_t, void**);
2464887Schin extern ssize_t		base64decode(const void*, size_t, void**, void*, size_t, void**);
2474887Schin extern int		chresc(const char*, char**);
2484887Schin extern int		chrtoi(const char*);
2494887Schin extern int		eaccess(const char*, int);
2504887Schin extern char*		fmtbase(long, int, int);
2514887Schin extern char*		fmtbasell(intmax_t, int, int);
2524887Schin #define fmtbase(a,b,c)	fmtbasell((intmax_t)(a),b,c) /* until 2003-09-01 */
2534887Schin extern char*		fmtbuf(size_t);
2544887Schin extern char*		fmtclock(Sfulong_t);
2554887Schin extern char*		fmtelapsed(unsigned long, int);
2564887Schin extern char*		fmterror(int);
2574887Schin extern char*		fmtesc(const char*);
2584887Schin extern char*		fmtesq(const char*, const char*);
2594887Schin extern char*		fmtident(const char*);
2604887Schin extern char*		fmtip4(uint32_t, int);
2614887Schin extern char*		fmtfmt(const char*);
2624887Schin extern char*		fmtgid(int);
2634887Schin extern char*		fmtmatch(const char*);
2644887Schin extern char*		fmtmode(int, int);
2654887Schin extern char*		fmtnesq(const char*, const char*, size_t);
2664887Schin extern char*		fmtnum(unsigned long, int);
2674887Schin extern char*		fmtperm(int);
2684887Schin extern char*		fmtquote(const char*, const char*, const char*, size_t, int);
2694887Schin extern char*		fmtre(const char*);
2704887Schin extern char*		fmtscale(Sfulong_t, int);
2714887Schin extern char*		fmtsignal(int);
2724887Schin extern char*		fmttime(const char*, time_t);
2734887Schin extern char*		fmtuid(int);
2744887Schin extern char*		fmtversion(unsigned long);
2754887Schin extern void*		memdup(const void*, size_t);
2764887Schin extern void		memfatal(void);
2774887Schin extern unsigned int	memhash(const void*, int);
2784887Schin extern unsigned long	memsum(const void*, int, unsigned long);
2794887Schin extern char*		pathaccess(char*, const char*, const char*, const char*, int);
2804887Schin extern char*		pathbin(void);
2814887Schin extern char*		pathcanon(char*, int);
2824887Schin extern char*		pathcat(char*, const char*, int, const char*, const char*);
2834887Schin extern int		pathcd(const char*, const char*);
2844887Schin extern int		pathcheck(const char*, const char*, Pathcheck_t*);
2854887Schin extern int		pathexists(char*, int);
2864887Schin extern char*		pathfind(const char*, const char*, const char*, char*, size_t);
2874887Schin extern int		pathgetlink(const char*, char*, int);
2884887Schin extern int		pathinclude(const char*);
2894887Schin extern char*		pathkey(char*, char*, const char*, const char*, const char*);
2904887Schin extern size_t		pathnative(const char*, char*, size_t);
2914887Schin extern char*		pathpath(char*, const char*, const char*, int);
2924887Schin extern size_t		pathposix(const char*, char*, size_t);
2934887Schin extern char*		pathprobe(char*, char*, const char*, const char*, const char*, int);
29410898Sroland.mainz@nrubsig.org extern size_t		pathprog(const char*, char*, size_t);
2954887Schin extern char*		pathrepl(char*, const char*, const char*);
2964887Schin extern int		pathsetlink(const char*, const char*);
2974887Schin extern char*		pathshell(void);
2984887Schin extern char*		pathtemp(char*, size_t, const char*, const char*, int*);
2994887Schin extern char*		pathtmp(char*, const char*, const char*, int*);
3004887Schin extern char*		setenviron(const char*);
3014887Schin extern int		stracmp(const char*, const char*);
3024887Schin extern char*		strcopy(char*, const char*);
3034887Schin extern unsigned long	strelapsed(const char*, char**, int);
3044887Schin extern int		stresc(char*);
3054887Schin extern long		streval(const char*, char**, long(*)(const char*, char**));
3064887Schin extern long		strexpr(const char*, char**, long(*)(const char*, char**, void*), void*);
3074887Schin extern int		strgid(const char*);
3084887Schin extern int		strgrpmatch(const char*, const char*, int*, int, int);
3094887Schin extern unsigned int	strhash(const char*);
3104887Schin extern void*		strlook(const void*, size_t, const char*);
3114887Schin extern int		strmatch(const char*, const char*);
3124887Schin extern int		strmode(const char*);
3134887Schin extern int		strnacmp(const char*, const char*, size_t);
3144887Schin extern char*		strncopy(char*, const char*, size_t);
31510898Sroland.mainz@nrubsig.org extern int		strnpcmp(const char*, const char*, size_t);
3164887Schin extern double		strntod(const char*, size_t, char**);
3174887Schin extern _ast_fltmax_t	strntold(const char*, size_t, char**);
3184887Schin extern long		strntol(const char*, size_t, char**, int);
3194887Schin extern intmax_t		strntoll(const char*, size_t, char**, int);
3208462SApril.Chin@Sun.COM extern long		strnton(const char*, size_t, char**, char*, int);
3214887Schin extern unsigned long	strntoul(const char*, size_t, char**, int);
3228462SApril.Chin@Sun.COM extern intmax_t		strntonll(const char*, size_t, char**, char*, int);
3234887Schin extern uintmax_t	strntoull(const char*, size_t, char**, int);
32410898Sroland.mainz@nrubsig.org extern int		strnvcmp(const char*, const char*, size_t);
3254887Schin extern int		stropt(const char*, const void*, int, int(*)(void*, const void*, int, const char*), void*);
32610898Sroland.mainz@nrubsig.org extern int		strpcmp(const char*, const char*);
3274887Schin extern int		strperm(const char*, char**, int);
3284887Schin extern void*		strpsearch(const void*, size_t, size_t, const char*, char**);
3294887Schin extern void*		strsearch(const void*, size_t, size_t, Strcmp_f, const char*, void*);
3304887Schin extern void		strsort(char**, int, int(*)(const char*, const char*));
3314887Schin extern char*		strsubmatch(const char*, const char*, int);
3324887Schin extern unsigned long	strsum(const char*, unsigned long);
3334887Schin extern char*		strtape(const char*, char**);
3344887Schin extern int		strtoip4(const char*, char**, uint32_t*, unsigned char*);
3354887Schin extern long		strton(const char*, char**, char*, int);
3364887Schin extern intmax_t		strtonll(const char*, char**, char*, int);
3374887Schin extern int		struid(const char*);
3384887Schin extern int		struniq(char**, int);
33910898Sroland.mainz@nrubsig.org extern int		strvcmp(const char*, const char*);
3404887Schin 
3414887Schin #undef			extern
3424887Schin 
3434887Schin /*
3444887Schin  * C library global data symbols not prototyped by <unistd.h>
3454887Schin  */
3464887Schin 
3474887Schin #if !defined(environ) && defined(__DYNAMIC__)
3484887Schin #define	environ		__DYNAMIC__(environ)
3494887Schin #else
3504887Schin extern char**		environ;
3514887Schin #endif
3524887Schin 
3534887Schin /*
3544887Schin  * really handy malloc()/free() (__FILE__,__LINE__,__FUNCTION__) tracing
3554887Schin  * make with VMDEBUG==1 or debug=1 or CCFLAGS=$(CC.DEBUG)
3564887Schin  * VMDEBUG==0 disables
3574887Schin  * at runtime export VMDEBUG or VMTRACE per vmalloc.3
3584887Schin  * to list originating call locations
3594887Schin  */
3604887Schin 
3614887Schin #if !_std_malloc && !defined(VMFL) && !defined(_VMHDR_H) && \
3624887Schin 	(!defined(VMDEBUG) || VMDEBUG) && (VMDEBUG || _BLD_DEBUG)
3634887Schin 
3644887Schin #define VMFL	1
3654887Schin #include <vmalloc.h>
3664887Schin 
3674887Schin #endif
3684887Schin 
3694887Schin #endif
370