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