1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2012 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
19da2e3ebdSchin *                   Phong Vo <kpv@research.att.com>                    *
20da2e3ebdSchin *                                                                      *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin  * Advanced Software Technology Library
25da2e3ebdSchin  * AT&T Research
26da2e3ebdSchin  *
27da2e3ebdSchin  * std + posix + ast
28da2e3ebdSchin  */
29da2e3ebdSchin 
30da2e3ebdSchin #ifndef _AST_H
31da2e3ebdSchin #define _AST_H
32da2e3ebdSchin 
33da2e3ebdSchin #ifndef _AST_STD_H
34da2e3ebdSchin #include <ast_std.h>
35da2e3ebdSchin #endif
36da2e3ebdSchin 
37da2e3ebdSchin #ifndef _SFIO_H
38da2e3ebdSchin #include <sfio.h>
39da2e3ebdSchin #endif
40da2e3ebdSchin 
41da2e3ebdSchin #ifndef	ast
42da2e3ebdSchin #define ast		_ast_info
43da2e3ebdSchin #endif
44da2e3ebdSchin 
45da2e3ebdSchin #ifndef PATH_MAX
46da2e3ebdSchin #define PATH_MAX	1024
47da2e3ebdSchin #endif
48da2e3ebdSchin 
49da2e3ebdSchin /*
50da2e3ebdSchin  * workaround botched headers that assume <stdio.h>
51da2e3ebdSchin  */
52da2e3ebdSchin 
53da2e3ebdSchin #ifndef FILE
54da2e3ebdSchin #ifndef _SFIO_H
55da2e3ebdSchin struct _sfio_s;
56da2e3ebdSchin #endif
57da2e3ebdSchin #define FILE		struct _sfio_s
58da2e3ebdSchin #ifndef	__FILE_typedef
59da2e3ebdSchin #define __FILE_typedef	1
60da2e3ebdSchin #endif
61da2e3ebdSchin #ifndef _FILEDEFED
62da2e3ebdSchin #define _FILEDEFED	1
63da2e3ebdSchin #endif
64da2e3ebdSchin #endif
65da2e3ebdSchin 
66da2e3ebdSchin /*
67da2e3ebdSchin  * exit() support -- this matches shell exit codes
68da2e3ebdSchin  */
69da2e3ebdSchin 
70da2e3ebdSchin #define EXIT_BITS	8			/* # exit status bits	*/
71da2e3ebdSchin 
72da2e3ebdSchin #define EXIT_USAGE	2			/* usage exit code	*/
73da2e3ebdSchin #define EXIT_QUIT	((1<<(EXIT_BITS))-1)	/* parent should quit	*/
74da2e3ebdSchin #define EXIT_NOTFOUND	((1<<(EXIT_BITS-1))-1)	/* command not found	*/
75da2e3ebdSchin #define EXIT_NOEXEC	((1<<(EXIT_BITS-1))-2)	/* other exec error	*/
76da2e3ebdSchin 
77da2e3ebdSchin #define EXIT_CODE(x)	((x)&((1<<EXIT_BITS)-1))
78da2e3ebdSchin #define EXIT_CORE(x)	(EXIT_CODE(x)|(1<<EXIT_BITS)|(1<<(EXIT_BITS-1)))
79da2e3ebdSchin #define EXIT_TERM(x)	(EXIT_CODE(x)|(1<<EXIT_BITS))
80da2e3ebdSchin 
81da2e3ebdSchin /*
82da2e3ebdSchin  * NOTE: for compatibility the following work for EXIT_BITS={7,8}
83da2e3ebdSchin  */
84da2e3ebdSchin 
85da2e3ebdSchin #define EXIT_STATUS(x)	(((x)&((1<<(EXIT_BITS-2))-1))?(x):EXIT_CODE((x)>>EXIT_BITS))
86da2e3ebdSchin 
87da2e3ebdSchin #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))))
88da2e3ebdSchin #define EXITED_TERM(x)	((x)&((1<<EXIT_BITS)|(1<<(EXIT_BITS-1))))
89da2e3ebdSchin 
90da2e3ebdSchin /*
91da2e3ebdSchin  * astconflist() flags
92da2e3ebdSchin  */
93da2e3ebdSchin 
94da2e3ebdSchin #define ASTCONF_parse		0x0001
95da2e3ebdSchin #define ASTCONF_write		0x0002
96da2e3ebdSchin #define ASTCONF_read		0x0004
97da2e3ebdSchin #define ASTCONF_lower		0x0008
98da2e3ebdSchin #define ASTCONF_base		0x0010
99da2e3ebdSchin #define ASTCONF_defined		0x0020
100da2e3ebdSchin #define ASTCONF_quote		0x0040
101da2e3ebdSchin #define ASTCONF_table		0x0080
102da2e3ebdSchin #define ASTCONF_matchcall	0x0100
103da2e3ebdSchin #define ASTCONF_matchname	0x0200
104da2e3ebdSchin #define ASTCONF_matchstandard	0x0400
105da2e3ebdSchin #define ASTCONF_error		0x0800
106da2e3ebdSchin #define ASTCONF_system		0x1000
107da2e3ebdSchin #define ASTCONF_AST		0x2000
108da2e3ebdSchin 
109da2e3ebdSchin /*
110da2e3ebdSchin  * pathcanon() flags
111da2e3ebdSchin  */
112da2e3ebdSchin 
113da2e3ebdSchin #define PATH_PHYSICAL	01
114da2e3ebdSchin #define PATH_DOTDOT	02
115da2e3ebdSchin #define PATH_EXISTS	04
116da2e3ebdSchin #define PATH_VERIFIED(n) (((n)&01777)<<5)
117da2e3ebdSchin 
118da2e3ebdSchin /*
119da2e3ebdSchin  * pathaccess() flags
120da2e3ebdSchin  */
121da2e3ebdSchin 
122da2e3ebdSchin #define PATH_READ	004
123da2e3ebdSchin #define PATH_WRITE	002
124da2e3ebdSchin #define PATH_EXECUTE	001
125da2e3ebdSchin #define	PATH_REGULAR	010
126da2e3ebdSchin #define PATH_ABSOLUTE	020
127da2e3ebdSchin 
128da2e3ebdSchin /*
129da2e3ebdSchin  * touch() flags
130da2e3ebdSchin  */
131da2e3ebdSchin 
132da2e3ebdSchin #define PATH_TOUCH_CREATE	01
133da2e3ebdSchin #define PATH_TOUCH_VERBATIM	02
134da2e3ebdSchin 
135da2e3ebdSchin /*
136da2e3ebdSchin  * pathcheck() info
137da2e3ebdSchin  */
138da2e3ebdSchin 
139da2e3ebdSchin typedef struct
140da2e3ebdSchin {
141da2e3ebdSchin 	unsigned long	date;
142da2e3ebdSchin 	char*		feature;
143da2e3ebdSchin 	char*		host;
144da2e3ebdSchin 	char*		user;
145da2e3ebdSchin } Pathcheck_t;
146da2e3ebdSchin 
147da2e3ebdSchin /*
148da2e3ebdSchin  * strgrpmatch() flags
149da2e3ebdSchin  */
150da2e3ebdSchin 
151da2e3ebdSchin #define STR_MAXIMAL	01		/* maximal match		*/
152da2e3ebdSchin #define STR_LEFT	02		/* implicit left anchor		*/
153da2e3ebdSchin #define STR_RIGHT	04		/* implicit right anchor	*/
154da2e3ebdSchin #define STR_ICASE	010		/* ignore case			*/
155da2e3ebdSchin #define STR_GROUP	020		/* (|&) inside [@|&](...) only	*/
156da2e3ebdSchin 
157da2e3ebdSchin /*
158da2e3ebdSchin  * fmtquote() flags
159da2e3ebdSchin  */
160da2e3ebdSchin 
161da2e3ebdSchin #define FMT_ALWAYS	0x01		/* always quote			*/
162da2e3ebdSchin #define FMT_ESCAPED	0x02		/* already escaped		*/
163da2e3ebdSchin #define FMT_SHELL	0x04		/* escape $ ` too		*/
164da2e3ebdSchin #define FMT_WIDE	0x08		/* don't escape 8 bit chars	*/
165da2e3ebdSchin #define FMT_PARAM	0x10		/* disable FMT_SHELL ${$( quote	*/
166da2e3ebdSchin 
167*b30d1939SAndy Fiddaman /*
168*b30d1939SAndy Fiddaman  * chrexp() flags
169*b30d1939SAndy Fiddaman  */
170*b30d1939SAndy Fiddaman 
171*b30d1939SAndy Fiddaman #define FMT_EXP_CHAR	0x020		/* expand single byte chars	*/
172*b30d1939SAndy Fiddaman #define FMT_EXP_LINE	0x040		/* expand \n and \r		*/
173*b30d1939SAndy Fiddaman #define FMT_EXP_WIDE	0x080		/* expand \u \U \x wide chars	*/
174*b30d1939SAndy Fiddaman #define FMT_EXP_NOCR	0x100		/* skip \r			*/
175*b30d1939SAndy Fiddaman #define FMT_EXP_NONL	0x200		/* skip \n			*/
176*b30d1939SAndy Fiddaman 
177da2e3ebdSchin /*
178da2e3ebdSchin  * multibyte macros
179da2e3ebdSchin  */
180da2e3ebdSchin 
181da2e3ebdSchin #define mbmax()		(ast.mb_cur_max)
182da2e3ebdSchin #define mberr()		(ast.tmp_int<0)
183da2e3ebdSchin 
184da2e3ebdSchin #define mbcoll()	(ast.mb_xfrm!=0)
185da2e3ebdSchin #define mbwide()	(mbmax()>1)
186da2e3ebdSchin 
187*b30d1939SAndy Fiddaman #define mb2wc(w,p,n)	(*ast.mb_towc)(&w,(char*)p,n)
18834f9b3eeSRoland Mainz #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++)))
189*b30d1939SAndy Fiddaman #define mbnchar(p,n)	(mbwide()?((ast.tmp_int=(*ast.mb_towc)(&ast.tmp_wchar,(char*)(p),n))>0?((p+=ast.tmp_int),ast.tmp_wchar):(p+=ast.mb_sync+1,ast.tmp_int)):(*(unsigned char*)(p++)))
190da2e3ebdSchin #define mbinit()	(mbwide()?(*ast.mb_towc)((wchar_t*)0,(char*)0,mbmax()):0)
191da2e3ebdSchin #define mbsize(p)	(mbwide()?(*ast.mb_len)((char*)(p),mbmax()):((p),1))
192*b30d1939SAndy Fiddaman #define mbnsize(p,n)	(mbwide()?(*ast.mb_len)((char*)(p),n):((p),1))
193da2e3ebdSchin #define mbconv(s,w)	(ast.mb_conv?(*ast.mb_conv)(s,w):((*(s)=(w)),1))
194*b30d1939SAndy Fiddaman #define mbwidth(w)	(ast.mb_width?(*ast.mb_width)(w):1)
195da2e3ebdSchin #define mbxfrm(t,f,n)	(mbcoll()?(*ast.mb_xfrm)((char*)(t),(char*)(f),n):0)
196*b30d1939SAndy Fiddaman #define mbalpha(w)	(ast.mb_alpha?(*ast.mb_alpha)(w):isalpha((w)&0xff))
197da2e3ebdSchin 
198da2e3ebdSchin /*
199da2e3ebdSchin  * common macros
200da2e3ebdSchin  */
201da2e3ebdSchin 
202da2e3ebdSchin #define elementsof(x)	(sizeof(x)/sizeof(x[0]))
203da2e3ebdSchin #define integralof(x)	(((char*)(x))-((char*)0))
204da2e3ebdSchin #define newof(p,t,n,x)	((p)?(t*)realloc((char*)(p),sizeof(t)*(n)+(x)):(t*)calloc(1,sizeof(t)*(n)+(x)))
205da2e3ebdSchin #define oldof(p,t,n,x)	((p)?(t*)realloc((char*)(p),sizeof(t)*(n)+(x)):(t*)malloc(sizeof(t)*(n)+(x)))
206da2e3ebdSchin #define pointerof(x)	((void*)((char*)0+(x)))
207da2e3ebdSchin #define roundof(x,y)	(((x)+(y)-1)&~((y)-1))
208da2e3ebdSchin #define ssizeof(x)	((int)sizeof(x))
209da2e3ebdSchin 
210da2e3ebdSchin #define streq(a,b)	(*(a)==*(b)&&!strcmp(a,b))
211da2e3ebdSchin #define strneq(a,b,n)	(*(a)==*(b)&&!strncmp(a,b,n))
212da2e3ebdSchin #define strsignal(s)	fmtsignal(s)
213da2e3ebdSchin 
214da2e3ebdSchin #if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
215da2e3ebdSchin #define NiL		0
216da2e3ebdSchin #define NoP(x)		(void)(x)
217da2e3ebdSchin #else
218da2e3ebdSchin #define NiL		((char*)0)
219da2e3ebdSchin #define NoP(x)		(&x,1)
220da2e3ebdSchin #endif
221da2e3ebdSchin 
222da2e3ebdSchin #if !defined(NoF)
223da2e3ebdSchin #define NoF(x)		void _DATA_ ## x () {}
224da2e3ebdSchin #if !defined(_DATA_)
225da2e3ebdSchin #define _DATA_
226da2e3ebdSchin #endif
227da2e3ebdSchin #endif
228da2e3ebdSchin 
229da2e3ebdSchin #if !defined(NoN)
230da2e3ebdSchin #define NoN(x)		void _STUB_ ## x () {}
231da2e3ebdSchin #if !defined(_STUB_)
232da2e3ebdSchin #define _STUB_
233da2e3ebdSchin #endif
234da2e3ebdSchin #endif
235da2e3ebdSchin 
236da2e3ebdSchin #define NOT_USED(x)	NoP(x)
237da2e3ebdSchin 
238da2e3ebdSchin typedef int (*Error_f)(void*, void*, int, ...);
239da2e3ebdSchin 
240da2e3ebdSchin typedef int (*Ast_confdisc_f)(const char*, const char*, const char*);
241da2e3ebdSchin typedef int (*Strcmp_context_f)(const char*, const char*, void*);
242da2e3ebdSchin typedef int (*Strcmp_f)(const char*, const char*);
243da2e3ebdSchin 
244da2e3ebdSchin #if _BLD_ast && defined(__EXPORT__)
245da2e3ebdSchin #define extern		__EXPORT__
246da2e3ebdSchin #endif
247da2e3ebdSchin 
248da2e3ebdSchin extern char*		astgetconf(const char*, const char*, const char*, int, Error_f);
249da2e3ebdSchin extern char*		astconf(const char*, const char*, const char*);
250da2e3ebdSchin extern Ast_confdisc_f	astconfdisc(Ast_confdisc_f);
251da2e3ebdSchin extern void		astconflist(Sfio_t*, const char*, int, const char*);
252da2e3ebdSchin extern off_t		astcopy(int, int, off_t);
253da2e3ebdSchin extern int		astlicense(char*, int, char*, char*, int, int, int);
254da2e3ebdSchin extern int		astquery(int, const char*, ...);
255da2e3ebdSchin extern void		astwinsize(int, int*, int*);
256da2e3ebdSchin 
257da2e3ebdSchin extern ssize_t		base64encode(const void*, size_t, void**, void*, size_t, void**);
258da2e3ebdSchin extern ssize_t		base64decode(const void*, size_t, void**, void*, size_t, void**);
259da2e3ebdSchin extern int		chresc(const char*, char**);
260*b30d1939SAndy Fiddaman extern int		chrexp(const char*, char**, int*, int);
261da2e3ebdSchin extern int		chrtoi(const char*);
262*b30d1939SAndy Fiddaman extern char*		conformance(const char*, size_t);
263da2e3ebdSchin extern int		eaccess(const char*, int);
264*b30d1939SAndy Fiddaman extern char*		fmtbase(intmax_t, int, int);
265*b30d1939SAndy Fiddaman #define fmtbasell(a,b,c) fmtbase(a,b,c) /* until 2014-01-01 */
266da2e3ebdSchin extern char*		fmtbuf(size_t);
267da2e3ebdSchin extern char*		fmtclock(Sfulong_t);
268da2e3ebdSchin extern char*		fmtelapsed(unsigned long, int);
269da2e3ebdSchin extern char*		fmterror(int);
270da2e3ebdSchin extern char*		fmtesc(const char*);
271da2e3ebdSchin extern char*		fmtesq(const char*, const char*);
272da2e3ebdSchin extern char*		fmtident(const char*);
273da2e3ebdSchin extern char*		fmtip4(uint32_t, int);
274da2e3ebdSchin extern char*		fmtfmt(const char*);
275da2e3ebdSchin extern char*		fmtgid(int);
276*b30d1939SAndy Fiddaman extern char*		fmtint(intmax_t, int);
277da2e3ebdSchin extern char*		fmtmatch(const char*);
278da2e3ebdSchin extern char*		fmtmode(int, int);
279da2e3ebdSchin extern char*		fmtnesq(const char*, const char*, size_t);
280da2e3ebdSchin extern char*		fmtnum(unsigned long, int);
281da2e3ebdSchin extern char*		fmtperm(int);
282da2e3ebdSchin extern char*		fmtquote(const char*, const char*, const char*, size_t, int);
283da2e3ebdSchin extern char*		fmtre(const char*);
284da2e3ebdSchin extern char*		fmtscale(Sfulong_t, int);
285da2e3ebdSchin extern char*		fmtsignal(int);
286da2e3ebdSchin extern char*		fmttime(const char*, time_t);
287da2e3ebdSchin extern char*		fmtuid(int);
288da2e3ebdSchin extern char*		fmtversion(unsigned long);
289da2e3ebdSchin extern void*		memdup(const void*, size_t);
290da2e3ebdSchin extern void		memfatal(void);
291da2e3ebdSchin extern unsigned int	memhash(const void*, int);
292da2e3ebdSchin extern unsigned long	memsum(const void*, int, unsigned long);
293da2e3ebdSchin extern char*		pathaccess(char*, const char*, const char*, const char*, int);
294*b30d1939SAndy Fiddaman extern char*		pathaccess_20100601(const char*, const char*, const char*, int, char*, size_t);
295da2e3ebdSchin extern char*		pathbin(void);
296da2e3ebdSchin extern char*		pathcanon(char*, int);
297*b30d1939SAndy Fiddaman extern char*		pathcanon_20100601(char*, size_t, int);
298da2e3ebdSchin extern char*		pathcat(char*, const char*, int, const char*, const char*);
299*b30d1939SAndy Fiddaman extern char*		pathcat_20100601(const char*, int, const char*, const char*, char*, size_t);
300da2e3ebdSchin extern int		pathcd(const char*, const char*);
301da2e3ebdSchin extern int		pathcheck(const char*, const char*, Pathcheck_t*);
302da2e3ebdSchin extern int		pathexists(char*, int);
303da2e3ebdSchin extern char*		pathfind(const char*, const char*, const char*, char*, size_t);
304da2e3ebdSchin extern int		pathgetlink(const char*, char*, int);
305da2e3ebdSchin extern int		pathinclude(const char*);
306da2e3ebdSchin extern char*		pathkey(char*, char*, const char*, const char*, const char*);
307*b30d1939SAndy Fiddaman extern char*		pathkey_20100601(const char*, const char*, const char*, char*, size_t, char*, size_t);
308da2e3ebdSchin extern size_t		pathnative(const char*, char*, size_t);
309da2e3ebdSchin extern char*		pathpath(char*, const char*, const char*, int);
310*b30d1939SAndy Fiddaman extern char*		pathpath_20100601(const char*, const char*, int, char*, size_t);
311da2e3ebdSchin extern size_t		pathposix(const char*, char*, size_t);
312da2e3ebdSchin extern char*		pathprobe(char*, char*, const char*, const char*, const char*, int);
313*b30d1939SAndy Fiddaman extern char*		pathprobe_20100601(const char*, const char*, const char*, int, char*, size_t, char*, size_t);
31434f9b3eeSRoland Mainz extern size_t		pathprog(const char*, char*, size_t);
315da2e3ebdSchin extern char*		pathrepl(char*, const char*, const char*);
316*b30d1939SAndy Fiddaman extern char*		pathrepl_20100601(char*, size_t, const char*, const char*);
317da2e3ebdSchin extern int		pathsetlink(const char*, const char*);
318da2e3ebdSchin extern char*		pathshell(void);
319da2e3ebdSchin extern char*		pathtemp(char*, size_t, const char*, const char*, int*);
320da2e3ebdSchin extern char*		pathtmp(char*, const char*, const char*, int*);
321da2e3ebdSchin extern char*		setenviron(const char*);
322da2e3ebdSchin extern int		stracmp(const char*, const char*);
323da2e3ebdSchin extern char*		strcopy(char*, const char*);
324da2e3ebdSchin extern unsigned long	strelapsed(const char*, char**, int);
325da2e3ebdSchin extern int		stresc(char*);
326*b30d1939SAndy Fiddaman extern int		strexp(char*, int);
327da2e3ebdSchin extern long		streval(const char*, char**, long(*)(const char*, char**));
328da2e3ebdSchin extern long		strexpr(const char*, char**, long(*)(const char*, char**, void*), void*);
329da2e3ebdSchin extern int		strgid(const char*);
330da2e3ebdSchin extern int		strgrpmatch(const char*, const char*, int*, int, int);
331*b30d1939SAndy Fiddaman extern int		strgrpmatch_20120528(const char*, const char*, ssize_t*, int, int);
332da2e3ebdSchin extern unsigned int	strhash(const char*);
333da2e3ebdSchin extern void*		strlook(const void*, size_t, const char*);
334da2e3ebdSchin extern int		strmatch(const char*, const char*);
335da2e3ebdSchin extern int		strmode(const char*);
336da2e3ebdSchin extern int		strnacmp(const char*, const char*, size_t);
337da2e3ebdSchin extern char*		strncopy(char*, const char*, size_t);
33834f9b3eeSRoland Mainz extern int		strnpcmp(const char*, const char*, size_t);
339da2e3ebdSchin extern double		strntod(const char*, size_t, char**);
340da2e3ebdSchin extern _ast_fltmax_t	strntold(const char*, size_t, char**);
341da2e3ebdSchin extern long		strntol(const char*, size_t, char**, int);
342da2e3ebdSchin extern intmax_t		strntoll(const char*, size_t, char**, int);
3437c2fbfb3SApril Chin extern long		strnton(const char*, size_t, char**, char*, int);
344da2e3ebdSchin extern unsigned long	strntoul(const char*, size_t, char**, int);
3457c2fbfb3SApril Chin extern intmax_t		strntonll(const char*, size_t, char**, char*, int);
346da2e3ebdSchin extern uintmax_t	strntoull(const char*, size_t, char**, int);
34734f9b3eeSRoland Mainz extern int		strnvcmp(const char*, const char*, size_t);
348da2e3ebdSchin extern int		stropt(const char*, const void*, int, int(*)(void*, const void*, int, const char*), void*);
34934f9b3eeSRoland Mainz extern int		strpcmp(const char*, const char*);
350da2e3ebdSchin extern int		strperm(const char*, char**, int);
351da2e3ebdSchin extern void*		strpsearch(const void*, size_t, size_t, const char*, char**);
352da2e3ebdSchin extern void*		strsearch(const void*, size_t, size_t, Strcmp_f, const char*, void*);
353da2e3ebdSchin extern void		strsort(char**, int, int(*)(const char*, const char*));
354da2e3ebdSchin extern char*		strsubmatch(const char*, const char*, int);
355da2e3ebdSchin extern unsigned long	strsum(const char*, unsigned long);
356da2e3ebdSchin extern char*		strtape(const char*, char**);
357da2e3ebdSchin extern int		strtoip4(const char*, char**, uint32_t*, unsigned char*);
358da2e3ebdSchin extern long		strton(const char*, char**, char*, int);
359da2e3ebdSchin extern intmax_t		strtonll(const char*, char**, char*, int);
360da2e3ebdSchin extern int		struid(const char*);
361da2e3ebdSchin extern int		struniq(char**, int);
36234f9b3eeSRoland Mainz extern int		strvcmp(const char*, const char*);
363*b30d1939SAndy Fiddaman extern int		wc2utf8(char*, uint32_t);
364da2e3ebdSchin 
365da2e3ebdSchin #undef			extern
366da2e3ebdSchin 
367da2e3ebdSchin /*
368da2e3ebdSchin  * C library global data symbols not prototyped by <unistd.h>
369da2e3ebdSchin  */
370da2e3ebdSchin 
371da2e3ebdSchin #if !defined(environ) && defined(__DYNAMIC__)
372da2e3ebdSchin #define	environ		__DYNAMIC__(environ)
373da2e3ebdSchin #else
374da2e3ebdSchin extern char**		environ;
375da2e3ebdSchin #endif
376da2e3ebdSchin 
377da2e3ebdSchin /*
378da2e3ebdSchin  * really handy malloc()/free() (__FILE__,__LINE__,__FUNCTION__) tracing
379da2e3ebdSchin  * make with VMDEBUG==1 or debug=1 or CCFLAGS=$(CC.DEBUG)
380da2e3ebdSchin  * VMDEBUG==0 disables
381*b30d1939SAndy Fiddaman  * at runtime export VMALLOC_OPTIONS per vmalloc.3
382da2e3ebdSchin  * to list originating call locations
383da2e3ebdSchin  */
384da2e3ebdSchin 
385da2e3ebdSchin #if !_std_malloc && !defined(VMFL) && !defined(_VMHDR_H) && \
386*b30d1939SAndy Fiddaman 	(VMDEBUG || !defined(VMDEBUG) && _BLD_DEBUG)
387da2e3ebdSchin 
388da2e3ebdSchin #define VMFL	1
389da2e3ebdSchin #include <vmalloc.h>
390da2e3ebdSchin 
391da2e3ebdSchin #endif
392da2e3ebdSchin 
393*b30d1939SAndy Fiddaman #include <ast_api.h>
394*b30d1939SAndy Fiddaman 
395*b30d1939SAndy Fiddaman #undef	AST_PLUGIN_VERSION
396*b30d1939SAndy Fiddaman #define AST_PLUGIN_VERSION(v)	((v)>AST_VERSION?(v):AST_VERSION)
397*b30d1939SAndy Fiddaman 
398*b30d1939SAndy Fiddaman #if defined(__EXPORT__)
399*b30d1939SAndy Fiddaman #define extern		__EXPORT__
400*b30d1939SAndy Fiddaman #endif
401*b30d1939SAndy Fiddaman 
402*b30d1939SAndy Fiddaman extern unsigned long	plugin_version(void);
403*b30d1939SAndy Fiddaman 
404*b30d1939SAndy Fiddaman #undef	extern
405*b30d1939SAndy Fiddaman 
406da2e3ebdSchin #endif
407