xref: /plan9-contrib/sys/src/9k/port/lib.h (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1*9ef1f84bSDavid du Colombier /*
2*9ef1f84bSDavid du Colombier  * functions (possibly) linked in, complete, from libc.
3*9ef1f84bSDavid du Colombier  */
4*9ef1f84bSDavid du Colombier #define nelem(x)	(sizeof(x)/sizeof((x)[0]))
5*9ef1f84bSDavid du Colombier #define offsetof(s, m)	(ulong)(&(((s*)0)->m))
6*9ef1f84bSDavid du Colombier #define assert(x)	if(x){}else _assert("x")
7*9ef1f84bSDavid du Colombier 
8*9ef1f84bSDavid du Colombier /*
9*9ef1f84bSDavid du Colombier  * mem routines
10*9ef1f84bSDavid du Colombier  */
11*9ef1f84bSDavid du Colombier extern	void*	memccpy(void*, void*, int, ulong);
12*9ef1f84bSDavid du Colombier extern	void*	memset(void*, int, ulong);
13*9ef1f84bSDavid du Colombier extern	int	memcmp(void*, void*, ulong);
14*9ef1f84bSDavid du Colombier extern	void*	memmove(void*, void*, ulong);
15*9ef1f84bSDavid du Colombier extern	void*	memchr(void*, int, ulong);
16*9ef1f84bSDavid du Colombier 
17*9ef1f84bSDavid du Colombier /*
18*9ef1f84bSDavid du Colombier  * string routines
19*9ef1f84bSDavid du Colombier  */
20*9ef1f84bSDavid du Colombier extern	char*	strcat(char*, char*);
21*9ef1f84bSDavid du Colombier extern	char*	strchr(char*, int);
22*9ef1f84bSDavid du Colombier extern	int	strcmp(char*, char*);
23*9ef1f84bSDavid du Colombier extern	char*	strcpy(char*, char*);
24*9ef1f84bSDavid du Colombier extern	char*	strecpy(char*, char*, char*);
25*9ef1f84bSDavid du Colombier extern	char*	strncat(char*, char*, long);
26*9ef1f84bSDavid du Colombier extern	char*	strncpy(char*, char*, long);
27*9ef1f84bSDavid du Colombier extern	int	strncmp(char*, char*, long);
28*9ef1f84bSDavid du Colombier extern	char*	strrchr(char*, int);
29*9ef1f84bSDavid du Colombier extern	long	strlen(char*);
30*9ef1f84bSDavid du Colombier extern	char*	strstr(char*, char*);
31*9ef1f84bSDavid du Colombier extern	int	cistrncmp(char*, char*, int);
32*9ef1f84bSDavid du Colombier extern	int	cistrcmp(char*, char*);
33*9ef1f84bSDavid du Colombier extern	int	tokenize(char*, char**, int);
34*9ef1f84bSDavid du Colombier 
35*9ef1f84bSDavid du Colombier enum
36*9ef1f84bSDavid du Colombier {
37*9ef1f84bSDavid du Colombier 	UTFmax		= 4,		/* maximum bytes per rune */
38*9ef1f84bSDavid du Colombier 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
39*9ef1f84bSDavid du Colombier 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
40*9ef1f84bSDavid du Colombier 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
41*9ef1f84bSDavid du Colombier 	Runemax		= 0x10FFFF,	/* 24 bit rune */
42*9ef1f84bSDavid du Colombier 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
43*9ef1f84bSDavid du Colombier };
44*9ef1f84bSDavid du Colombier 
45*9ef1f84bSDavid du Colombier /*
46*9ef1f84bSDavid du Colombier  * rune routines
47*9ef1f84bSDavid du Colombier  */
48*9ef1f84bSDavid du Colombier extern	int	runetochar(char*, Rune*);
49*9ef1f84bSDavid du Colombier extern	int	chartorune(Rune*, char*);
50*9ef1f84bSDavid du Colombier extern	int	runelen(long);
51*9ef1f84bSDavid du Colombier extern	int	fullrune(char*, int);
52*9ef1f84bSDavid du Colombier extern	int	utflen(char*);
53*9ef1f84bSDavid du Colombier extern	int	utfnlen(char*, long);
54*9ef1f84bSDavid du Colombier extern	char*	utfrune(char*, long);
55*9ef1f84bSDavid du Colombier 
56*9ef1f84bSDavid du Colombier /*
57*9ef1f84bSDavid du Colombier  * malloc
58*9ef1f84bSDavid du Colombier  */
59*9ef1f84bSDavid du Colombier extern	void*	malloc(ulong);
60*9ef1f84bSDavid du Colombier extern	void*	mallocz(ulong, int);
61*9ef1f84bSDavid du Colombier extern	void	free(void*);
62*9ef1f84bSDavid du Colombier extern	void*	mallocalign(ulong, ulong, long, ulong);
63*9ef1f84bSDavid du Colombier extern	void*	realloc(void*, ulong);
64*9ef1f84bSDavid du Colombier extern	void	setmalloctag(void*, ulong);
65*9ef1f84bSDavid du Colombier extern	void	setrealloctag(void*, ulong);
66*9ef1f84bSDavid du Colombier extern	ulong	getmalloctag(void*);
67*9ef1f84bSDavid du Colombier extern	ulong	getrealloctag(void*);
68*9ef1f84bSDavid du Colombier 
69*9ef1f84bSDavid du Colombier /*
70*9ef1f84bSDavid du Colombier  * print routines
71*9ef1f84bSDavid du Colombier  */
72*9ef1f84bSDavid du Colombier typedef struct Fmt	Fmt;
73*9ef1f84bSDavid du Colombier struct Fmt{
74*9ef1f84bSDavid du Colombier 	uchar	runes;			/* output buffer is runes or chars? */
75*9ef1f84bSDavid du Colombier 	void	*start;			/* of buffer */
76*9ef1f84bSDavid du Colombier 	void	*to;			/* current place in the buffer */
77*9ef1f84bSDavid du Colombier 	void	*stop;			/* end of the buffer; overwritten if flush fails */
78*9ef1f84bSDavid du Colombier 	int	(*flush)(Fmt *);	/* called when to == stop */
79*9ef1f84bSDavid du Colombier 	void	*farg;			/* to make flush a closure */
80*9ef1f84bSDavid du Colombier 	int	nfmt;			/* num chars formatted so far */
81*9ef1f84bSDavid du Colombier 	va_list	args;			/* args passed to dofmt */
82*9ef1f84bSDavid du Colombier 	int	r;			/* % format Rune */
83*9ef1f84bSDavid du Colombier 	int	width;
84*9ef1f84bSDavid du Colombier 	int	prec;
85*9ef1f84bSDavid du Colombier 	ulong	flags;
86*9ef1f84bSDavid du Colombier };
87*9ef1f84bSDavid du Colombier 
88*9ef1f84bSDavid du Colombier enum {
89*9ef1f84bSDavid du Colombier 	FmtWidth	= 1,
90*9ef1f84bSDavid du Colombier 	FmtLeft		= FmtWidth<<1,
91*9ef1f84bSDavid du Colombier 	FmtPrec		= FmtLeft<<1,
92*9ef1f84bSDavid du Colombier 	FmtSharp	= FmtPrec<<1,
93*9ef1f84bSDavid du Colombier 	FmtSpace	= FmtSharp<<1,
94*9ef1f84bSDavid du Colombier 	FmtSign		= FmtSpace<<1,
95*9ef1f84bSDavid du Colombier 	FmtZero		= FmtSign<<1,
96*9ef1f84bSDavid du Colombier 	FmtUnsigned	= FmtZero<<1,
97*9ef1f84bSDavid du Colombier 	FmtShort	= FmtUnsigned<<1,
98*9ef1f84bSDavid du Colombier 	FmtLong		= FmtShort<<1,
99*9ef1f84bSDavid du Colombier 	FmtVLong	= FmtLong<<1,
100*9ef1f84bSDavid du Colombier 	FmtComma	= FmtVLong<<1,
101*9ef1f84bSDavid du Colombier 	FmtByte		= FmtComma<<1,
102*9ef1f84bSDavid du Colombier 
103*9ef1f84bSDavid du Colombier 	FmtFlag		= FmtByte<<1
104*9ef1f84bSDavid du Colombier };
105*9ef1f84bSDavid du Colombier 
106*9ef1f84bSDavid du Colombier extern	int	print(char*, ...);
107*9ef1f84bSDavid du Colombier extern	char*	seprint(char*, char*, char*, ...);
108*9ef1f84bSDavid du Colombier extern	char*	vseprint(char*, char*, char*, va_list);
109*9ef1f84bSDavid du Colombier extern	int	snprint(char*, int, char*, ...);
110*9ef1f84bSDavid du Colombier extern	int	vsnprint(char*, int, char*, va_list);
111*9ef1f84bSDavid du Colombier extern	int	sprint(char*, char*, ...);
112*9ef1f84bSDavid du Colombier 
113*9ef1f84bSDavid du Colombier #pragma	varargck	argpos	fmtprint	2
114*9ef1f84bSDavid du Colombier #pragma	varargck	argpos	print		1
115*9ef1f84bSDavid du Colombier #pragma	varargck	argpos	seprint		3
116*9ef1f84bSDavid du Colombier #pragma	varargck	argpos	snprint		3
117*9ef1f84bSDavid du Colombier #pragma	varargck	argpos	sprint		2
118*9ef1f84bSDavid du Colombier 
119*9ef1f84bSDavid du Colombier #pragma	varargck	type	"lld"	vlong
120*9ef1f84bSDavid du Colombier #pragma	varargck	type	"llx"	vlong
121*9ef1f84bSDavid du Colombier #pragma	varargck	type	"lld"	uvlong
122*9ef1f84bSDavid du Colombier #pragma	varargck	type	"llx"	uvlong
123*9ef1f84bSDavid du Colombier #pragma	varargck	type	"ld"	long
124*9ef1f84bSDavid du Colombier #pragma	varargck	type	"lx"	long
125*9ef1f84bSDavid du Colombier #pragma	varargck	type	"ld"	ulong
126*9ef1f84bSDavid du Colombier #pragma	varargck	type	"lx"	ulong
127*9ef1f84bSDavid du Colombier #pragma	varargck	type	"d"	int
128*9ef1f84bSDavid du Colombier #pragma	varargck	type	"x"	int
129*9ef1f84bSDavid du Colombier #pragma	varargck	type	"c"	int
130*9ef1f84bSDavid du Colombier #pragma	varargck	type	"C"	int
131*9ef1f84bSDavid du Colombier #pragma	varargck	type	"d"	uint
132*9ef1f84bSDavid du Colombier #pragma	varargck	type	"x"	uint
133*9ef1f84bSDavid du Colombier #pragma	varargck	type	"c"	uint
134*9ef1f84bSDavid du Colombier #pragma	varargck	type	"C"	uint
135*9ef1f84bSDavid du Colombier #pragma	varargck	type	"s"	char*
136*9ef1f84bSDavid du Colombier #pragma	varargck	type	"q"	char*
137*9ef1f84bSDavid du Colombier #pragma	varargck	type	"S"	Rune*
138*9ef1f84bSDavid du Colombier #pragma	varargck	type	"%"	void
139*9ef1f84bSDavid du Colombier #pragma	varargck	type	"p"	uintptr
140*9ef1f84bSDavid du Colombier #pragma	varargck	type	"p"	void*
141*9ef1f84bSDavid du Colombier #pragma	varargck	flag	','
142*9ef1f84bSDavid du Colombier 
143*9ef1f84bSDavid du Colombier extern	int	fmtinstall(int, int (*)(Fmt*));
144*9ef1f84bSDavid du Colombier extern	int	fmtprint(Fmt*, char*, ...);
145*9ef1f84bSDavid du Colombier extern	int	fmtstrcpy(Fmt*, char*);
146*9ef1f84bSDavid du Colombier extern	char*	fmtstrflush(Fmt*);
147*9ef1f84bSDavid du Colombier extern	int	fmtstrinit(Fmt*);
148*9ef1f84bSDavid du Colombier 
149*9ef1f84bSDavid du Colombier /*
150*9ef1f84bSDavid du Colombier  * quoted strings
151*9ef1f84bSDavid du Colombier  */
152*9ef1f84bSDavid du Colombier extern	void	quotefmtinstall(void);
153*9ef1f84bSDavid du Colombier 
154*9ef1f84bSDavid du Colombier /*
155*9ef1f84bSDavid du Colombier  * Time-of-day
156*9ef1f84bSDavid du Colombier  */
157*9ef1f84bSDavid du Colombier extern	void	cycles(uvlong*);	/* 64-bit value of the cycle counter if there is one, 0 if there isn't */
158*9ef1f84bSDavid du Colombier 
159*9ef1f84bSDavid du Colombier /*
160*9ef1f84bSDavid du Colombier  * one-of-a-kind
161*9ef1f84bSDavid du Colombier  */
162*9ef1f84bSDavid du Colombier extern	int	abs(int);
163*9ef1f84bSDavid du Colombier extern	int	atoi(char*);
164*9ef1f84bSDavid du Colombier extern	char*	cleanname(char*);
165*9ef1f84bSDavid du Colombier extern	int	dec64(uchar*, int, char*, int);
166*9ef1f84bSDavid du Colombier extern	uintptr	getcallerpc(void*);
167*9ef1f84bSDavid du Colombier extern	int	getfields(char*, char**, int, int, char*);
168*9ef1f84bSDavid du Colombier extern	int	gettokens(char *, char **, int, char *);
169*9ef1f84bSDavid du Colombier extern	void	qsort(void*, long, long, int (*)(void*, void*));
170*9ef1f84bSDavid du Colombier extern	long	strtol(char*, char**, int);
171*9ef1f84bSDavid du Colombier extern	ulong	strtoul(char*, char**, int);
172*9ef1f84bSDavid du Colombier extern	vlong	strtoll(char*, char**, int);
173*9ef1f84bSDavid du Colombier extern	uvlong	strtoull(char*, char**, int);
174*9ef1f84bSDavid du Colombier 
175*9ef1f84bSDavid du Colombier /*
176*9ef1f84bSDavid du Colombier  * Syscall data structures
177*9ef1f84bSDavid du Colombier  */
178*9ef1f84bSDavid du Colombier #define MORDER	0x0003	/* mask for bits defining order of mounting */
179*9ef1f84bSDavid du Colombier #define MREPL	0x0000	/* mount replaces object */
180*9ef1f84bSDavid du Colombier #define MBEFORE	0x0001	/* mount goes before others in union directory */
181*9ef1f84bSDavid du Colombier #define MAFTER	0x0002	/* mount goes after others in union directory */
182*9ef1f84bSDavid du Colombier #define MCREATE	0x0004	/* permit creation in mounted directory */
183*9ef1f84bSDavid du Colombier #define MCACHE	0x0010	/* cache some data */
184*9ef1f84bSDavid du Colombier #define MMASK	0x0017	/* all bits on */
185*9ef1f84bSDavid du Colombier 
186*9ef1f84bSDavid du Colombier #define OREAD	0	/* open for read */
187*9ef1f84bSDavid du Colombier #define OWRITE	1	/* write */
188*9ef1f84bSDavid du Colombier #define ORDWR	2	/* read and write */
189*9ef1f84bSDavid du Colombier #define OEXEC	3	/* execute, == read but check execute permission */
190*9ef1f84bSDavid du Colombier #define OTRUNC	16	/* or'ed in (except for exec), truncate file first */
191*9ef1f84bSDavid du Colombier #define OCEXEC	32	/* or'ed in, close on exec */
192*9ef1f84bSDavid du Colombier #define ORCLOSE	64	/* or'ed in, remove on close */
193*9ef1f84bSDavid du Colombier #define OEXCL   0x1000	/* or'ed in, exclusive create */
194*9ef1f84bSDavid du Colombier 
195*9ef1f84bSDavid du Colombier #define NCONT	0	/* continue after note */
196*9ef1f84bSDavid du Colombier #define NDFLT	1	/* terminate after note */
197*9ef1f84bSDavid du Colombier #define NSAVE	2	/* clear note but hold state */
198*9ef1f84bSDavid du Colombier #define NRSTR	3	/* restore saved state */
199*9ef1f84bSDavid du Colombier 
200*9ef1f84bSDavid du Colombier typedef struct Qid	Qid;
201*9ef1f84bSDavid du Colombier typedef struct Dir	Dir;
202*9ef1f84bSDavid du Colombier typedef struct OWaitmsg	OWaitmsg;
203*9ef1f84bSDavid du Colombier typedef struct Waitmsg	Waitmsg;
204*9ef1f84bSDavid du Colombier 
205*9ef1f84bSDavid du Colombier #define ERRMAX		128		/* max length of error string */
206*9ef1f84bSDavid du Colombier #define KNAMELEN	28		/* max length of name held in kernel */
207*9ef1f84bSDavid du Colombier 
208*9ef1f84bSDavid du Colombier /* bits in Qid.type */
209*9ef1f84bSDavid du Colombier #define QTDIR		0x80		/* type bit for directories */
210*9ef1f84bSDavid du Colombier #define QTAPPEND	0x40		/* type bit for append only files */
211*9ef1f84bSDavid du Colombier #define QTEXCL		0x20		/* type bit for exclusive use files */
212*9ef1f84bSDavid du Colombier #define QTMOUNT		0x10		/* type bit for mounted channel */
213*9ef1f84bSDavid du Colombier #define QTAUTH		0x08		/* type bit for authentication file */
214*9ef1f84bSDavid du Colombier #define QTFILE		0x00		/* plain file */
215*9ef1f84bSDavid du Colombier 
216*9ef1f84bSDavid du Colombier /* bits in Dir.mode */
217*9ef1f84bSDavid du Colombier #define DMDIR		0x80000000	/* mode bit for directories */
218*9ef1f84bSDavid du Colombier #define DMAPPEND	0x40000000	/* mode bit for append only files */
219*9ef1f84bSDavid du Colombier #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
220*9ef1f84bSDavid du Colombier #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
221*9ef1f84bSDavid du Colombier #define DMREAD		0x4		/* mode bit for read permission */
222*9ef1f84bSDavid du Colombier #define DMWRITE		0x2		/* mode bit for write permission */
223*9ef1f84bSDavid du Colombier #define DMEXEC		0x1		/* mode bit for execute permission */
224*9ef1f84bSDavid du Colombier 
225*9ef1f84bSDavid du Colombier struct Qid
226*9ef1f84bSDavid du Colombier {
227*9ef1f84bSDavid du Colombier 	uvlong	path;
228*9ef1f84bSDavid du Colombier 	ulong	vers;
229*9ef1f84bSDavid du Colombier 	uchar	type;
230*9ef1f84bSDavid du Colombier };
231*9ef1f84bSDavid du Colombier 
232*9ef1f84bSDavid du Colombier struct Dir {
233*9ef1f84bSDavid du Colombier 	/* system-modified data */
234*9ef1f84bSDavid du Colombier 	ushort	type;	/* server type */
235*9ef1f84bSDavid du Colombier 	uint	dev;	/* server subtype */
236*9ef1f84bSDavid du Colombier 	/* file data */
237*9ef1f84bSDavid du Colombier 	Qid	qid;	/* unique id from server */
238*9ef1f84bSDavid du Colombier 	ulong	mode;	/* permissions */
239*9ef1f84bSDavid du Colombier 	ulong	atime;	/* last read time */
240*9ef1f84bSDavid du Colombier 	ulong	mtime;	/* last write time */
241*9ef1f84bSDavid du Colombier 	vlong	length;	/* file length: see <u.h> */
242*9ef1f84bSDavid du Colombier 	char	*name;	/* last element of path */
243*9ef1f84bSDavid du Colombier 	char	*uid;	/* owner name */
244*9ef1f84bSDavid du Colombier 	char	*gid;	/* group name */
245*9ef1f84bSDavid du Colombier 	char	*muid;	/* last modifier name */
246*9ef1f84bSDavid du Colombier };
247*9ef1f84bSDavid du Colombier 
248*9ef1f84bSDavid du Colombier struct OWaitmsg
249*9ef1f84bSDavid du Colombier {
250*9ef1f84bSDavid du Colombier 	char	pid[12];	/* of loved one */
251*9ef1f84bSDavid du Colombier 	char	time[3*12];	/* of loved one and descendants */
252*9ef1f84bSDavid du Colombier 	char	msg[64];	/* compatibility BUG */
253*9ef1f84bSDavid du Colombier };
254*9ef1f84bSDavid du Colombier 
255*9ef1f84bSDavid du Colombier struct Waitmsg
256*9ef1f84bSDavid du Colombier {
257*9ef1f84bSDavid du Colombier 	int	pid;		/* of loved one */
258*9ef1f84bSDavid du Colombier 	ulong	time[3];	/* of loved one and descendants */
259*9ef1f84bSDavid du Colombier 	char	msg[ERRMAX];	/* actually variable-size in user mode */
260*9ef1f84bSDavid du Colombier };
261*9ef1f84bSDavid du Colombier 
262*9ef1f84bSDavid du Colombier extern	char	etext[];
263*9ef1f84bSDavid du Colombier extern	char	edata[];
264*9ef1f84bSDavid du Colombier extern	char	end[];
265