xref: /inferno-os/MacOSX/power/include/lib9.h (revision 8e8fedb8e7cf4ae3a038c5ac8fbf1b6868e805f1)
137da2899SCharles.Forsyth /*
237da2899SCharles.Forsyth  * Based on FreeBSD lib9.h
337da2899SCharles.Forsyth  * Copyright © 1998, 1999 Lucent Technologies Inc.  All rights reserved.
437da2899SCharles.Forsyth  * Revisions Copyright © 1999, 2002 Vita Nuova Limited.  All rights reserved.
537da2899SCharles.Forsyth  * Revisions Copyright © 2002, 2003 Corpus Callosum Corporation.  All rights reserved.
637da2899SCharles.Forsyth  */
737da2899SCharles.Forsyth 
837da2899SCharles.Forsyth /* define _BSD_SOURCE to use ISO C, POSIX, and 4.4BSD things. */
937da2899SCharles.Forsyth #ifndef _BSD_SOURCE
1037da2899SCharles.Forsyth #define _BSD_SOURCE
1137da2899SCharles.Forsyth #endif
1237da2899SCharles.Forsyth #define _LARGEFILE64_SOURCE	1
1337da2899SCharles.Forsyth #define _FILE_OFFSET_BITS 64
1437da2899SCharles.Forsyth 
1537da2899SCharles.Forsyth #include <sys/types.h>
1637da2899SCharles.Forsyth #include <sys/stat.h>
1737da2899SCharles.Forsyth #include <stdlib.h>
1837da2899SCharles.Forsyth #include <stdarg.h>
1937da2899SCharles.Forsyth #include <unistd.h>
2037da2899SCharles.Forsyth #include <errno.h>
2137da2899SCharles.Forsyth #include <string.h>
2237da2899SCharles.Forsyth // #include "math.h"
2337da2899SCharles.Forsyth #include <fcntl.h>
2437da2899SCharles.Forsyth #include <setjmp.h>
2537da2899SCharles.Forsyth #include <float.h>
2637da2899SCharles.Forsyth #include <time.h>
2737da2899SCharles.Forsyth 
2837da2899SCharles.Forsyth #define nil		((void*)0)
2937da2899SCharles.Forsyth 
3037da2899SCharles.Forsyth // typedef	unsigned short	ushort;
3137da2899SCharles.Forsyth typedef	unsigned char	uchar;
3237da2899SCharles.Forsyth typedef unsigned long	ulong;
3337da2899SCharles.Forsyth // typedef unsigned int	uint;
3437da2899SCharles.Forsyth typedef	  signed char	schar;
3537da2899SCharles.Forsyth typedef	long long	vlong;
3637da2899SCharles.Forsyth typedef	unsigned long long	uvlong;
379f260b3bSCharles Forsyth typedef unsigned int Rune;
3837da2899SCharles.Forsyth typedef unsigned int	u32int;
39f1dcfd03Sforsyth typedef uvlong u64int;
40f1dcfd03Sforsyth 
4137da2899SCharles.Forsyth typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
4237da2899SCharles.Forsyth typedef unsigned short u16int;
4337da2899SCharles.Forsyth typedef unsigned char u8int;
4437da2899SCharles.Forsyth typedef unsigned long uintptr;
4537da2899SCharles.Forsyth 
46cd03a2dcSforsyth typedef signed char	int8;
47cd03a2dcSforsyth typedef unsigned char	uint8;
48cd03a2dcSforsyth typedef short	int16;
49cd03a2dcSforsyth typedef unsigned short	uint16;
50cd03a2dcSforsyth typedef int	int32;
51cd03a2dcSforsyth typedef unsigned int	uint32;
52cd03a2dcSforsyth typedef long long	int64;
53cd03a2dcSforsyth typedef unsigned long long	uint64;
54cd03a2dcSforsyth 
5537da2899SCharles.Forsyth /* handle conflicts with host os libs */
5637da2899SCharles.Forsyth #define	getwd	infgetwd
5737da2899SCharles.Forsyth #define scalb	infscalb
5837da2899SCharles.Forsyth #define div 	infdiv
5937da2899SCharles.Forsyth #define panic	infpanic
6037da2899SCharles.Forsyth #define rint	infrint
6137da2899SCharles.Forsyth #define	rcmd	infrcmd
6237da2899SCharles.Forsyth #define	pow10	infpow10
6337da2899SCharles.Forsyth 
6437da2899SCharles.Forsyth #ifndef EMU
6537da2899SCharles.Forsyth typedef struct Proc Proc;
6637da2899SCharles.Forsyth #endif
6737da2899SCharles.Forsyth 
6837da2899SCharles.Forsyth /*
6937da2899SCharles.Forsyth  * math module dtoa
7037da2899SCharles.Forsyth  */
7137da2899SCharles.Forsyth #include <machine/endian.h>
7237da2899SCharles.Forsyth #define __BIG_ENDIAN
7337da2899SCharles.Forsyth 
7437da2899SCharles.Forsyth #define	USED(x)		if(x){}else{}
7537da2899SCharles.Forsyth #define	SET(x)
7637da2899SCharles.Forsyth 
7737da2899SCharles.Forsyth #define nelem(x)	(sizeof(x)/sizeof((x)[0]))
788911721eSCharles.Forsyth #undef offsetof
798911721eSCharles.Forsyth #undef assert
8037da2899SCharles.Forsyth #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
8137da2899SCharles.Forsyth #define	assert(x)	if(x){}else _assert("x")
8237da2899SCharles.Forsyth 
8337da2899SCharles.Forsyth /*
8437da2899SCharles.Forsyth  * mem and string routines are declared by ANSI/POSIX files above
8537da2899SCharles.Forsyth  */
8637da2899SCharles.Forsyth 
8737da2899SCharles.Forsyth extern	char*	strecpy(char*, char*, char*);
8837da2899SCharles.Forsyth extern	char*	strdup(const char*);
8937da2899SCharles.Forsyth extern	int	cistrncmp(char*, char*, int);
9037da2899SCharles.Forsyth extern	int	cistrcmp(char*, char*);
9137da2899SCharles.Forsyth extern	char*	cistrstr(char*, char*);
9237da2899SCharles.Forsyth extern	int	tokenize(char*, char**, int);
9337da2899SCharles.Forsyth extern	vlong	strtoll(const char*, char**, int);
94ad4c862fSforsyth #define	qsort	infqsort
95ad4c862fSforsyth extern	void	qsort(void*, long, long, int (*)(void*, void*));
9637da2899SCharles.Forsyth 
9737da2899SCharles.Forsyth enum
9837da2899SCharles.Forsyth {
99d90014f6SCharles Forsyth 	UTFmax		= 4,		/* maximum bytes per rune */
10037da2899SCharles.Forsyth 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
10137da2899SCharles.Forsyth 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
102d90014f6SCharles Forsyth 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
103d90014f6SCharles Forsyth 	Runemax		= 0x10FFFF,	/* 21-bit rune */
104d90014f6SCharles Forsyth 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
10537da2899SCharles.Forsyth };
10637da2899SCharles.Forsyth 
10737da2899SCharles.Forsyth /*
10837da2899SCharles.Forsyth  * rune routines
10937da2899SCharles.Forsyth  */
11037da2899SCharles.Forsyth extern	int	runetochar(char*, Rune*);
11137da2899SCharles.Forsyth extern	int	chartorune(Rune*, char*);
11237da2899SCharles.Forsyth extern	int	runelen(long);
11337da2899SCharles.Forsyth extern	int	runenlen(Rune*, int);
11437da2899SCharles.Forsyth extern	int	fullrune(char*, int);
11537da2899SCharles.Forsyth extern	int	utflen(char*);
11637da2899SCharles.Forsyth extern	int	utfnlen(char*, long);
11737da2899SCharles.Forsyth extern	char*	utfrune(char*, long);
11837da2899SCharles.Forsyth extern	char*	utfrrune(char*, long);
11937da2899SCharles.Forsyth extern	char*	utfutf(char*, char*);
12037da2899SCharles.Forsyth extern	char*	utfecpy(char*, char*, char*);
12137da2899SCharles.Forsyth 
12237da2899SCharles.Forsyth extern	Rune*	runestrcat(Rune*, Rune*);
12337da2899SCharles.Forsyth extern	Rune*	runestrchr(Rune*, Rune);
12437da2899SCharles.Forsyth extern	int	runestrcmp(Rune*, Rune*);
12537da2899SCharles.Forsyth extern	Rune*	runestrcpy(Rune*, Rune*);
12637da2899SCharles.Forsyth extern	Rune*	runestrncpy(Rune*, Rune*, long);
12737da2899SCharles.Forsyth extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
12837da2899SCharles.Forsyth extern	Rune*	runestrdup(Rune*);
12937da2899SCharles.Forsyth extern	Rune*	runestrncat(Rune*, Rune*, long);
13037da2899SCharles.Forsyth extern	int	runestrncmp(Rune*, Rune*, long);
13137da2899SCharles.Forsyth extern	Rune*	runestrrchr(Rune*, Rune);
13237da2899SCharles.Forsyth extern	long	runestrlen(Rune*);
13337da2899SCharles.Forsyth extern	Rune*	runestrstr(Rune*, Rune*);
13437da2899SCharles.Forsyth 
13537da2899SCharles.Forsyth extern	Rune	tolowerrune(Rune);
13637da2899SCharles.Forsyth extern	Rune	totitlerune(Rune);
13737da2899SCharles.Forsyth extern	Rune	toupperrune(Rune);
13837da2899SCharles.Forsyth extern	int	isalpharune(Rune);
13937da2899SCharles.Forsyth extern	int	islowerrune(Rune);
14037da2899SCharles.Forsyth extern	int	isspacerune(Rune);
14137da2899SCharles.Forsyth extern	int	istitlerune(Rune);
14237da2899SCharles.Forsyth extern	int	isupperrune(Rune);
14337da2899SCharles.Forsyth 
14437da2899SCharles.Forsyth /*
14537da2899SCharles.Forsyth  * malloc
14637da2899SCharles.Forsyth  */
14737da2899SCharles.Forsyth extern	void*	malloc(size_t);
14837da2899SCharles.Forsyth extern	void*	mallocz(ulong, int);
14937da2899SCharles.Forsyth extern	void	free(void*);
15037da2899SCharles.Forsyth extern	ulong	msize(void*);
15137da2899SCharles.Forsyth extern	void*	calloc(size_t, size_t);
15237da2899SCharles.Forsyth extern	void*	realloc(void*, size_t);
15337da2899SCharles.Forsyth extern	void		setmalloctag(void*, ulong);
15437da2899SCharles.Forsyth extern	void		setrealloctag(void*, ulong);
15537da2899SCharles.Forsyth extern	ulong	getmalloctag(void*);
15637da2899SCharles.Forsyth extern	ulong	getrealloctag(void*);
15737da2899SCharles.Forsyth extern	void*	malloctopoolblock(void*);
15837da2899SCharles.Forsyth 
15937da2899SCharles.Forsyth /*
16037da2899SCharles.Forsyth  * print routines
16137da2899SCharles.Forsyth  */
16237da2899SCharles.Forsyth typedef struct Fmt	Fmt;
16337da2899SCharles.Forsyth struct Fmt{
16437da2899SCharles.Forsyth 	uchar	runes;			/* output buffer is runes or chars? */
16537da2899SCharles.Forsyth 	void	*start;			/* of buffer */
16637da2899SCharles.Forsyth 	void	*to;			/* current place in the buffer */
16737da2899SCharles.Forsyth 	void	*stop;			/* end of the buffer; overwritten if flush fails */
16837da2899SCharles.Forsyth 	int	(*flush)(Fmt *);	/* called when to == stop */
16937da2899SCharles.Forsyth 	void	*farg;			/* to make flush a closure */
17037da2899SCharles.Forsyth 	int	nfmt;			/* num chars formatted so far */
17137da2899SCharles.Forsyth 	va_list	args;			/* args passed to dofmt */
17237da2899SCharles.Forsyth 	int	r;			/* % format Rune */
17337da2899SCharles.Forsyth 	int	width;
17437da2899SCharles.Forsyth 	int	prec;
17537da2899SCharles.Forsyth 	ulong	flags;
17637da2899SCharles.Forsyth };
17737da2899SCharles.Forsyth 
17837da2899SCharles.Forsyth enum{
17937da2899SCharles.Forsyth 	FmtWidth	= 1,
18037da2899SCharles.Forsyth 	FmtLeft		= FmtWidth << 1,
18137da2899SCharles.Forsyth 	FmtPrec		= FmtLeft << 1,
18237da2899SCharles.Forsyth 	FmtSharp	= FmtPrec << 1,
18337da2899SCharles.Forsyth 	FmtSpace	= FmtSharp << 1,
18437da2899SCharles.Forsyth 	FmtSign		= FmtSpace << 1,
18537da2899SCharles.Forsyth 	FmtZero		= FmtSign << 1,
18637da2899SCharles.Forsyth 	FmtUnsigned	= FmtZero << 1,
18737da2899SCharles.Forsyth 	FmtShort	= FmtUnsigned << 1,
18837da2899SCharles.Forsyth 	FmtLong		= FmtShort << 1,
18937da2899SCharles.Forsyth 	FmtVLong	= FmtLong << 1,
19037da2899SCharles.Forsyth 	FmtComma	= FmtVLong << 1,
19137da2899SCharles.Forsyth 	FmtByte	= FmtComma << 1,
19237da2899SCharles.Forsyth 
19337da2899SCharles.Forsyth 	FmtFlag		= FmtByte << 1
19437da2899SCharles.Forsyth };
19537da2899SCharles.Forsyth 
19637da2899SCharles.Forsyth extern	int	print(char*, ...);
19737da2899SCharles.Forsyth extern	char*	seprint(char*, char*, char*, ...);
19837da2899SCharles.Forsyth extern	char*	vseprint(char*, char*, char*, va_list);
19937da2899SCharles.Forsyth extern	int	snprint(char*, int, char*, ...);
20037da2899SCharles.Forsyth extern	int	vsnprint(char*, int, char*, va_list);
20137da2899SCharles.Forsyth extern	char*	smprint(char*, ...);
20237da2899SCharles.Forsyth extern	char*	vsmprint(char*, va_list);
20337da2899SCharles.Forsyth extern	int	sprint(char*, char*, ...);
20437da2899SCharles.Forsyth extern	int	fprint(int, char*, ...);
20537da2899SCharles.Forsyth extern	int	vfprint(int, char*, va_list);
20637da2899SCharles.Forsyth 
20737da2899SCharles.Forsyth extern	int	runesprint(Rune*, char*, ...);
20837da2899SCharles.Forsyth extern	int	runesnprint(Rune*, int, char*, ...);
20937da2899SCharles.Forsyth extern	int	runevsnprint(Rune*, int, char*, va_list);
21037da2899SCharles.Forsyth extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
21137da2899SCharles.Forsyth extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
21237da2899SCharles.Forsyth extern	Rune*	runesmprint(char*, ...);
21337da2899SCharles.Forsyth extern	Rune*	runevsmprint(char*, va_list);
21437da2899SCharles.Forsyth 
21537da2899SCharles.Forsyth extern	int	fmtfdinit(Fmt*, int, char*, int);
21637da2899SCharles.Forsyth extern	int	fmtfdflush(Fmt*);
21737da2899SCharles.Forsyth extern	int	fmtstrinit(Fmt*);
21837da2899SCharles.Forsyth extern	char*	fmtstrflush(Fmt*);
21937da2899SCharles.Forsyth extern	int	runefmtstrinit(Fmt*);
22037da2899SCharles.Forsyth extern	Rune*	runefmtstrflush(Fmt*);
22137da2899SCharles.Forsyth 
22237da2899SCharles.Forsyth extern	int	fmtinstall(int, int (*)(Fmt*));
22337da2899SCharles.Forsyth extern	int	dofmt(Fmt*, char*);
22437da2899SCharles.Forsyth extern	int	dorfmt(Fmt*, Rune*);
22537da2899SCharles.Forsyth extern	int	fmtprint(Fmt*, char*, ...);
22637da2899SCharles.Forsyth extern	int	fmtvprint(Fmt*, char*, va_list);
22737da2899SCharles.Forsyth extern	int	fmtrune(Fmt*, int);
22837da2899SCharles.Forsyth extern	int	fmtstrcpy(Fmt*, char*);
22937da2899SCharles.Forsyth extern	int	fmtrunestrcpy(Fmt*, Rune*);
23037da2899SCharles.Forsyth /*
23137da2899SCharles.Forsyth  * error string for %r
23237da2899SCharles.Forsyth  * supplied on per os basis, not part of fmt library
23337da2899SCharles.Forsyth  */
23437da2899SCharles.Forsyth extern	int	errfmt(Fmt *f);
23537da2899SCharles.Forsyth 
23637da2899SCharles.Forsyth /*
23737da2899SCharles.Forsyth  * quoted strings
23837da2899SCharles.Forsyth  */
23937da2899SCharles.Forsyth extern	char	*unquotestrdup(char*);
24037da2899SCharles.Forsyth extern	Rune	*unquoterunestrdup(Rune*);
24137da2899SCharles.Forsyth extern	char	*quotestrdup(char*);
24237da2899SCharles.Forsyth extern	Rune	*quoterunestrdup(Rune*);
24337da2899SCharles.Forsyth extern	int	quotestrfmt(Fmt*);
24437da2899SCharles.Forsyth extern	int	quoterunestrfmt(Fmt*);
24537da2899SCharles.Forsyth extern	void	quotefmtinstall(void);
24637da2899SCharles.Forsyth extern	int	(*doquote)(int);
24737da2899SCharles.Forsyth 
24837da2899SCharles.Forsyth /*
24937da2899SCharles.Forsyth  * random number
25037da2899SCharles.Forsyth  */
25137da2899SCharles.Forsyth 
25237da2899SCharles.Forsyth extern	int	nrand(int);
25337da2899SCharles.Forsyth extern	ulong	truerand(void);
25437da2899SCharles.Forsyth extern	ulong	ntruerand(ulong);
25537da2899SCharles.Forsyth 
25637da2899SCharles.Forsyth /*
25737da2899SCharles.Forsyth  * math
25837da2899SCharles.Forsyth  */
25937da2899SCharles.Forsyth extern	int	isNaN(double);
26037da2899SCharles.Forsyth extern	int	isInf(double, int);
26137da2899SCharles.Forsyth extern	double	pow(double, double);
26237da2899SCharles.Forsyth 
26337da2899SCharles.Forsyth /*
26437da2899SCharles.Forsyth  * Time-of-day
26537da2899SCharles.Forsyth  */
26637da2899SCharles.Forsyth 
26737da2899SCharles.Forsyth typedef struct Tm Tm;
26837da2899SCharles.Forsyth struct Tm {
26937da2899SCharles.Forsyth 	int	sec;
27037da2899SCharles.Forsyth 	int	min;
27137da2899SCharles.Forsyth 	int	hour;
27237da2899SCharles.Forsyth 	int	mday;
27337da2899SCharles.Forsyth 	int	mon;
27437da2899SCharles.Forsyth 	int	year;
27537da2899SCharles.Forsyth 	int	wday;
27637da2899SCharles.Forsyth 	int	yday;
27737da2899SCharles.Forsyth 	char	zone[4];
27837da2899SCharles.Forsyth 	int	tzoff;
27937da2899SCharles.Forsyth };
28037da2899SCharles.Forsyth extern	vlong	osnsec(void);
28137da2899SCharles.Forsyth #define	nsec	osnsec
28237da2899SCharles.Forsyth 
28337da2899SCharles.Forsyth /*
28437da2899SCharles.Forsyth  * one-of-a-kind
28537da2899SCharles.Forsyth  */
28637da2899SCharles.Forsyth extern	void	_assert(char*);
28737da2899SCharles.Forsyth extern	double	charstod(int(*)(void*), void*);
28837da2899SCharles.Forsyth extern	char*	cleanname(char*);
28937da2899SCharles.Forsyth extern	double	frexp(double, int*);
2906b2e3235Sforsyth extern	uintptr	getcallerpc(void*);
29137da2899SCharles.Forsyth extern	int	getfields(char*, char**, int, int, char*);
29237da2899SCharles.Forsyth extern	char*	getuser(void);
29337da2899SCharles.Forsyth extern	char*	getwd(char*, int);
29437da2899SCharles.Forsyth extern	double	ipow10(int);
29537da2899SCharles.Forsyth extern	double	ldexp(double, int);
29637da2899SCharles.Forsyth extern	double	modf(double, double*);
29737da2899SCharles.Forsyth extern	void	perror(const char*);
29837da2899SCharles.Forsyth extern	double	pow10(int);
29937da2899SCharles.Forsyth extern	uvlong	strtoull(const char*, char**, int);
30037da2899SCharles.Forsyth extern	void	sysfatal(char*, ...);
30137da2899SCharles.Forsyth extern	int	dec64(uchar*, int, char*, int);
30237da2899SCharles.Forsyth extern	int	enc64(char*, int, uchar*, int);
30337da2899SCharles.Forsyth extern	int	dec32(uchar*, int, char*, int);
30437da2899SCharles.Forsyth extern	int	enc32(char*, int, uchar*, int);
30537da2899SCharles.Forsyth extern	int	dec16(uchar*, int, char*, int);
30637da2899SCharles.Forsyth extern	int	enc16(char*, int, uchar*, int);
30737da2899SCharles.Forsyth extern	int	encodefmt(Fmt*);
30837da2899SCharles.Forsyth 
30937da2899SCharles.Forsyth /*
31037da2899SCharles.Forsyth  *  synchronization
31137da2899SCharles.Forsyth  */
31237da2899SCharles.Forsyth typedef
31337da2899SCharles.Forsyth struct Lock {
3147e004309SCharles.Forsyth 	int	val;
31537da2899SCharles.Forsyth 	int	pid;
31637da2899SCharles.Forsyth } Lock;
31737da2899SCharles.Forsyth 
3187e004309SCharles.Forsyth extern int	_tas(int*);
31937da2899SCharles.Forsyth 
32037da2899SCharles.Forsyth extern	void	lock(Lock*);
32137da2899SCharles.Forsyth extern	void	unlock(Lock*);
32237da2899SCharles.Forsyth extern	int	canlock(Lock*);
32337da2899SCharles.Forsyth 
32437da2899SCharles.Forsyth typedef struct QLock QLock;
32537da2899SCharles.Forsyth struct QLock
32637da2899SCharles.Forsyth {
32737da2899SCharles.Forsyth 	Lock	use;			/* to access Qlock structure */
32837da2899SCharles.Forsyth 	Proc	*head;			/* next process waiting for object */
32937da2899SCharles.Forsyth 	Proc	*tail;			/* last process waiting for object */
33037da2899SCharles.Forsyth 	int	locked;			/* flag */
33137da2899SCharles.Forsyth };
33237da2899SCharles.Forsyth 
33337da2899SCharles.Forsyth extern	void	qlock(QLock*);
33437da2899SCharles.Forsyth extern	void	qunlock(QLock*);
33537da2899SCharles.Forsyth extern	int	canqlock(QLock*);
33637da2899SCharles.Forsyth extern	void	_qlockinit(ulong (*)(ulong, ulong));	/* called only by the thread library */
33737da2899SCharles.Forsyth 
33837da2899SCharles.Forsyth typedef
33937da2899SCharles.Forsyth struct RWLock
34037da2899SCharles.Forsyth {
34137da2899SCharles.Forsyth 	Lock	l;			/* Lock modify lock */
34237da2899SCharles.Forsyth 	QLock	x;			/* Mutual exclusion lock */
34337da2899SCharles.Forsyth 	QLock	k;			/* Lock for waiting writers */
34437da2899SCharles.Forsyth 	int	readers;		/* Count of readers in lock */
34537da2899SCharles.Forsyth } RWLock;
34637da2899SCharles.Forsyth 
34737da2899SCharles.Forsyth extern	int	canrlock(RWLock*);
34837da2899SCharles.Forsyth extern	int	canwlock(RWLock*);
34937da2899SCharles.Forsyth extern	void	rlock(RWLock*);
35037da2899SCharles.Forsyth extern	void	runlock(RWLock*);
35137da2899SCharles.Forsyth extern	void	wlock(RWLock*);
35237da2899SCharles.Forsyth extern	void	wunlock(RWLock*);
35337da2899SCharles.Forsyth 
35437da2899SCharles.Forsyth /*
35537da2899SCharles.Forsyth  * network dialing
35637da2899SCharles.Forsyth  */
35737da2899SCharles.Forsyth #define NETPATHLEN 40
35837da2899SCharles.Forsyth 
35937da2899SCharles.Forsyth /*
36037da2899SCharles.Forsyth  * system calls
36137da2899SCharles.Forsyth  *
36237da2899SCharles.Forsyth  */
36337da2899SCharles.Forsyth 
36437da2899SCharles.Forsyth #define	STATMAX	65535U	/* max length of machine-independent stat structure */
36537da2899SCharles.Forsyth #define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
36637da2899SCharles.Forsyth #define	ERRMAX	128	/* max length of error string */
36737da2899SCharles.Forsyth 
36837da2899SCharles.Forsyth #define	MORDER	0x0003	/* mask for bits defining order of mounting */
36937da2899SCharles.Forsyth #define	MREPL	0x0000	/* mount replaces object */
37037da2899SCharles.Forsyth #define	MBEFORE	0x0001	/* mount goes before others in union directory */
37137da2899SCharles.Forsyth #define	MAFTER	0x0002	/* mount goes after others in union directory */
37237da2899SCharles.Forsyth #define	MCREATE	0x0004	/* permit creation in mounted directory */
37337da2899SCharles.Forsyth #define	MCACHE	0x0010	/* cache some data */
37437da2899SCharles.Forsyth #define	MMASK	0x0017	/* all bits on */
37537da2899SCharles.Forsyth 
37637da2899SCharles.Forsyth #define	OREAD	0	/* open for read */
37737da2899SCharles.Forsyth #define	OWRITE	1	/* write */
37837da2899SCharles.Forsyth #define	ORDWR	2	/* read and write */
37937da2899SCharles.Forsyth #define	OEXEC	3	/* execute, == read but check execute permission */
38037da2899SCharles.Forsyth #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
38137da2899SCharles.Forsyth #define	OCEXEC	32	/* or'ed in, close on exec */
38237da2899SCharles.Forsyth #define	ORCLOSE	64	/* or'ed in, remove on close */
38337da2899SCharles.Forsyth #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
38437da2899SCharles.Forsyth 
38537da2899SCharles.Forsyth #define	AEXIST	0	/* accessible: exists */
38637da2899SCharles.Forsyth #define	AEXEC	1	/* execute access */
38737da2899SCharles.Forsyth #define	AWRITE	2	/* write access */
38837da2899SCharles.Forsyth #define	AREAD	4	/* read access */
38937da2899SCharles.Forsyth 
39037da2899SCharles.Forsyth /* bits in Qid.type */
39137da2899SCharles.Forsyth #define QTDIR		0x80		/* type bit for directories */
39237da2899SCharles.Forsyth #define QTAPPEND	0x40		/* type bit for append only files */
39337da2899SCharles.Forsyth #define QTEXCL		0x20		/* type bit for exclusive use files */
39437da2899SCharles.Forsyth #define QTMOUNT		0x10		/* type bit for mounted channel */
39537da2899SCharles.Forsyth #define QTAUTH		0x08		/* type bit for authentication file */
39637da2899SCharles.Forsyth #define QTFILE		0x00		/* plain file */
39737da2899SCharles.Forsyth 
39837da2899SCharles.Forsyth /* bits in Dir.mode */
39937da2899SCharles.Forsyth #define DMDIR		0x80000000	/* mode bit for directories */
40037da2899SCharles.Forsyth #define DMAPPEND	0x40000000	/* mode bit for append only files */
40137da2899SCharles.Forsyth #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
40237da2899SCharles.Forsyth #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
40337da2899SCharles.Forsyth #define DMAUTH		0x08000000	/* mode bit for authentication file */
40437da2899SCharles.Forsyth #define DMREAD		0x4		/* mode bit for read permission */
40537da2899SCharles.Forsyth #define DMWRITE		0x2		/* mode bit for write permission */
40637da2899SCharles.Forsyth #define DMEXEC		0x1		/* mode bit for execute permission */
40737da2899SCharles.Forsyth 
40837da2899SCharles.Forsyth typedef
40937da2899SCharles.Forsyth struct Qid
41037da2899SCharles.Forsyth {
41137da2899SCharles.Forsyth 	uvlong	path;
41237da2899SCharles.Forsyth 	ulong	vers;
41337da2899SCharles.Forsyth 	uchar	type;
41437da2899SCharles.Forsyth } Qid;
41537da2899SCharles.Forsyth 
41637da2899SCharles.Forsyth typedef
41737da2899SCharles.Forsyth struct Dir {
41837da2899SCharles.Forsyth 	/* system-modified data */
41937da2899SCharles.Forsyth 	ushort	type;	/* server type */
42037da2899SCharles.Forsyth 	uint	dev;	/* server subtype */
42137da2899SCharles.Forsyth 	/* file data */
42237da2899SCharles.Forsyth 	Qid	qid;	/* unique id from server */
42337da2899SCharles.Forsyth 	ulong	mode;	/* permissions */
42437da2899SCharles.Forsyth 	ulong	atime;	/* last read time */
42537da2899SCharles.Forsyth 	ulong	mtime;	/* last write time */
42637da2899SCharles.Forsyth 	vlong	length;	/* file length */
42737da2899SCharles.Forsyth 	char	*name;	/* last element of path */
42837da2899SCharles.Forsyth 	char	*uid;	/* owner name */
42937da2899SCharles.Forsyth 	char	*gid;	/* group name */
43037da2899SCharles.Forsyth 	char	*muid;	/* last modifier name */
43137da2899SCharles.Forsyth } Dir;
43237da2899SCharles.Forsyth 
43337da2899SCharles.Forsyth extern	Dir*	dirstat(char*);
43437da2899SCharles.Forsyth extern	Dir*	dirfstat(int);
43537da2899SCharles.Forsyth extern	int	dirwstat(char*, Dir*);
43637da2899SCharles.Forsyth extern	int	dirfwstat(int, Dir*);
43737da2899SCharles.Forsyth extern	long	dirread(int, Dir**);
43837da2899SCharles.Forsyth extern	void	nulldir(Dir*);
43937da2899SCharles.Forsyth extern	long	dirreadall(int, Dir**);
44037da2899SCharles.Forsyth 
44137da2899SCharles.Forsyth typedef
44237da2899SCharles.Forsyth struct Waitmsg
44337da2899SCharles.Forsyth {
44437da2899SCharles.Forsyth 	int pid;	/* of loved one */
44537da2899SCharles.Forsyth 	ulong time[3];	/* of loved one & descendants */
44637da2899SCharles.Forsyth 	char	*msg;
44737da2899SCharles.Forsyth } Waitmsg;
44837da2899SCharles.Forsyth 
44937da2899SCharles.Forsyth extern	void	_exits(char*);
45037da2899SCharles.Forsyth 
45137da2899SCharles.Forsyth extern	void	exits(char*);
45237da2899SCharles.Forsyth extern	int	create(char*, int, int);
45337da2899SCharles.Forsyth extern	int	errstr(char*, uint);
45437da2899SCharles.Forsyth 
45537da2899SCharles.Forsyth extern	void	perror(const char*);
45637da2899SCharles.Forsyth extern	long	readn(int, void*, long);
45737da2899SCharles.Forsyth extern	int	remove(const char*);
45837da2899SCharles.Forsyth extern	void	rerrstr(char*, uint);
45937da2899SCharles.Forsyth extern	vlong	seek(int, vlong, int);
46037da2899SCharles.Forsyth extern	int	segflush(void*, ulong);
46137da2899SCharles.Forsyth extern	void	werrstr(char*, ...);
46237da2899SCharles.Forsyth 
46337da2899SCharles.Forsyth extern char *argv0;
46437da2899SCharles.Forsyth #define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
46537da2899SCharles.Forsyth 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
46637da2899SCharles.Forsyth 			    argc--, argv++) {\
46737da2899SCharles.Forsyth 				char *_args, *_argt;\
46837da2899SCharles.Forsyth 				Rune _argc;\
46937da2899SCharles.Forsyth 				_args = &argv[0][1];\
47037da2899SCharles.Forsyth 				if(_args[0]=='-' && _args[1]==0){\
47137da2899SCharles.Forsyth 					argc--; argv++; break;\
47237da2899SCharles.Forsyth 				}\
47337da2899SCharles.Forsyth 				_argc = 0;\
47437da2899SCharles.Forsyth 				while(*_args && (_args += chartorune(&_argc, _args)))\
47537da2899SCharles.Forsyth 				switch(_argc)
47637da2899SCharles.Forsyth #define	ARGEND		SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc);
47737da2899SCharles.Forsyth #define	ARGF()		(_argt=_args, _args="",\
47837da2899SCharles.Forsyth 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
47937da2899SCharles.Forsyth #define	EARGF(x)	(_argt=_args, _args="",\
48037da2899SCharles.Forsyth 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
48137da2899SCharles.Forsyth 
48237da2899SCharles.Forsyth #define	ARGC()		_argc
48337da2899SCharles.Forsyth 
48437da2899SCharles.Forsyth /*
48537da2899SCharles.Forsyth  *	Extensions for Inferno to basic libc.h
48637da2899SCharles.Forsyth  */
48737da2899SCharles.Forsyth 
48837da2899SCharles.Forsyth #define	setbinmode()
48937da2899SCharles.Forsyth 
490*8e8fedb8SCharles Forsyth 
491*8e8fedb8SCharles Forsyth /* FPSCR */
492*8e8fedb8SCharles Forsyth #define	FPSFX	(1<<31)	/* exception summary (sticky) */
493*8e8fedb8SCharles Forsyth #define	FPSEX	(1<<30)	/* enabled exception summary */
494*8e8fedb8SCharles Forsyth #define	FPSVX	(1<<29)	/* invalid operation exception summary */
495*8e8fedb8SCharles Forsyth #define	FPSOX	(1<<28)	/* overflow exception OX (sticky) */
496*8e8fedb8SCharles Forsyth #define	FPSUX	(1<<27)	/* underflow exception UX (sticky) */
497*8e8fedb8SCharles Forsyth #define	FPSZX	(1<<26)	/* zero divide exception ZX (sticky) */
498*8e8fedb8SCharles Forsyth #define	FPSXX	(1<<25)	/* inexact exception XX (sticky) */
499*8e8fedb8SCharles Forsyth #define	FPSVXSNAN (1<<24)	/* invalid operation exception for SNaN (sticky) */
500*8e8fedb8SCharles Forsyth #define	FPSVXISI	(1<<23)	/* invalid operation exception for ∞-∞ (sticky) */
501*8e8fedb8SCharles Forsyth #define	FPSVXIDI	(1<<22)	/* invalid operation exception for ∞/∞ (sticky) */
502*8e8fedb8SCharles Forsyth #define	FPSVXZDZ (1<<21)	/* invalid operation exception for 0/0 (sticky) */
503*8e8fedb8SCharles Forsyth #define	FPSVXIMZ	(1<<20)	/* invalid operation exception for ∞*0 (sticky) */
504*8e8fedb8SCharles Forsyth #define	FPSVXVC	(1<<19)	/* invalid operation exception for invalid compare (sticky) */
505*8e8fedb8SCharles Forsyth #define	FPSFR	(1<<18)	/* fraction rounded */
506*8e8fedb8SCharles Forsyth #define	FPSFI	(1<<17)	/* fraction inexact */
507*8e8fedb8SCharles Forsyth #define	FPSFPRF	(1<<16)	/* floating point result class */
508*8e8fedb8SCharles Forsyth #define	FPSFPCC	(0xF<<12)	/* <, >, =, unordered */
509*8e8fedb8SCharles Forsyth #define	FPVXCVI	(1<<8)	/* enable exception for invalid integer convert (sticky) */
510*8e8fedb8SCharles Forsyth 
511*8e8fedb8SCharles Forsyth /* FCR */
512*8e8fedb8SCharles Forsyth #define	FPVE	(1<<7)	/* invalid operation exception enable */
513*8e8fedb8SCharles Forsyth #define	FPOVFL	(1<<6)	/* enable overflow exceptions */
514*8e8fedb8SCharles Forsyth #define	FPUNFL	(1<<5)	/* enable underflow */
515*8e8fedb8SCharles Forsyth #define	FPZDIV	(1<<4)	/* enable zero divide */
516*8e8fedb8SCharles Forsyth #define	FPINEX	(1<<3)	/* enable inexact exceptions */
517*8e8fedb8SCharles Forsyth #define	FPRMASK	(3<<0)	/* rounding mode */
518*8e8fedb8SCharles Forsyth #define	FPRNR	(0<<0)
519*8e8fedb8SCharles Forsyth #define	FPRZ	(1<<0)
520*8e8fedb8SCharles Forsyth #define	FPRPINF	(2<<0)
521*8e8fedb8SCharles Forsyth #define	FPRNINF	(3<<0)
522*8e8fedb8SCharles Forsyth #define	FPPEXT	0
523*8e8fedb8SCharles Forsyth #define	FPPSGL	0
524*8e8fedb8SCharles Forsyth #define	FPPDBL	0
525*8e8fedb8SCharles Forsyth #define	FPPMASK	0
526*8e8fedb8SCharles Forsyth #define	FPINVAL	FPVE
527*8e8fedb8SCharles Forsyth /* FSR */
528*8e8fedb8SCharles Forsyth #define	FPAOVFL	FPSOX
529*8e8fedb8SCharles Forsyth #define	FPAINEX	FPSXX
530*8e8fedb8SCharles Forsyth #define	FPAUNFL	FPSUX
531*8e8fedb8SCharles Forsyth #define	FPAZDIV	FPSZX
532*8e8fedb8SCharles Forsyth #define	FPAINVAL	FPSVX
533*8e8fedb8SCharles Forsyth 
534*8e8fedb8SCharles Forsyth extern	void	setfcr(ulong);
535*8e8fedb8SCharles Forsyth extern	void	setfsr(ulong);
536*8e8fedb8SCharles Forsyth extern	ulong	getfcr(void):
537*8e8fedb8SCharles Forsyth extern	ulong	getfsr(void);
538