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