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