xref: /inferno-os/include/kern.h (revision e57c7e16a3789cd4de1a3c2560d49b1ee39cd10a)
1 typedef unsigned long size_t;
2 
3 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
4 #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
5 #define	assert(x)	if(x){}else _assert("x")
6 
7 /*
8  * mem routines
9  */
10 extern	void*	memccpy(void*, void*, int, ulong);
11 extern	void*	memset(void*, int, ulong);
12 extern	int	memcmp(void*, void*, ulong);
13 extern	void*	memcpy(void*, void*, ulong);
14 extern	void*	memmove(void*, void*, ulong);
15 extern	void*	memchr(void*, int, ulong);
16 
17 /*
18  * string routines
19  */
20 extern	char*	strcat(char*, char*);
21 extern	char*	strchr(char*, int);
22 extern	int	strcmp(char*, char*);
23 extern	char*	strcpy(char*, char*);
24 extern	char*	strecpy(char*, char*, char*);
25 extern	char*	strdup(char*);
26 extern	char*	strncat(char*, char*, long);
27 extern	char*	strncpy(char*, char*, long);
28 extern	int	strncmp(char*, char*, long);
29 extern	char*	strpbrk(char*, char*);
30 extern	char*	strrchr(char*, int);
31 extern	char*	strtok(char*, char*);
32 extern	long	strlen(char*);
33 extern	long	strspn(char*, char*);
34 extern	long	strcspn(char*, char*);
35 extern	char*	strstr(char*, char*);
36 extern	int	cistrncmp(char*, char*, int);
37 extern	int	cistrcmp(char*, char*);
38 extern	char*	cistrstr(char*, char*);
39 extern	int	tokenize(char*, char**, int);
40 
41 enum
42 {
43 	UTFmax		= 3,		/* maximum bytes per rune */
44 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
45 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
46 	Runeerror	= 0x80,		/* decoding error in UTF */
47 };
48 
49 /*
50  * rune routines
51  */
52 extern	int	runetochar(char*, Rune*);
53 extern	int	chartorune(Rune*, char*);
54 extern	int	runelen(long);
55 extern	int	runenlen(Rune*, int);
56 extern	int	fullrune(char*, int);
57 extern	int	utflen(char*);
58 extern	int	utfnlen(char*, long);
59 extern	char*	utfrune(char*, long);
60 extern	char*	utfrrune(char*, long);
61 extern	char*	utfutf(char*, char*);
62 extern	char*	utfecpy(char*, char*, char*);
63 
64 extern	Rune*	runestrcat(Rune*, Rune*);
65 extern	Rune*	runestrchr(Rune*, Rune);
66 extern	int	runestrcmp(Rune*, Rune*);
67 extern	Rune*	runestrcpy(Rune*, Rune*);
68 extern	Rune*	runestrncpy(Rune*, Rune*, long);
69 extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
70 extern	Rune*	runestrdup(Rune*);
71 extern	Rune*	runestrncat(Rune*, Rune*, long);
72 extern	int	runestrncmp(Rune*, Rune*, long);
73 extern	Rune*	runestrrchr(Rune*, Rune);
74 extern	long	runestrlen(Rune*);
75 extern	Rune*	runestrstr(Rune*, Rune*);
76 
77 extern	Rune	tolowerrune(Rune);
78 extern	Rune	totitlerune(Rune);
79 extern	Rune	toupperrune(Rune);
80 extern	int	isalpharune(Rune);
81 extern	int	islowerrune(Rune);
82 extern	int	isspacerune(Rune);
83 extern	int	istitlerune(Rune);
84 extern	int	isupperrune(Rune);
85 
86 /*
87  * malloc
88  */
89 extern	void*	malloc(ulong);
90 extern	void*	mallocz(ulong, int);
91 extern	void	free(void*);
92 extern	ulong	msize(void*);
93 extern	void*	calloc(ulong, ulong);
94 extern	void*	realloc(void*, ulong);
95 extern	void		setmalloctag(void*, ulong);
96 extern	void		setrealloctag(void*, ulong);
97 extern	ulong	getmalloctag(void*);
98 extern	ulong	getrealloctag(void*);
99 extern	void*	malloctopoolblock(void*);
100 
101 /*
102  * print routines
103  */
104 typedef struct Fmt	Fmt;
105 struct Fmt{
106 	uchar	runes;			/* output buffer is runes or chars? */
107 	void	*start;			/* of buffer */
108 	void	*to;			/* current place in the buffer */
109 	void	*stop;			/* end of the buffer; overwritten if flush fails */
110 	int	(*flush)(Fmt *);	/* called when to == stop */
111 	void	*farg;			/* to make flush a closure */
112 	int	nfmt;			/* num chars formatted so far */
113 	va_list	args;			/* args passed to dofmt */
114 	int	r;			/* % format Rune */
115 	int	width;
116 	int	prec;
117 	ulong	flags;
118 };
119 
120 enum{
121 	FmtWidth	= 1,
122 	FmtLeft		= FmtWidth << 1,
123 	FmtPrec		= FmtLeft << 1,
124 	FmtSharp	= FmtPrec << 1,
125 	FmtSpace	= FmtSharp << 1,
126 	FmtSign		= FmtSpace << 1,
127 	FmtZero		= FmtSign << 1,
128 	FmtUnsigned	= FmtZero << 1,
129 	FmtShort	= FmtUnsigned << 1,
130 	FmtLong		= FmtShort << 1,
131 	FmtVLong	= FmtLong << 1,
132 	FmtComma	= FmtVLong << 1,
133 	FmtByte	= FmtComma << 1,
134 
135 	FmtFlag		= FmtByte << 1
136 };
137 
138 extern	int	print(char*, ...);
139 extern	char*	seprint(char*, char*, char*, ...);
140 extern	char*	vseprint(char*, char*, char*, va_list);
141 extern	int	snprint(char*, int, char*, ...);
142 extern	int	vsnprint(char*, int, char*, va_list);
143 extern	char*	smprint(char*, ...);
144 extern	char*	vsmprint(char*, va_list);
145 extern	int	sprint(char*, char*, ...);
146 extern	int	fprint(int, char*, ...);
147 extern	int	vfprint(int, char*, va_list);
148 
149 extern	int	runesprint(Rune*, char*, ...);
150 extern	int	runesnprint(Rune*, int, char*, ...);
151 extern	int	runevsnprint(Rune*, int, char*, va_list);
152 extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
153 extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
154 extern	Rune*	runesmprint(char*, ...);
155 extern	Rune*	runevsmprint(char*, va_list);
156 
157 extern	int	fmtfdinit(Fmt*, int, char*, int);
158 extern	int	fmtfdflush(Fmt*);
159 extern	int	fmtstrinit(Fmt*);
160 extern	char*	fmtstrflush(Fmt*);
161 extern	int	runefmtstrinit(Fmt*);
162 extern	Rune*	runefmtstrflush(Fmt*);
163 
164 #pragma	varargck	argpos	fmtprint	2
165 #pragma	varargck	argpos	fprint	2
166 #pragma	varargck	argpos	print	1
167 #pragma	varargck	argpos	runeseprint	3
168 #pragma	varargck	argpos	runesmprint	1
169 #pragma	varargck	argpos	runesnprint	3
170 #pragma	varargck	argpos	runesprint	2
171 #pragma	varargck	argpos	seprint	3
172 #pragma	varargck	argpos	smprint	1
173 #pragma	varargck	argpos	snprint	3
174 #pragma	varargck	argpos	sprint	2
175 #pragma	varargck	argpos	vseprint	3
176 #pragma	varargck	argpos	vsnprint	3
177 
178 #pragma	varargck	type	"lld"	vlong
179 #pragma	varargck	type	"llx"	vlong
180 #pragma	varargck	type	"lld"	uvlong
181 #pragma	varargck	type	"llx"	uvlong
182 #pragma	varargck	type	"ld"	long
183 #pragma	varargck	type	"lx"	long
184 #pragma	varargck	type	"ld"	ulong
185 #pragma	varargck	type	"lx"	ulong
186 #pragma	varargck	type	"d"	int
187 #pragma	varargck	type	"x"	int
188 #pragma	varargck	type	"c"	int
189 #pragma	varargck	type	"C"	int
190 #pragma	varargck	type	"d"	uint
191 #pragma	varargck	type	"x"	uint
192 #pragma	varargck	type	"c"	uint
193 #pragma	varargck	type	"C"	uint
194 #pragma	varargck	type	"f"	double
195 #pragma	varargck	type	"e"	double
196 #pragma	varargck	type	"g"	double
197 #pragma	varargck	type	"s"	char*
198 #pragma	varargck	type	"q"	char*
199 #pragma	varargck	type	"S"	Rune*
200 #pragma	varargck	type	"Q"	Rune*
201 #pragma	varargck	type	"r"	void
202 #pragma	varargck	type	"%"	void
203 #pragma	varargck	type	"n"	int*
204 #pragma	varargck	type	"p"	void*
205 #pragma	varargck	type	"p"	uintptr
206 #pragma	varargck	flag	','
207 #pragma varargck	type	"<" void*
208 #pragma varargck	type	"[" void*
209 #pragma varargck	type	"H" void*
210 
211 extern	int	fmtinstall(int, int (*)(Fmt*));
212 extern	int	dofmt(Fmt*, char*);
213 extern	int	dorfmt(Fmt*, Rune*);
214 extern	int	fmtprint(Fmt*, char*, ...);
215 extern	int	fmtvprint(Fmt*, char*, va_list);
216 extern	int	fmtrune(Fmt*, int);
217 extern	int	fmtstrcpy(Fmt*, char*);
218 extern	int	fmtrunestrcpy(Fmt*, Rune*);
219 /*
220  * error string for %r
221  * supplied on per os basis, not part of fmt library
222  */
223 extern	int	errfmt(Fmt *f);
224 
225 /*
226  * quoted strings
227  */
228 extern	char	*unquotestrdup(char*);
229 extern	Rune	*unquoterunestrdup(Rune*);
230 extern	char	*quotestrdup(char*);
231 extern	Rune	*quoterunestrdup(Rune*);
232 extern	int	quotestrfmt(Fmt*);
233 extern	int	quoterunestrfmt(Fmt*);
234 extern	void	quotefmtinstall(void);
235 extern	int	(*doquote)(int);
236 
237 /*
238  * random number
239  */
240 extern	void	srand(long);
241 extern	int	rand(void);
242 extern	int	nrand(int);
243 extern	long	lrand(void);
244 extern	long	lnrand(long);
245 extern	double	frand(void);
246 extern	ulong	truerand(void);
247 extern	ulong	ntruerand(ulong);
248 
249 /*
250  * math
251  */
252 extern	ulong	getfcr(void);
253 extern	void	setfsr(ulong);
254 extern	ulong	getfsr(void);
255 extern	void	setfcr(ulong);
256 extern	double	NaN(void);
257 extern	double	Inf(int);
258 extern	int	isNaN(double);
259 extern	int	isInf(double, int);
260 
261 extern	double	pow(double, double);
262 extern	double	atan2(double, double);
263 extern	double	fabs(double);
264 extern	double	atan(double);
265 extern	double	log(double);
266 extern	double	log10(double);
267 extern	double	exp(double);
268 extern	double	floor(double);
269 extern	double	ceil(double);
270 extern	double	hypot(double, double);
271 extern	double	sin(double);
272 extern	double	cos(double);
273 extern	double	tan(double);
274 extern	double	asin(double);
275 extern	double	acos(double);
276 extern	double	sinh(double);
277 extern	double	cosh(double);
278 extern	double	tanh(double);
279 extern	double	sqrt(double);
280 extern	double	fmod(double, double);
281 
282 #define	HUGE	3.4028234e38
283 #define	PIO2	1.570796326794896619231e0
284 #define	PI	(PIO2+PIO2)
285 
286 /*
287  * Time-of-day
288  */
289 
290 typedef
291 struct Tm
292 {
293 	int	sec;
294 	int	min;
295 	int	hour;
296 	int	mday;
297 	int	mon;
298 	int	year;
299 	int	wday;
300 	int	yday;
301 	char	zone[4];
302 	int	tzoff;
303 } Tm;
304 
305 extern	Tm*	gmtime(long);
306 extern	Tm*	localtime(long);
307 extern	char*	asctime(Tm*);
308 extern	char*	ctime(long);
309 extern	double	cputime(void);
310 extern	long	times(long*);
311 extern	long	tm2sec(Tm*);
312 extern	vlong	nsec(void);
313 
314 /*
315  * one-of-a-kind
316  */
317 enum
318 {
319 	PNPROC		= 1,
320 	PNGROUP		= 2,
321 };
322 extern	vlong	nsec(void);
323 
324 extern	void	_assert(char*);
325 extern	int	abs(int);
326 extern	int	atexit(void(*)(void));
327 extern	void	atexitdont(void(*)(void));
328 extern	int	atnotify(int(*)(void*, char*), int);
329 extern	double	atof(char*);
330 extern	int	atoi(char*);
331 extern	long	atol(char*);
332 extern	double	charstod(int(*)(void*), void*);
333 extern	char*	cleanname(char*);
334 extern	int	decrypt(void*, void*, int);
335 extern	int	encrypt(void*, void*, int);
336 extern	int	dec64(uchar*, int, char*, int);
337 extern	int	enc64(char*, int, uchar*, int);
338 extern	int	dec32(uchar*, int, char*, int);
339 extern	int	enc32(char*, int, uchar*, int);
340 extern	int	dec16(uchar*, int, char*, int);
341 extern	int	enc16(char*, int, uchar*, int);
342 extern	int	encodefmt(Fmt*);
343 extern	void	exits(char*);
344 extern	double	frexp(double, int*);
345 extern	uintptr	getcallerpc(void*);
346 extern	char*	getenv(char*);
347 extern	int	getfields(char*, char**, int, int, char*);
348 extern	char*	getuser(void);
349 extern	char*	getwd(char*, int);
350 extern	long	labs(long);
351 extern	double	ldexp(double, int);
352 /*extern	void	longjmp(jmp_buf, int);*/
353 extern	char*	mktemp(char*);
354 extern	double	modf(double, double*);
355 extern	int	netcrypt(void*, void*);
356 /*extern	void	notejmp(void*, jmp_buf, int);*/
357 extern	void	perror(char*);
358 extern  int	postnote(int, int, char *);
359 extern	double	pow10(int);
360 extern	double	ipow10(int);
361 extern	int	putenv(char*, char*);
362 extern	void	qsort(void*, long, long, int (*)(void*, void*));
363 /*extern	int	setjmp(jmp_buf);*/
364 extern	double	strtod(char*, char**);
365 extern	long	strtol(char*, char**, int);
366 extern	ulong	strtoul(char*, char**, int);
367 extern	vlong	strtoll(char*, char**, int);
368 extern	uvlong	strtoull(char*, char**, int);
369 extern	void	sysfatal(char*, ...);
370 #pragma	varargck	argpos	sysfatal	1
371 extern	void	syslog(int, char*, char*, ...);
372 #pragma	varargck	argpos	syslog	3
373 extern	int	_tas(int*);
374 extern	long	time(long*);
375 extern	int	tolower(int);
376 extern	int	toupper(int);
377 
378 /*
379  *  network dialing
380  */
381 #define NETPATHLEN 40
382 extern	int	accept(int, char*);
383 extern	int	announce(char*, char*);
384 extern	int	dial(char*, char*, char*, int*);
385 extern	void	setnetmtpt(char*, int, char*);
386 extern	int	hangup(int);
387 extern	int	listen(char*, char*);
388 extern	char*	netmkaddr(char*, char*, char*);
389 extern	int	reject(int, char*, char*);
390 
391 /*
392  * system calls
393  *
394  */
395 #define	STATMAX	65535U	/* max length of machine-independent stat structure */
396 #define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
397 #define	ERRMAX	128	/* max length of error string */
398 
399 #define	MORDER	0x0003	/* mask for bits defining order of mounting */
400 #define	MREPL	0x0000	/* mount replaces object */
401 #define	MBEFORE	0x0001	/* mount goes before others in union directory */
402 #define	MAFTER	0x0002	/* mount goes after others in union directory */
403 #define	MCREATE	0x0004	/* permit creation in mounted directory */
404 #define	MCACHE	0x0010	/* cache some data */
405 #define	MMASK	0x0017	/* all bits on */
406 
407 #define	OREAD	0	/* open for read */
408 #define	OWRITE	1	/* write */
409 #define	ORDWR	2	/* read and write */
410 #define	OEXEC	3	/* execute, == read but check execute permission */
411 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
412 #define	OCEXEC	32	/* or'ed in, close on exec */
413 #define	ORCLOSE	64	/* or'ed in, remove on close */
414 #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
415 
416 #define	AEXIST	0	/* accessible: exists */
417 #define	AEXEC	1	/* execute access */
418 #define	AWRITE	2	/* write access */
419 #define	AREAD	4	/* read access */
420 
421 /* Segattch */
422 #define	SG_RONLY	0040	/* read only */
423 #define	SG_CEXEC	0100	/* detach on exec */
424 
425 #define	NCONT	0	/* continue after note */
426 #define	NDFLT	1	/* terminate after note */
427 #define	NSAVE	2	/* clear note but hold state */
428 #define	NRSTR	3	/* restore saved state */
429 
430 /* rfork */
431 enum
432 {
433 	RFNAMEG		= (1<<0),
434 	RFENVG		= (1<<1),
435 	RFFDG		= (1<<2),
436 	RFNOTEG		= (1<<3),
437 	RFPROC		= (1<<4),
438 	RFMEM		= (1<<5),
439 	RFNOWAIT	= (1<<6),
440 	RFCNAMEG	= (1<<10),
441 	RFCENVG		= (1<<11),
442 	RFCFDG		= (1<<12),
443 	RFREND		= (1<<13),
444 	RFNOMNT		= (1<<14)
445 };
446 
447 /* bits in Qid.type */
448 #define QTDIR		0x80		/* type bit for directories */
449 #define QTAPPEND	0x40		/* type bit for append only files */
450 #define QTEXCL		0x20		/* type bit for exclusive use files */
451 #define QTMOUNT		0x10		/* type bit for mounted channel */
452 #define QTAUTH		0x08		/* type bit for authentication file */
453 #define QTFILE		0x00		/* plain file */
454 
455 /* bits in Dir.mode */
456 #define DMDIR		0x80000000	/* mode bit for directories */
457 #define DMAPPEND	0x40000000	/* mode bit for append only files */
458 #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
459 #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
460 #define DMAUTH		0x08000000	/* mode bit for authentication file */
461 #define DMREAD		0x4		/* mode bit for read permission */
462 #define DMWRITE		0x2		/* mode bit for write permission */
463 #define DMEXEC		0x1		/* mode bit for execute permission */
464 
465 typedef
466 struct Qid
467 {
468 	uvlong	path;
469 	ulong	vers;
470 	uchar	type;
471 } Qid;
472 
473 typedef
474 struct Dir {
475 
476 	/* system-modified data */
477 	ushort	type;	/* server type */
478 	uint	dev;	/* server subtype */
479 	/* file data */
480 	Qid	qid;	/* unique id from server */
481 	ulong	mode;	/* permissions */
482 	ulong	atime;	/* last read time */
483 	ulong	mtime;	/* last write time */
484 	vlong	length;	/* file length */
485 	char	*name;	/* last element of path */
486 	char	*uid;	/* owner name */
487 	char	*gid;	/* group name */
488 	char	*muid;	/* last modifier name */
489 } Dir;
490 
491 extern	Dir*	dirstat(char*);
492 extern	Dir*	dirfstat(int);
493 extern	int	dirwstat(char*, Dir*);
494 extern	int	dirfwstat(int, Dir*);
495 extern	long	dirread(int, Dir**);
496 extern	void	nulldir(Dir*);
497 extern	long	dirreadall(int, Dir**);
498 
499 #define CHDIR		0x80000000	/* mode bit for directories */
500 #define CHAPPEND	0x40000000	/* mode bit for append only files */
501 #define CHEXCL		0x20000000	/* mode bit for exclusive use files */
502 #define CHMOUNT		0x10000000	/* mode bit for mounted channel */
503 #define CHREAD		0x4		/* mode bit for read permission */
504 #define CHWRITE		0x2		/* mode bit for write permission */
505 #define CHEXEC		0x1		/* mode bit for execute permission */
506 
507 
508 typedef
509 struct Waitmsg
510 {
511 	char	pid[12];	/* of loved one */
512 	char	time[3*12];	/* of loved one & descendants */
513 	char	*msg;
514 } Waitmsg;
515 
516 typedef
517 struct IOchunk
518 {
519 	void	*addr;
520 	ulong	len;
521 } IOchunk;
522 
523 extern	void	_exits(char*);
524 
525 extern	void	abort(void);
526 extern	int	access(char*, int);
527 extern	long	alarm(ulong);
528 extern	int	await(char*, int);
529 extern	int	bind(char*, char*, int);
530 extern	int	brk(void*);
531 extern	int	chdir(char*);
532 extern	int	close(int);
533 extern	int	create(char*, int, ulong);
534 extern	int	dup(int, int);
535 extern	int	errstr(char*, uint);
536 extern	int	exec(char*, char*[]);
537 extern	int	execl(char*, ...);
538 extern  int	filsys(int, int, char*);
539 extern	int	fork(void);
540 extern	int	rfork(int);
541 extern	int	fauth(int, char*);
542 extern	int	fstat(int, uchar*, int);
543 extern	int	fwstat(int, uchar*, int);
544 extern	int	fversion(int, int, char*, int);
545 extern	int	mount(int, int, char*, int, char*);
546 extern	int	unmount(char*, char*);
547 extern	int	noted(int);
548 extern	int	notify(void(*)(void*, char*));
549 extern	int	open(char*, int);
550 extern	int	fd2path(int, char*, int);
551 extern	int	pipe(int*);
552 extern	long	pread(int, void*, long, vlong);
553 extern	long	pwrite(int, void*, long, vlong);
554 extern	long	read(int, void*, long);
555 extern	long	readn(int, void*, long);
556 extern	int	remove(char*);
557 extern	void*	sbrk(ulong);
558 extern	vlong	seek(int, vlong, int);
559 extern	long	segattach(int, char*, void*, ulong);
560 extern	int	segbrk(void*, void*);
561 extern	int	segdetach(void*);
562 extern	int	segflush(void*, ulong);
563 extern	int	segfree(void*, ulong);
564 extern	int	sleep(long);
565 extern	int	stat(char*, uchar*, int);
566 extern	Waitmsg*	wait(void);
567 extern	int	waitpid(void);
568 extern	long	write(int, void*, long);
569 extern	long	write9p(int, void*, long);
570 extern	int	wstat(char*, char*);
571 extern	ulong	rendezvous(ulong, ulong);
572 
573 extern	int	getpid(void);
574 extern	int	getppid(void);
575 extern	void	rerrstr(char*, uint);
576 extern	char*	sysname(void);
577 extern	void	werrstr(char*, ...);
578 #pragma	varargck	argpos	werrstr	1
579 
580 extern char *argv0;
581 #define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
582 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
583 			    argc--, argv++) {\
584 				char *_args, *_argt;\
585 				Rune _argc;\
586 				_args = &argv[0][1];\
587 				if(_args[0]=='-' && _args[1]==0){\
588 					argc--; argv++; break;\
589 				}\
590 				_argc = 0;\
591 				while(*_args && (_args += chartorune(&_argc, _args)))\
592 				switch(_argc)
593 #define	ARGEND		SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc);
594 #define	ARGF()		(_argt=_args, _args="",\
595 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
596 #define	EARGF(x)	(_argt=_args, _args="",\
597 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
598 
599 #define	ARGC()		_argc
600