xref: /inferno-os/AIX/power/include/lib9.h (revision 0195c4e25fc394097552c7f5ebf3085ec2d201f5)
1 #define _DEFAULT_SOURCE
2 #define _BSD_SOURCE
3 #define _LINUX_SOURCE_COMPAT
4 #define _XOPEN_SOURCE  500
5 #define _LARGEFILE_SOURCE	1
6 #define _LARGEFILE64_SOURCE	1
7 #define _FILE_OFFSET_BITS 64
8 
9 #include <sys/types.h>
10 #include <sys/stat.h>
11 #include <stdlib.h>
12 #include <stdarg.h>
13 #define sync __os_sync
14 #include <unistd.h>
15 #undef sync
16 #include <errno.h>
17 #define __NO_STRING_INLINES
18 #include <string.h>
19 #include "math.h"
20 #include <fcntl.h>
21 #include <setjmp.h>
22 #include <float.h>
23 
24 #define	getwd	infgetwd
25 
26 #ifndef EMU
27 typedef struct Proc Proc;
28 #endif
29 
30 #undef __LITTLE_ENDIAN
31 
32 #define	nil		((void*)0)
33 
34 typedef unsigned char	uchar;
35 typedef signed char	schar;
36 typedef unsigned int Rune;
37 typedef long long int	vlong;
38 typedef unsigned long long int	uvlong;
39 typedef unsigned int u32int;
40 typedef uvlong u64int;
41 typedef unsigned long ulong;
42 typedef unsigned short ushort;
43 typedef unsigned int uint;
44 
45 typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
46 typedef unsigned short u16int;
47 typedef unsigned char u8int;
48 typedef unsigned long uintptr;
49 
50 #define	USED(x)		if(x){}else{}
51 #define	SET(x)
52 
53 #undef nelem
54 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
55 #undef offsetof
56 #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
57 #undef assert
58 #define	assert(x)	if(x){}else _assert("x")
59 
60 /*
61  * most mem and string routines are declared by ANSI/POSIX files above
62  */
63 
64 extern	char*	strecpy(char*, char*, char*);
65 extern	char*	strdup(const char*);
66 extern	int	cistrncmp(char*, char*, int);
67 extern	int	cistrcmp(char*, char*);
68 extern	char*	cistrstr(char*, char*);
69 extern	int	tokenize(char*, char**, int);
70 
71 enum
72 {
73 	UTFmax		= 4,		/* maximum bytes per rune */
74 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
75 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
76 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
77 	Runemax		= 0x10FFFF,	/* 21-bit rune */
78 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
79 };
80 
81 /*
82  * rune routines
83  */
84 extern	int	runetochar(char*, Rune*);
85 extern	int	chartorune(Rune*, char*);
86 extern	int	runelen(long);
87 extern	int	runenlen(Rune*, int);
88 extern	int	fullrune(char*, int);
89 extern	int	utflen(char*);
90 extern	int	utfnlen(char*, long);
91 extern	char*	utfrune(char*, long);
92 extern	char*	utfrrune(char*, long);
93 extern	char*	utfutf(char*, char*);
94 extern	char*	utfecpy(char*, char*, char*);
95 
96 extern	Rune*	runestrcat(Rune*, Rune*);
97 extern	Rune*	runestrchr(Rune*, Rune);
98 extern	int	runestrcmp(Rune*, Rune*);
99 extern	Rune*	runestrcpy(Rune*, Rune*);
100 extern	Rune*	runestrncpy(Rune*, Rune*, long);
101 extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
102 extern	Rune*	runestrdup(Rune*);
103 extern	Rune*	runestrncat(Rune*, Rune*, long);
104 extern	int	runestrncmp(Rune*, Rune*, long);
105 extern	Rune*	runestrrchr(Rune*, Rune);
106 extern	long	runestrlen(Rune*);
107 extern	Rune*	runestrstr(Rune*, Rune*);
108 
109 extern	Rune	tolowerrune(Rune);
110 extern	Rune	totitlerune(Rune);
111 extern	Rune	toupperrune(Rune);
112 extern	int	isalpharune(Rune);
113 extern	int	islowerrune(Rune);
114 extern	int	isspacerune(Rune);
115 extern	int	istitlerune(Rune);
116 extern	int	isupperrune(Rune);
117 
118 /*
119  * malloc
120  */
121 extern	void*	malloc(size_t);
122 extern	void*	mallocz(ulong, int);
123 extern	void	free(void*);
124 extern	ulong	msize(void*);
125 extern	void*	calloc(size_t, size_t);
126 extern	void*	realloc(void*, size_t);
127 extern	void		setmalloctag(void*, ulong);
128 extern	void		setrealloctag(void*, ulong);
129 extern	ulong	getmalloctag(void*);
130 extern	ulong	getrealloctag(void*);
131 extern	void*	malloctopoolblock(void*);
132 
133 /*
134  * print routines
135  */
136 typedef struct Fmt	Fmt;
137 struct Fmt{
138 	uchar	runes;			/* output buffer is runes or chars? */
139 	void	*start;			/* of buffer */
140 	void	*to;			/* current place in the buffer */
141 	void	*stop;			/* end of the buffer; overwritten if flush fails */
142 	int	(*flush)(Fmt *);	/* called when to == stop */
143 	void	*farg;			/* to make flush a closure */
144 	int	nfmt;			/* num chars formatted so far */
145 	va_list	args;			/* args passed to dofmt */
146 	int	r;			/* % format Rune */
147 	int	width;
148 	int	prec;
149 	ulong	flags;
150 };
151 
152 enum{
153 	FmtWidth	= 1,
154 	FmtLeft		= FmtWidth << 1,
155 	FmtPrec		= FmtLeft << 1,
156 	FmtSharp	= FmtPrec << 1,
157 	FmtSpace	= FmtSharp << 1,
158 	FmtSign		= FmtSpace << 1,
159 	FmtZero		= FmtSign << 1,
160 	FmtUnsigned	= FmtZero << 1,
161 	FmtShort	= FmtUnsigned << 1,
162 	FmtLong		= FmtShort << 1,
163 	FmtVLong	= FmtLong << 1,
164 	FmtComma	= FmtVLong << 1,
165 	FmtByte	= FmtComma << 1,
166 
167 	FmtFlag		= FmtByte << 1
168 };
169 
170 extern	int	print(char*, ...);
171 extern	char*	seprint(char*, char*, char*, ...);
172 extern	char*	vseprint(char*, char*, char*, va_list);
173 extern	int	snprint(char*, int, char*, ...);
174 extern	int	vsnprint(char*, int, char*, va_list);
175 extern	char*	smprint(char*, ...);
176 extern	char*	vsmprint(char*, va_list);
177 extern	int	sprint(char*, char*, ...);
178 extern	int	fprint(int, char*, ...);
179 extern	int	vfprint(int, char*, va_list);
180 
181 extern	int	runesprint(Rune*, char*, ...);
182 extern	int	runesnprint(Rune*, int, char*, ...);
183 extern	int	runevsnprint(Rune*, int, char*, va_list);
184 extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
185 extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
186 extern	Rune*	runesmprint(char*, ...);
187 extern	Rune*	runevsmprint(char*, va_list);
188 
189 extern	int	fmtfdinit(Fmt*, int, char*, int);
190 extern	int	fmtfdflush(Fmt*);
191 extern	int	fmtstrinit(Fmt*);
192 extern	char*	fmtstrflush(Fmt*);
193 extern	int	runefmtstrinit(Fmt*);
194 extern	Rune*	runefmtstrflush(Fmt*);
195 
196 extern	int	fmtinstall(int, int (*)(Fmt*));
197 extern	int	dofmt(Fmt*, char*);
198 extern	int	dorfmt(Fmt*, Rune*);
199 extern	int	fmtprint(Fmt*, char*, ...);
200 extern	int	fmtvprint(Fmt*, char*, va_list);
201 extern	int	fmtrune(Fmt*, int);
202 extern	int	fmtstrcpy(Fmt*, char*);
203 extern	int	fmtrunestrcpy(Fmt*, Rune*);
204 /*
205  * error string for %r
206  * supplied on per os basis, not part of fmt library
207  */
208 extern	int	errfmt(Fmt *f);
209 
210 /*
211  * quoted strings
212  */
213 extern	char	*unquotestrdup(char*);
214 extern	Rune	*unquoterunestrdup(Rune*);
215 extern	char	*quotestrdup(char*);
216 extern	Rune	*quoterunestrdup(Rune*);
217 extern	int	quotestrfmt(Fmt*);
218 extern	int	quoterunestrfmt(Fmt*);
219 extern	void	quotefmtinstall(void);
220 extern	int	(*doquote)(int);
221 
222 /*
223  * random number
224  */
225 extern	ulong	truerand(void);
226 extern	ulong	ntruerand(ulong);
227 
228 /*
229  * math
230  */
231 extern	int	isNaN(double);
232 extern	double	NaN(void);
233 extern	int	isInf(double, int);
234 
235 /*
236  * Time-of-day
237  */
238 
239 typedef struct Tm Tm;
240 struct Tm {
241 	int	sec;
242 	int	min;
243 	int	hour;
244 	int	mday;
245 	int	mon;
246 	int	year;
247 	int	wday;
248 	int	yday;
249 	char	zone[4];
250 	int	tzoff;
251 };
252 extern	vlong	osnsec(void);
253 #define	nsec	osnsec
254 
255 /*
256  * one-of-a-kind
257  */
258 extern	void	_assert(char*);
259 extern	double	charstod(int(*)(void*), void*);
260 extern	char*	cleanname(char*);
261 extern	uintptr	getcallerpc(void*);
262 extern	int	getfields(char*, char**, int, int, char*);
263 extern	char*	getuser(void);
264 extern	char*	getwd(char*, int);
265 extern	double	ipow10(int);
266 #define	pow10	infpow10
267 extern	double	pow10(int);
268 extern	vlong	strtoll(const char*, char**, int);
269 #define	qsort	infqsort
270 extern	void	qsort(void*, long, long, int (*)(void*, void*));
271 extern	uvlong	strtoull(const char*, char**, int);
272 extern	void	sysfatal(char*, ...);
273 extern	int	dec64(uchar*, int, char*, int);
274 extern	int	enc64(char*, int, uchar*, int);
275 extern	int	dec32(uchar*, int, char*, int);
276 extern	int	enc32(char*, int, uchar*, int);
277 extern	int	dec16(uchar*, int, char*, int);
278 extern	int	enc16(char*, int, uchar*, int);
279 extern	int	encodefmt(Fmt*);
280 
281 /*
282  *  synchronization
283  */
284 typedef
285 struct Lock {
286 	int	val;
287 	int	pid;
288 } Lock;
289 
290 extern int	_tas(int*);
291 
292 extern	void	lock(Lock*);
293 extern	void	unlock(Lock*);
294 extern	int	canlock(Lock*);
295 
296 typedef struct QLock QLock;
297 struct QLock
298 {
299 	Lock	use;			/* to access Qlock structure */
300 	Proc	*head;			/* next process waiting for object */
301 	Proc	*tail;			/* last process waiting for object */
302 	int	locked;			/* flag */
303 };
304 
305 extern	void	qlock(QLock*);
306 extern	void	qunlock(QLock*);
307 extern	int	canqlock(QLock*);
308 extern	void	_qlockinit(ulong (*)(ulong, ulong));	/* called only by the thread library */
309 
310 typedef
311 struct RWLock
312 {
313 	Lock	l;			/* Lock modify lock */
314 	QLock	x;			/* Mutual exclusion lock */
315 	QLock	k;			/* Lock for waiting writers */
316 	int	readers;		/* Count of readers in lock */
317 } RWLock;
318 
319 extern	int	canrlock(RWLock*);
320 extern	int	canwlock(RWLock*);
321 extern	void	rlock(RWLock*);
322 extern	void	runlock(RWLock*);
323 extern	void	wlock(RWLock*);
324 extern	void	wunlock(RWLock*);
325 
326 /*
327  * network dialing
328  */
329 #define NETPATHLEN 40
330 
331 /*
332  * system calls
333  *
334  */
335 #define	STATMAX	65535U	/* max length of machine-independent stat structure */
336 #define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
337 #define	ERRMAX	128	/* max length of error string */
338 
339 #define	MORDER	0x0003	/* mask for bits defining order of mounting */
340 #define	MREPL	0x0000	/* mount replaces object */
341 #define	MBEFORE	0x0001	/* mount goes before others in union directory */
342 #define	MAFTER	0x0002	/* mount goes after others in union directory */
343 #define	MCREATE	0x0004	/* permit creation in mounted directory */
344 #define	MCACHE	0x0010	/* cache some data */
345 #define	MMASK	0x0017	/* all bits on */
346 
347 #define	OREAD	0	/* open for read */
348 #define	OWRITE	1	/* write */
349 #define	ORDWR	2	/* read and write */
350 #define	OEXEC	3	/* execute, == read but check execute permission */
351 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
352 #define	OCEXEC	32	/* or'ed in, close on exec */
353 #define	ORCLOSE	64	/* or'ed in, remove on close */
354 #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
355 
356 #define	AEXIST	0	/* accessible: exists */
357 #define	AEXEC	1	/* execute access */
358 #define	AWRITE	2	/* write access */
359 #define	AREAD	4	/* read access */
360 
361 /* bits in Qid.type */
362 #define QTDIR		0x80		/* type bit for directories */
363 #define QTAPPEND	0x40		/* type bit for append only files */
364 #define QTEXCL		0x20		/* type bit for exclusive use files */
365 #define QTMOUNT		0x10		/* type bit for mounted channel */
366 #define QTAUTH		0x08		/* type bit for authentication file */
367 #define QTFILE		0x00		/* plain file */
368 
369 /* bits in Dir.mode */
370 #define DMDIR		0x80000000	/* mode bit for directories */
371 #define DMAPPEND	0x40000000	/* mode bit for append only files */
372 #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
373 #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
374 #define DMAUTH		0x08000000	/* mode bit for authentication file */
375 #define DMREAD		0x4		/* mode bit for read permission */
376 #define DMWRITE		0x2		/* mode bit for write permission */
377 #define DMEXEC		0x1		/* mode bit for execute permission */
378 
379 typedef
380 struct Qid
381 {
382 	uvlong	path;
383 	ulong	vers;
384 	uchar	type;
385 } Qid;
386 
387 typedef
388 struct Dir {
389 	/* system-modified data */
390 	ushort	type;	/* server type */
391 	uint	dev;	/* server subtype */
392 	/* file data */
393 	Qid	qid;	/* unique id from server */
394 	ulong	mode;	/* permissions */
395 	ulong	atime;	/* last read time */
396 	ulong	mtime;	/* last write time */
397 	vlong	length;	/* file length */
398 	char	*name;	/* last element of path */
399 	char	*uid;	/* owner name */
400 	char	*gid;	/* group name */
401 	char	*muid;	/* last modifier name */
402 } Dir;
403 
404 extern	Dir*	dirstat(char*);
405 extern	Dir*	dirfstat(int);
406 extern	int	dirwstat(char*, Dir*);
407 extern	int	dirfwstat(int, Dir*);
408 extern	long	dirread(int, Dir**);
409 extern	void	nulldir(Dir*);
410 extern	long	dirreadall(int, Dir**);
411 
412 typedef
413 struct Waitmsg
414 {
415 	int pid;	/* of loved one */
416 	ulong time[3];	/* of loved one & descendants */
417 	char	*msg;
418 } Waitmsg;
419 
420 extern	void	_exits(char*);
421 
422 extern	void	exits(char*);
423 extern	int	create(char*, int, int);
424 extern	int	errstr(char*, uint);
425 
426 extern	void	perror(const char*);
427 extern	long	readn(int, void*, long);
428 extern	int	remove(const char*);
429 extern	void	rerrstr(char*, uint);
430 extern	vlong	seek(int, vlong, int);
431 extern	int	segflush(void*, ulong);
432 extern	void	werrstr(char*, ...);
433 
434 extern char *argv0;
435 #define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
436 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
437 			    argc--, argv++) {\
438 				char *_args, *_argt;\
439 				Rune _argc;\
440 				_args = &argv[0][1];\
441 				if(_args[0]=='-' && _args[1]==0){\
442 					argc--; argv++; break;\
443 				}\
444 				_argc = 0;\
445 				while(*_args && (_args += chartorune(&_argc, _args)))\
446 				switch(_argc)
447 #define	ARGEND		SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc);
448 #define	ARGF()		(_argt=_args, _args="",\
449 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
450 #define	EARGF(x)	(_argt=_args, _args="",\
451 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
452 
453 #define	ARGC()		_argc
454 
455 /*
456  *	Extensions for Inferno to basic libc.h
457  */
458 
459 #define	setbinmode()
460 
461 extern	void	setfcr(ulong);
462 extern	void	setfsr(ulong);
463 extern	ulong	getfcr(void);
464 extern	ulong	getfsr(void);
465 
466 
467 /* FPSCR */
468 #define	FPSFX	(1<<31)	/* exception summary (sticky) */
469 #define	FPSEX	(1<<30)	/* enabled exception summary */
470 #define	FPSVX	(1<<29)	/* invalid operation exception summary */
471 #define	FPSOX	(1<<28)	/* overflow exception OX (sticky) */
472 #define	FPSUX	(1<<27)	/* underflow exception UX (sticky) */
473 #define	FPSZX	(1<<26)	/* zero divide exception ZX (sticky) */
474 #define	FPSXX	(1<<25)	/* inexact exception XX (sticky) */
475 #define	FPSVXSNAN (1<<24)	/* invalid operation exception for SNaN (sticky) */
476 #define	FPSVXISI	(1<<23)	/* invalid operation exception for ∞-∞ (sticky) */
477 #define	FPSVXIDI	(1<<22)	/* invalid operation exception for ∞/∞ (sticky) */
478 #define	FPSVXZDZ (1<<21)	/* invalid operation exception for 0/0 (sticky) */
479 #define	FPSVXIMZ	(1<<20)	/* invalid operation exception for ∞*0 (sticky) */
480 #define	FPSVXVC	(1<<19)	/* invalid operation exception for invalid compare (sticky) */
481 #define	FPSFR	(1<<18)	/* fraction rounded */
482 #define	FPSFI	(1<<17)	/* fraction inexact */
483 #define	FPSFPRF	(1<<16)	/* floating point result class */
484 #define	FPSFPCC	(0xF<<12)	/* <, >, =, unordered */
485 #define	FPVXCVI	(1<<8)	/* enable exception for invalid integer convert (sticky) */
486 
487 /* FCR */
488 #define	FPVE	(1<<7)	/* invalid operation exception enable */
489 #define	FPOVFL	(1<<6)	/* enable overflow exceptions */
490 #define	FPUNFL	(1<<5)	/* enable underflow */
491 #define	FPZDIV	(1<<4)	/* enable zero divide */
492 #define	FPINEX	(1<<3)	/* enable inexact exceptions */
493 #define	FPRMASK	(3<<0)	/* rounding mode */
494 #define	FPRNR	(0<<0)
495 #define	FPRZ	(1<<0)
496 #define	FPRPINF	(2<<0)
497 #define	FPRNINF	(3<<0)
498 #define	FPPEXT	0
499 #define	FPPSGL	0
500 #define	FPPDBL	0
501 #define	FPPMASK	0
502 #define	FPINVAL	FPVE
503 /* FSR */
504 #define	FPAOVFL	FPSOX
505 #define	FPAINEX	FPSXX
506 #define	FPAUNFL	FPSUX
507 #define	FPAZDIV	FPSZX
508 #define	FPAINVAL	FPSVX
509 
510