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