xref: /plan9/sys/src/9/port/lib.h (revision e94a8e9b44de11e62dfd4566245554f8bf8e0295)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * functions (possibly) linked in, complete, from libc.
33e12c5d1SDavid du Colombier  */
44de34a7eSDavid du Colombier #define nelem(x)	(sizeof(x)/sizeof((x)[0]))
54de34a7eSDavid du Colombier #define offsetof(s, m)	(ulong)(&(((s*)0)->m))
64de34a7eSDavid du Colombier #define assert(x)	if(x){}else _assert("x")
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier /*
93e12c5d1SDavid du Colombier  * mem routines
103e12c5d1SDavid du Colombier  */
119a747e4fSDavid du Colombier extern	void*	memccpy(void*, void*, int, ulong);
129a747e4fSDavid du Colombier extern	void*	memset(void*, int, ulong);
139a747e4fSDavid du Colombier extern	int	memcmp(void*, void*, ulong);
149a747e4fSDavid du Colombier extern	void*	memmove(void*, void*, ulong);
159a747e4fSDavid du Colombier extern	void*	memchr(void*, int, ulong);
163e12c5d1SDavid du Colombier 
173e12c5d1SDavid du Colombier /*
183e12c5d1SDavid du Colombier  * string routines
193e12c5d1SDavid du Colombier  */
203e12c5d1SDavid du Colombier extern	char*	strcat(char*, char*);
21061a3f44SDavid du Colombier extern	char*	strchr(char*, int);
22061a3f44SDavid du Colombier extern	char*	strrchr(char*, int);
233e12c5d1SDavid du Colombier extern	int	strcmp(char*, char*);
243e12c5d1SDavid du Colombier extern	char*	strcpy(char*, char*);
259a747e4fSDavid du Colombier extern	char*	strecpy(char*, char*, char*);
263e12c5d1SDavid du Colombier extern	char*	strncat(char*, char*, long);
273e12c5d1SDavid du Colombier extern	char*	strncpy(char*, char*, long);
283e12c5d1SDavid du Colombier extern	int	strncmp(char*, char*, long);
293e12c5d1SDavid du Colombier extern	long	strlen(char*);
3080ee5cbfSDavid du Colombier extern	char*	strstr(char*, char*);
313e12c5d1SDavid du Colombier extern	int	atoi(char*);
329a747e4fSDavid du Colombier extern	int	fullrune(char*, int);
334de34a7eSDavid du Colombier extern	int	cistrcmp(char*, char*);
344de34a7eSDavid du Colombier extern	int	cistrncmp(char*, char*, int);
353e12c5d1SDavid du Colombier 
36bd389b36SDavid du Colombier enum
37bd389b36SDavid du Colombier {
38*e94a8e9bSDavid du Colombier 	UTFmax		= 4,		/* maximum bytes per rune */
39*e94a8e9bSDavid du Colombier 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
40bd389b36SDavid du Colombier 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
41*e94a8e9bSDavid du Colombier 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
42*e94a8e9bSDavid du Colombier 	Runemax		= 0x10FFFF,	/* 24 bit rune */
43*e94a8e9bSDavid du Colombier 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
44bd389b36SDavid du Colombier };
45bd389b36SDavid du Colombier 
463e12c5d1SDavid du Colombier /*
473e12c5d1SDavid du Colombier  * rune routines
483e12c5d1SDavid du Colombier  */
493e12c5d1SDavid du Colombier extern	int	runetochar(char*, Rune*);
503e12c5d1SDavid du Colombier extern	int	chartorune(Rune*, char*);
513e12c5d1SDavid du Colombier extern	char*	utfrune(char*, long);
523e12c5d1SDavid du Colombier extern	int	utflen(char*);
535741f218SDavid du Colombier extern	int	utfnlen(char*, long);
547dd7cddfSDavid du Colombier extern	int	runelen(long);
553e12c5d1SDavid du Colombier 
563e12c5d1SDavid du Colombier extern	int	abs(int);
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier /*
593e12c5d1SDavid du Colombier  * print routines
603e12c5d1SDavid du Colombier  */
619a747e4fSDavid du Colombier typedef struct Fmt	Fmt;
629a747e4fSDavid du Colombier typedef int (*Fmts)(Fmt*);
639a747e4fSDavid du Colombier struct Fmt{
649a747e4fSDavid du Colombier 	uchar	runes;			/* output buffer is runes or chars? */
659a747e4fSDavid du Colombier 	void	*start;			/* of buffer */
669a747e4fSDavid du Colombier 	void	*to;			/* current place in the buffer */
679a747e4fSDavid du Colombier 	void	*stop;			/* end of the buffer; overwritten if flush fails */
689a747e4fSDavid du Colombier 	int	(*flush)(Fmt *);	/* called when to == stop */
699a747e4fSDavid du Colombier 	void	*farg;			/* to make flush a closure */
709a747e4fSDavid du Colombier 	int	nfmt;			/* num chars formatted so far */
719a747e4fSDavid du Colombier 	va_list	args;			/* args passed to dofmt */
729a747e4fSDavid du Colombier 	int	r;			/* % format Rune */
739a747e4fSDavid du Colombier 	int	width;
749a747e4fSDavid du Colombier 	int	prec;
759a747e4fSDavid du Colombier 	ulong	flags;
769a747e4fSDavid du Colombier };
773e12c5d1SDavid du Colombier extern	int	print(char*, ...);
789a747e4fSDavid du Colombier extern	char*	seprint(char*, char*, char*, ...);
799a747e4fSDavid du Colombier extern	char*	vseprint(char*, char*, char*, va_list);
809a747e4fSDavid du Colombier extern	int	snprint(char*, int, char*, ...);
819a747e4fSDavid du Colombier extern	int	vsnprint(char*, int, char*, va_list);
829a747e4fSDavid du Colombier extern	int	sprint(char*, char*, ...);
839a747e4fSDavid du Colombier 
849a747e4fSDavid du Colombier #pragma	varargck	argpos	fmtprint	2
859a747e4fSDavid du Colombier #pragma	varargck	argpos	print		1
869a747e4fSDavid du Colombier #pragma	varargck	argpos	seprint		3
879a747e4fSDavid du Colombier #pragma	varargck	argpos	snprint		3
889a747e4fSDavid du Colombier #pragma	varargck	argpos	sprint		2
89567483c8SDavid du Colombier 
90567483c8SDavid du Colombier #pragma	varargck	type	"lld"	vlong
91567483c8SDavid du Colombier #pragma	varargck	type	"llx"	vlong
92567483c8SDavid du Colombier #pragma	varargck	type	"lld"	uvlong
93567483c8SDavid du Colombier #pragma	varargck	type	"llx"	uvlong
94567483c8SDavid du Colombier #pragma	varargck	type	"ld"	long
95567483c8SDavid du Colombier #pragma	varargck	type	"lx"	long
96567483c8SDavid du Colombier #pragma	varargck	type	"ld"	ulong
97567483c8SDavid du Colombier #pragma	varargck	type	"lx"	ulong
98567483c8SDavid du Colombier #pragma	varargck	type	"d"	int
99567483c8SDavid du Colombier #pragma	varargck	type	"x"	int
100567483c8SDavid du Colombier #pragma	varargck	type	"c"	int
101567483c8SDavid du Colombier #pragma	varargck	type	"C"	int
102567483c8SDavid du Colombier #pragma	varargck	type	"d"	uint
103567483c8SDavid du Colombier #pragma	varargck	type	"x"	uint
104567483c8SDavid du Colombier #pragma	varargck	type	"c"	uint
105567483c8SDavid du Colombier #pragma	varargck	type	"C"	uint
106567483c8SDavid du Colombier #pragma	varargck	type	"s"	char*
107567483c8SDavid du Colombier #pragma	varargck	type	"q"	char*
108567483c8SDavid du Colombier #pragma	varargck	type	"S"	Rune*
109567483c8SDavid du Colombier #pragma	varargck	type	"%"	void
110567483c8SDavid du Colombier #pragma	varargck	type	"p"	uintptr
111567483c8SDavid du Colombier #pragma	varargck	type	"p"	void*
112567483c8SDavid du Colombier #pragma	varargck	flag	','
113567483c8SDavid du Colombier 
114fcbb35d1SDavid du Colombier extern	int	fmtstrinit(Fmt*);
115567483c8SDavid du Colombier extern	int	fmtinstall(int, int (*)(Fmt*));
116567483c8SDavid du Colombier extern	void	quotefmtinstall(void);
117567483c8SDavid du Colombier extern	int	fmtprint(Fmt*, char*, ...);
118567483c8SDavid du Colombier extern	int	fmtstrcpy(Fmt*, char*);
119fcbb35d1SDavid du Colombier extern	char*	fmtstrflush(Fmt*);
1203e12c5d1SDavid du Colombier 
1213e12c5d1SDavid du Colombier /*
1223e12c5d1SDavid du Colombier  * one-of-a-kind
1233e12c5d1SDavid du Colombier  */
1247dd7cddfSDavid du Colombier extern	char*	cleanname(char*);
1257dd7cddfSDavid du Colombier extern	ulong	getcallerpc(void*);
1269a747e4fSDavid du Colombier 
1273e12c5d1SDavid du Colombier extern	long	strtol(char*, char**, int);
1283e12c5d1SDavid du Colombier extern	ulong	strtoul(char*, char**, int);
1297dd7cddfSDavid du Colombier extern	vlong	strtoll(char*, char**, int);
1307dd7cddfSDavid du Colombier extern	uvlong	strtoull(char*, char**, int);
1313e12c5d1SDavid du Colombier extern	char	etext[];
1323e12c5d1SDavid du Colombier extern	char	edata[];
1333e12c5d1SDavid du Colombier extern	char	end[];
1347dd7cddfSDavid du Colombier extern	int	getfields(char*, char**, int, int, char*);
1359a747e4fSDavid du Colombier extern	int	tokenize(char*, char**, int);
1369a747e4fSDavid du Colombier extern	int	dec64(uchar*, int, char*, int);
137567483c8SDavid du Colombier extern	int	encodefmt(Fmt*);
1384de34a7eSDavid du Colombier extern	void	qsort(void*, long, long, int (*)(void*, void*));
1397dd7cddfSDavid du Colombier 
1403e12c5d1SDavid du Colombier /*
1413e12c5d1SDavid du Colombier  * Syscall data structures
1423e12c5d1SDavid du Colombier  */
1433e12c5d1SDavid du Colombier #define	MORDER	0x0003	/* mask for bits defining order of mounting */
1443e12c5d1SDavid du Colombier #define	MREPL	0x0000	/* mount replaces object */
1453e12c5d1SDavid du Colombier #define	MBEFORE	0x0001	/* mount goes before others in union directory */
1463e12c5d1SDavid du Colombier #define	MAFTER	0x0002	/* mount goes after others in union directory */
1473e12c5d1SDavid du Colombier #define	MCREATE	0x0004	/* permit creation in mounted directory */
1487dd7cddfSDavid du Colombier #define	MCACHE	0x0010	/* cache some data */
1499a747e4fSDavid du Colombier #define	MMASK	0x0017	/* all bits on */
1503e12c5d1SDavid du Colombier 
1513e12c5d1SDavid du Colombier #define	OREAD	0	/* open for read */
1523e12c5d1SDavid du Colombier #define	OWRITE	1	/* write */
1533e12c5d1SDavid du Colombier #define	ORDWR	2	/* read and write */
1543e12c5d1SDavid du Colombier #define	OEXEC	3	/* execute, == read but check execute permission */
1553e12c5d1SDavid du Colombier #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
1563e12c5d1SDavid du Colombier #define	OCEXEC	32	/* or'ed in, close on exec */
1573e12c5d1SDavid du Colombier #define	ORCLOSE	64	/* or'ed in, remove on close */
1589a747e4fSDavid du Colombier #define OEXCL   0x1000	/* or'ed in, exclusive create */
1593e12c5d1SDavid du Colombier 
1603e12c5d1SDavid du Colombier #define	NCONT	0	/* continue after note */
1613e12c5d1SDavid du Colombier #define	NDFLT	1	/* terminate after note */
162219b2ee8SDavid du Colombier #define	NSAVE	2	/* clear note but hold state */
163219b2ee8SDavid du Colombier #define	NRSTR	3	/* restore saved state */
1643e12c5d1SDavid du Colombier 
1653e12c5d1SDavid du Colombier typedef struct Qid	Qid;
1663e12c5d1SDavid du Colombier typedef struct Dir	Dir;
1679a747e4fSDavid du Colombier typedef struct OWaitmsg	OWaitmsg;
1683e12c5d1SDavid du Colombier typedef struct Waitmsg	Waitmsg;
1693e12c5d1SDavid du Colombier 
1709a747e4fSDavid du Colombier #define	ERRMAX			128	/* max length of error string */
1719a747e4fSDavid du Colombier #define	KNAMELEN		28	/* max length of name held in kernel */
1729a747e4fSDavid du Colombier 
1739a747e4fSDavid du Colombier /* bits in Qid.type */
1749a747e4fSDavid du Colombier #define QTDIR		0x80		/* type bit for directories */
1759a747e4fSDavid du Colombier #define QTAPPEND	0x40		/* type bit for append only files */
1769a747e4fSDavid du Colombier #define QTEXCL		0x20		/* type bit for exclusive use files */
1779a747e4fSDavid du Colombier #define QTMOUNT		0x10		/* type bit for mounted channel */
1789a747e4fSDavid du Colombier #define QTAUTH		0x08		/* type bit for authentication file */
1799a747e4fSDavid du Colombier #define QTFILE		0x00		/* plain file */
1809a747e4fSDavid du Colombier 
1819a747e4fSDavid du Colombier /* bits in Dir.mode */
1829a747e4fSDavid du Colombier #define DMDIR		0x80000000	/* mode bit for directories */
1839a747e4fSDavid du Colombier #define DMAPPEND	0x40000000	/* mode bit for append only files */
1849a747e4fSDavid du Colombier #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
1859a747e4fSDavid du Colombier #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
1869a747e4fSDavid du Colombier #define DMREAD		0x4		/* mode bit for read permission */
1879a747e4fSDavid du Colombier #define DMWRITE		0x2		/* mode bit for write permission */
1889a747e4fSDavid du Colombier #define DMEXEC		0x1		/* mode bit for execute permission */
1893e12c5d1SDavid du Colombier 
1903e12c5d1SDavid du Colombier struct Qid
1913e12c5d1SDavid du Colombier {
192061a3f44SDavid du Colombier 	uvlong	path;
1933e12c5d1SDavid du Colombier 	ulong	vers;
1949a747e4fSDavid du Colombier 	uchar	type;
1953e12c5d1SDavid du Colombier };
1963e12c5d1SDavid du Colombier 
1979a747e4fSDavid du Colombier struct Dir {
1989a747e4fSDavid du Colombier 	/* system-modified data */
1999a747e4fSDavid du Colombier 	ushort	type;	/* server type */
2009a747e4fSDavid du Colombier 	uint	dev;	/* server subtype */
2019a747e4fSDavid du Colombier 	/* file data */
2029a747e4fSDavid du Colombier 	Qid	qid;	/* unique id from server */
2039a747e4fSDavid du Colombier 	ulong	mode;	/* permissions */
2049a747e4fSDavid du Colombier 	ulong	atime;	/* last read time */
2059a747e4fSDavid du Colombier 	ulong	mtime;	/* last write time */
2069a747e4fSDavid du Colombier 	vlong	length;	/* file length: see <u.h> */
2079a747e4fSDavid du Colombier 	char	*name;	/* last element of path */
2089a747e4fSDavid du Colombier 	char	*uid;	/* owner name */
2099a747e4fSDavid du Colombier 	char	*gid;	/* group name */
2109a747e4fSDavid du Colombier 	char	*muid;	/* last modifier name */
2119a747e4fSDavid du Colombier };
2129a747e4fSDavid du Colombier 
2139a747e4fSDavid du Colombier struct OWaitmsg
2143e12c5d1SDavid du Colombier {
2159a747e4fSDavid du Colombier 	char	pid[12];	/* of loved one */
2169a747e4fSDavid du Colombier 	char	time[3*12];	/* of loved one and descendants */
2179a747e4fSDavid du Colombier 	char	msg[64];	/* compatibility BUG */
2183e12c5d1SDavid du Colombier };
2193e12c5d1SDavid du Colombier 
2203e12c5d1SDavid du Colombier struct Waitmsg
2213e12c5d1SDavid du Colombier {
2229a747e4fSDavid du Colombier 	int	pid;		/* of loved one */
2239a747e4fSDavid du Colombier 	ulong	time[3];	/* of loved one and descendants */
2249a747e4fSDavid du Colombier 	char	msg[ERRMAX];	/* actually variable-size in user mode */
2253e12c5d1SDavid du Colombier };
226