xref: /inferno-os/os/port/lib.h (revision db76ee8d534cb5c7681e9013703b20ab5016b4fa)
174a4d8c2SCharles.Forsyth 
274a4d8c2SCharles.Forsyth /*
374a4d8c2SCharles.Forsyth  * functions (possibly) linked in, complete, from libc.
474a4d8c2SCharles.Forsyth  */
5e1bd49a1SCharles.Forsyth #define nelem(x)	(sizeof(x)/sizeof((x)[0]))
6b5eeadadSCharles.Forsyth #define offsetof(s, m)	(ulong)(&(((s*)0)->m))
7b5eeadadSCharles.Forsyth #define assert(x)	if(x){}else _assert("x")
874a4d8c2SCharles.Forsyth 
974a4d8c2SCharles.Forsyth /*
1074a4d8c2SCharles.Forsyth  * mem routines
1174a4d8c2SCharles.Forsyth  */
1274a4d8c2SCharles.Forsyth extern	void*	memccpy(void*, void*, int, ulong);
1374a4d8c2SCharles.Forsyth extern	void*	memset(void*, int, ulong);
1474a4d8c2SCharles.Forsyth extern	int	memcmp(void*, void*, ulong);
1574a4d8c2SCharles.Forsyth extern	void*	memmove(void*, void*, ulong);
1674a4d8c2SCharles.Forsyth extern	void*	memchr(void*, int, ulong);
1774a4d8c2SCharles.Forsyth 
1874a4d8c2SCharles.Forsyth /*
1974a4d8c2SCharles.Forsyth  * string routines
2074a4d8c2SCharles.Forsyth  */
2174a4d8c2SCharles.Forsyth extern	char*	strcat(char*, char*);
2274a4d8c2SCharles.Forsyth extern	char*	strchr(char*, int);
2374a4d8c2SCharles.Forsyth extern	char*	strrchr(char*, int);
2474a4d8c2SCharles.Forsyth extern	int	strcmp(char*, char*);
2574a4d8c2SCharles.Forsyth extern	char*	strcpy(char*, char*);
2674a4d8c2SCharles.Forsyth extern	char*	strecpy(char*, char*, char*);
2774a4d8c2SCharles.Forsyth extern	char*	strncat(char*, char*, long);
2874a4d8c2SCharles.Forsyth extern	char*	strncpy(char*, char*, long);
2974a4d8c2SCharles.Forsyth extern	int	strncmp(char*, char*, long);
3074a4d8c2SCharles.Forsyth extern	long	strlen(char*);
3174a4d8c2SCharles.Forsyth extern	char*	strdup(char*);
3274a4d8c2SCharles.Forsyth extern	char*	strstr(char*, char*);
3374a4d8c2SCharles.Forsyth extern	int	cistrncmp(char*, char*, int);
3474a4d8c2SCharles.Forsyth extern	int	cistrcmp(char*, char*);
3574a4d8c2SCharles.Forsyth extern	char*	cistrstr(char*, char*);
3674a4d8c2SCharles.Forsyth extern	int	atoi(char*);
3774a4d8c2SCharles.Forsyth extern	int	fullrune(char*, int);
3874a4d8c2SCharles.Forsyth 
3974a4d8c2SCharles.Forsyth enum
4074a4d8c2SCharles.Forsyth {
41*db76ee8dSCharles Forsyth 	UTFmax		= 4,		/* maximum bytes per rune */
42*db76ee8dSCharles Forsyth 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
4374a4d8c2SCharles.Forsyth 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
44*db76ee8dSCharles Forsyth 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
45*db76ee8dSCharles Forsyth 	Runemax		= 0x10FFFF,	/* 21-bit rune */
46*db76ee8dSCharles Forsyth 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
4774a4d8c2SCharles.Forsyth };
4874a4d8c2SCharles.Forsyth 
4974a4d8c2SCharles.Forsyth /*
5074a4d8c2SCharles.Forsyth  * rune routines
5174a4d8c2SCharles.Forsyth  */
5274a4d8c2SCharles.Forsyth extern	int	runetochar(char*, Rune*);
5374a4d8c2SCharles.Forsyth extern	int	chartorune(Rune*, char*);
5474a4d8c2SCharles.Forsyth extern	char*	utfrune(char*, long);
5574a4d8c2SCharles.Forsyth extern	int	utflen(char*);
5674a4d8c2SCharles.Forsyth extern	int	runelen(long);
5774a4d8c2SCharles.Forsyth 
5874a4d8c2SCharles.Forsyth extern	int	abs(int);
5974a4d8c2SCharles.Forsyth 
6074a4d8c2SCharles.Forsyth /*
6174a4d8c2SCharles.Forsyth  * print routines
6274a4d8c2SCharles.Forsyth  */
6374a4d8c2SCharles.Forsyth typedef struct Fmt	Fmt;
6474a4d8c2SCharles.Forsyth typedef int (*Fmts)(Fmt*);
6574a4d8c2SCharles.Forsyth struct Fmt{
6674a4d8c2SCharles.Forsyth 	uchar	runes;			/* output buffer is runes or chars? */
6774a4d8c2SCharles.Forsyth 	void	*start;			/* of buffer */
6874a4d8c2SCharles.Forsyth 	void	*to;			/* current place in the buffer */
6974a4d8c2SCharles.Forsyth 	void	*stop;			/* end of the buffer; overwritten if flush fails */
7074a4d8c2SCharles.Forsyth 	int	(*flush)(Fmt *);	/* called when to == stop */
7174a4d8c2SCharles.Forsyth 	void	*farg;			/* to make flush a closure */
7274a4d8c2SCharles.Forsyth 	int	nfmt;			/* num chars formatted so far */
7374a4d8c2SCharles.Forsyth 	va_list	args;			/* args passed to dofmt */
7474a4d8c2SCharles.Forsyth 	int	r;			/* % format Rune */
7574a4d8c2SCharles.Forsyth 	int	width;
7674a4d8c2SCharles.Forsyth 	int	prec;
7774a4d8c2SCharles.Forsyth 	ulong	flags;
7874a4d8c2SCharles.Forsyth };
7974a4d8c2SCharles.Forsyth extern	int	print(char*, ...);
8074a4d8c2SCharles.Forsyth extern	char*	seprint(char*, char*, char*, ...);
8174a4d8c2SCharles.Forsyth extern	char*	vseprint(char*, char*, char*, va_list);
8274a4d8c2SCharles.Forsyth extern	char*	smprint(char*, ...);
8374a4d8c2SCharles.Forsyth extern	char*	vsmprint(char*, va_list);
8474a4d8c2SCharles.Forsyth extern	int	snprint(char*, int, char*, ...);
8574a4d8c2SCharles.Forsyth extern	int	vsnprint(char*, int, char*, va_list);
8674a4d8c2SCharles.Forsyth extern	int	sprint(char*, char*, ...);
8774a4d8c2SCharles.Forsyth 
8874a4d8c2SCharles.Forsyth extern	int	fmtinstall(int, int (*)(Fmt*));
8974a4d8c2SCharles.Forsyth extern	void	quotefmtinstall(void);
9074a4d8c2SCharles.Forsyth extern	int	fmtprint(Fmt*, char*, ...);
9174a4d8c2SCharles.Forsyth extern	int	fmtstrcpy(Fmt*, char*);
9274a4d8c2SCharles.Forsyth 
9374a4d8c2SCharles.Forsyth #pragma	varargck	argpos	fmtprint	2
9474a4d8c2SCharles.Forsyth #pragma	varargck	argpos	print		1
9574a4d8c2SCharles.Forsyth #pragma	varargck	argpos	seprint		3
9674a4d8c2SCharles.Forsyth #pragma	varargck	argpos	snprint		3
9774a4d8c2SCharles.Forsyth #pragma	varargck	argpos	sprint		2
9874a4d8c2SCharles.Forsyth #pragma	varargck	argpos	vseprint	3
9974a4d8c2SCharles.Forsyth #pragma	varargck	argpos	vsnprint	3
10074a4d8c2SCharles.Forsyth 
10174a4d8c2SCharles.Forsyth extern	int	fltconv(Fmt*);
10274a4d8c2SCharles.Forsyth 
10374a4d8c2SCharles.Forsyth /*
10474a4d8c2SCharles.Forsyth  * math
10574a4d8c2SCharles.Forsyth  */
10674a4d8c2SCharles.Forsyth extern int	isNaN(double);
10774a4d8c2SCharles.Forsyth extern int	isInf(double, int);
10874a4d8c2SCharles.Forsyth extern double	floor(double);
10974a4d8c2SCharles.Forsyth extern double	frexp(double, int*);
11074a4d8c2SCharles.Forsyth extern double	pow10(int);
11174a4d8c2SCharles.Forsyth 
11274a4d8c2SCharles.Forsyth /*
11374a4d8c2SCharles.Forsyth  * one-of-a-kind
11474a4d8c2SCharles.Forsyth  */
11574a4d8c2SCharles.Forsyth extern	char*	cleanname(char*);
11674a4d8c2SCharles.Forsyth extern	ulong	getcallerpc(void*);
11774a4d8c2SCharles.Forsyth 
11874a4d8c2SCharles.Forsyth extern	long	strtol(char*, char**, int);
11974a4d8c2SCharles.Forsyth extern	ulong	strtoul(char*, char**, int);
12074a4d8c2SCharles.Forsyth extern	vlong	strtoll(char*, char**, int);
12174a4d8c2SCharles.Forsyth extern	uvlong	strtoull(char*, char**, int);
12274a4d8c2SCharles.Forsyth extern	char	etext[];
12374a4d8c2SCharles.Forsyth extern	char	edata[];
12474a4d8c2SCharles.Forsyth extern	char	end[];
12574a4d8c2SCharles.Forsyth extern	int	getfields(char*, char**, int, int, char*);
12674a4d8c2SCharles.Forsyth extern	int	tokenize(char*, char**, int);
12774a4d8c2SCharles.Forsyth extern	int	dec64(uchar*, int, char*, int);
128e1bd49a1SCharles.Forsyth extern	void	qsort(void*, long, long, int (*)(void*, void*));
12974a4d8c2SCharles.Forsyth 
13074a4d8c2SCharles.Forsyth extern	int	toupper(int);
13174a4d8c2SCharles.Forsyth extern	char*	netmkaddr(char*, char*, char*);
13274a4d8c2SCharles.Forsyth extern	int	myetheraddr(uchar*, char*);
13374a4d8c2SCharles.Forsyth extern	int	parseether(uchar*, char*);
13474a4d8c2SCharles.Forsyth 
13574a4d8c2SCharles.Forsyth /*
13674a4d8c2SCharles.Forsyth  * network dialling
13774a4d8c2SCharles.Forsyth  */
13874a4d8c2SCharles.Forsyth #define	NETPATHLEN	40
13974a4d8c2SCharles.Forsyth 
14074a4d8c2SCharles.Forsyth /*
14174a4d8c2SCharles.Forsyth  * Syscall data structures
14274a4d8c2SCharles.Forsyth  */
14374a4d8c2SCharles.Forsyth #define	MORDER	0x0003	/* mask for bits defining order of mounting */
14474a4d8c2SCharles.Forsyth #define	MREPL	0x0000	/* mount replaces object */
14574a4d8c2SCharles.Forsyth #define	MBEFORE	0x0001	/* mount goes before others in union directory */
14674a4d8c2SCharles.Forsyth #define	MAFTER	0x0002	/* mount goes after others in union directory */
14774a4d8c2SCharles.Forsyth #define	MCREATE	0x0004	/* permit creation in mounted directory */
14874a4d8c2SCharles.Forsyth #define	MCACHE	0x0010	/* cache some data */
14974a4d8c2SCharles.Forsyth #define	MMASK	0x0017	/* all bits on */
15074a4d8c2SCharles.Forsyth 
15174a4d8c2SCharles.Forsyth #define	OREAD	0	/* open for read */
15274a4d8c2SCharles.Forsyth #define	OWRITE	1	/* write */
15374a4d8c2SCharles.Forsyth #define	ORDWR	2	/* read and write */
15474a4d8c2SCharles.Forsyth #define	OEXEC	3	/* execute, == read but check execute permission */
15574a4d8c2SCharles.Forsyth #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
15674a4d8c2SCharles.Forsyth #define	OCEXEC	32	/* or'ed in, close on exec */
15774a4d8c2SCharles.Forsyth #define	ORCLOSE	64	/* or'ed in, remove on close */
15874a4d8c2SCharles.Forsyth #define OEXCL   0x1000	/* or'ed in, exclusive create */
15974a4d8c2SCharles.Forsyth 
16074a4d8c2SCharles.Forsyth #define	NCONT	0	/* continue after note */
16174a4d8c2SCharles.Forsyth #define	NDFLT	1	/* terminate after note */
16274a4d8c2SCharles.Forsyth #define	NSAVE	2	/* clear note but hold state */
16374a4d8c2SCharles.Forsyth #define	NRSTR	3	/* restore saved state */
16474a4d8c2SCharles.Forsyth 
16574a4d8c2SCharles.Forsyth typedef struct Qid	Qid;
16674a4d8c2SCharles.Forsyth typedef struct Dir	Dir;
16774a4d8c2SCharles.Forsyth typedef struct Waitmsg	Waitmsg;
16874a4d8c2SCharles.Forsyth 
169463f3a97SCharles.Forsyth #define	STATMAX	65535U	/* max length of machine-independent stat structure */
17074a4d8c2SCharles.Forsyth #define	ERRMAX			128	/* max length of error string */
17174a4d8c2SCharles.Forsyth #define	KNAMELEN		28	/* max length of name held in kernel */
17274a4d8c2SCharles.Forsyth 
17374a4d8c2SCharles.Forsyth /* bits in Qid.type */
17474a4d8c2SCharles.Forsyth #define QTDIR		0x80		/* type bit for directories */
17574a4d8c2SCharles.Forsyth #define QTAPPEND	0x40		/* type bit for append only files */
17674a4d8c2SCharles.Forsyth #define QTEXCL		0x20		/* type bit for exclusive use files */
17774a4d8c2SCharles.Forsyth #define QTMOUNT		0x10		/* type bit for mounted channel */
17874a4d8c2SCharles.Forsyth #define QTAUTH		0x08		/* type bit for authentication file */
17974a4d8c2SCharles.Forsyth #define QTFILE		0x00		/* plain file */
18074a4d8c2SCharles.Forsyth 
18174a4d8c2SCharles.Forsyth /* bits in Dir.mode */
18274a4d8c2SCharles.Forsyth #define DMDIR		0x80000000	/* mode bit for directories */
18374a4d8c2SCharles.Forsyth #define DMAPPEND	0x40000000	/* mode bit for append only files */
18474a4d8c2SCharles.Forsyth #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
18574a4d8c2SCharles.Forsyth #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
18674a4d8c2SCharles.Forsyth #define DMREAD		0x4		/* mode bit for read permission */
18774a4d8c2SCharles.Forsyth #define DMWRITE		0x2		/* mode bit for write permission */
18874a4d8c2SCharles.Forsyth #define DMEXEC		0x1		/* mode bit for execute permission */
18974a4d8c2SCharles.Forsyth 
19074a4d8c2SCharles.Forsyth struct Qid
19174a4d8c2SCharles.Forsyth {
19274a4d8c2SCharles.Forsyth 	uvlong	path;
19374a4d8c2SCharles.Forsyth 	ulong	vers;
19474a4d8c2SCharles.Forsyth 	uchar	type;
19574a4d8c2SCharles.Forsyth };
19674a4d8c2SCharles.Forsyth 
19774a4d8c2SCharles.Forsyth struct Dir {
19874a4d8c2SCharles.Forsyth 	/* system-modified data */
19974a4d8c2SCharles.Forsyth 	ushort	type;	/* server type */
20074a4d8c2SCharles.Forsyth 	uint	dev;	/* server subtype */
20174a4d8c2SCharles.Forsyth 	/* file data */
20274a4d8c2SCharles.Forsyth 	Qid	qid;	/* unique id from server */
20374a4d8c2SCharles.Forsyth 	ulong	mode;	/* permissions */
20474a4d8c2SCharles.Forsyth 	ulong	atime;	/* last read time */
20574a4d8c2SCharles.Forsyth 	ulong	mtime;	/* last write time */
20674a4d8c2SCharles.Forsyth 	vlong	length;	/* file length: see <u.h> */
20774a4d8c2SCharles.Forsyth 	char	*name;	/* last element of path */
20874a4d8c2SCharles.Forsyth 	char	*uid;	/* owner name */
20974a4d8c2SCharles.Forsyth 	char	*gid;	/* group name */
21074a4d8c2SCharles.Forsyth 	char	*muid;	/* last modifier name */
21174a4d8c2SCharles.Forsyth };
21274a4d8c2SCharles.Forsyth 
21374a4d8c2SCharles.Forsyth struct Waitmsg
21474a4d8c2SCharles.Forsyth {
21574a4d8c2SCharles.Forsyth 	int	pid;	/* of loved one */
21674a4d8c2SCharles.Forsyth 	ulong	time[3];	/* of loved one and descendants */
21774a4d8c2SCharles.Forsyth 	char	msg[ERRMAX];	/* actually variable-size in user mode */
21874a4d8c2SCharles.Forsyth };
219