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