xref: /plan9-contrib/sys/include/libc.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #pragma	lib	"libc.a"
2*219b2ee8SDavid du Colombier #pragma src	"/sys/src/libc"
3*219b2ee8SDavid du Colombier 
4*219b2ee8SDavid du Colombier #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier /*
73e12c5d1SDavid du Colombier  * mem routines
83e12c5d1SDavid du Colombier  */
93e12c5d1SDavid du Colombier extern	void*	memccpy(void*, void*, int, ulong);
103e12c5d1SDavid du Colombier extern	void*	memset(void*, int, ulong);
113e12c5d1SDavid du Colombier extern	int	memcmp(void*, void*, ulong);
123e12c5d1SDavid du Colombier extern	void*	memcpy(void*, void*, ulong);
133e12c5d1SDavid du Colombier extern	void*	memmove(void*, void*, ulong);
143e12c5d1SDavid du Colombier extern	void*	memchr(void*, int, ulong);
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier /*
173e12c5d1SDavid du Colombier  * string routines
183e12c5d1SDavid du Colombier  */
193e12c5d1SDavid du Colombier extern	char*	strcat(char*, char*);
203e12c5d1SDavid du Colombier extern	char*	strchr(char*, char);
213e12c5d1SDavid du Colombier extern	int	strcmp(char*, char*);
223e12c5d1SDavid du Colombier extern	char*	strcpy(char*, char*);
233e12c5d1SDavid du Colombier extern	char*	strdup(char*);
243e12c5d1SDavid du Colombier extern	char*	strncat(char*, char*, long);
253e12c5d1SDavid du Colombier extern	char*	strncpy(char*, char*, long);
263e12c5d1SDavid du Colombier extern	int	strncmp(char*, char*, long);
273e12c5d1SDavid du Colombier extern	char*	strpbrk(char*, char*);
283e12c5d1SDavid du Colombier extern	char*	strrchr(char*, char);
293e12c5d1SDavid du Colombier extern	char*	strtok(char*, char*);
303e12c5d1SDavid du Colombier extern	long	strlen(char*);
313e12c5d1SDavid du Colombier extern	long	strspn(char*, char*);
323e12c5d1SDavid du Colombier extern	long	strcspn(char*, char*);
333e12c5d1SDavid du Colombier extern	char*	strstr(char*, char*);
34*219b2ee8SDavid du Colombier extern	int	tokenize(char*, char**, int);
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier enum
373e12c5d1SDavid du Colombier {
383e12c5d1SDavid du Colombier 	UTFmax		= 3,		/* maximum bytes per rune */
393e12c5d1SDavid du Colombier 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
403e12c5d1SDavid du Colombier 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
413e12c5d1SDavid du Colombier 	Runeerror	= 0x80,		/* decoding error in UTF */
423e12c5d1SDavid du Colombier };
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier /*
453e12c5d1SDavid du Colombier  * new rune routines
463e12c5d1SDavid du Colombier  */
473e12c5d1SDavid du Colombier extern	int	runetochar(char*, Rune*);
483e12c5d1SDavid du Colombier extern	int	chartorune(Rune*, char*);
493e12c5d1SDavid du Colombier extern	int	runelen(long);
503e12c5d1SDavid du Colombier extern	int	fullrune(char*, int);
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier /*
533e12c5d1SDavid du Colombier  * rune routines from converted str routines
543e12c5d1SDavid du Colombier  */
553e12c5d1SDavid du Colombier extern	int	utflen(char*);
563e12c5d1SDavid du Colombier extern	char*	utfrune(char*, long);
573e12c5d1SDavid du Colombier extern	char*	utfrrune(char*, long);
583e12c5d1SDavid du Colombier extern	char*	utfutf(char*, char*);
593e12c5d1SDavid du Colombier 
603e12c5d1SDavid du Colombier /*
613e12c5d1SDavid du Colombier  * malloc
623e12c5d1SDavid du Colombier  */
633e12c5d1SDavid du Colombier extern	void*	malloc(long);
643e12c5d1SDavid du Colombier extern	void	free(void*);
653e12c5d1SDavid du Colombier extern	void*	calloc(long, long);
663e12c5d1SDavid du Colombier extern	void*	realloc(void*, long);
673e12c5d1SDavid du Colombier 
683e12c5d1SDavid du Colombier /*
693e12c5d1SDavid du Colombier  * print routines
703e12c5d1SDavid du Colombier  */
71bd389b36SDavid du Colombier typedef	struct	Fconv	Fconv;
72bd389b36SDavid du Colombier struct	Fconv
73bd389b36SDavid du Colombier {
74bd389b36SDavid du Colombier 	char*	out;		/* pointer to next output */
75bd389b36SDavid du Colombier 	char*	eout;		/* pointer to end */
76bd389b36SDavid du Colombier 	int	f1;
77bd389b36SDavid du Colombier 	int	f2;
78bd389b36SDavid du Colombier 	int	f3;
79bd389b36SDavid du Colombier 	int	chr;
80bd389b36SDavid du Colombier };
813e12c5d1SDavid du Colombier extern	char*	doprint(char*, char*, char*, void*);
823e12c5d1SDavid du Colombier extern	int	print(char*, ...);
83bd389b36SDavid du Colombier extern	int	snprint(char*, int, char*, ...);
843e12c5d1SDavid du Colombier extern	int	sprint(char*, char*, ...);
853e12c5d1SDavid du Colombier extern	int	fprint(int, char*, ...);
863e12c5d1SDavid du Colombier 
87bd389b36SDavid du Colombier extern	int	fmtinstall(int, int (*)(void*, Fconv*));
88bd389b36SDavid du Colombier extern	int	numbconv(void*, Fconv*);
89bd389b36SDavid du Colombier extern	void	strconv(char*, Fconv*);
90bd389b36SDavid du Colombier extern	int	fltconv(void*, Fconv*);
913e12c5d1SDavid du Colombier /*
923e12c5d1SDavid du Colombier  * random number
933e12c5d1SDavid du Colombier  */
943e12c5d1SDavid du Colombier extern	void	srand(long);
953e12c5d1SDavid du Colombier extern	int	rand(void);
963e12c5d1SDavid du Colombier extern	int	nrand(int);
973e12c5d1SDavid du Colombier extern	long	lrand(void);
983e12c5d1SDavid du Colombier extern	long	lnrand(long);
993e12c5d1SDavid du Colombier extern	double	frand(void);
1003e12c5d1SDavid du Colombier 
1013e12c5d1SDavid du Colombier /*
1023e12c5d1SDavid du Colombier  * math
1033e12c5d1SDavid du Colombier  */
1043e12c5d1SDavid du Colombier extern	ulong	getfcr(void);
1053e12c5d1SDavid du Colombier extern	void	setfsr(ulong);
1063e12c5d1SDavid du Colombier extern	ulong	getfsr(void);
1073e12c5d1SDavid du Colombier extern	void	setfcr(ulong);
1083e12c5d1SDavid du Colombier extern	double	NaN(void);
1093e12c5d1SDavid du Colombier extern	double	Inf(int);
1103e12c5d1SDavid du Colombier extern	int	isNaN(double);
1113e12c5d1SDavid du Colombier extern	int	isInf(double, int);
1123e12c5d1SDavid du Colombier 
1133e12c5d1SDavid du Colombier extern	double	pow(double, double);
1143e12c5d1SDavid du Colombier extern	double	atan2(double, double);
1153e12c5d1SDavid du Colombier extern	double	fabs(double);
1163e12c5d1SDavid du Colombier extern	double	atan(double);
1173e12c5d1SDavid du Colombier extern	double	log(double);
1183e12c5d1SDavid du Colombier extern	double	log10(double);
1193e12c5d1SDavid du Colombier extern	double	exp(double);
1203e12c5d1SDavid du Colombier extern	double	floor(double);
1213e12c5d1SDavid du Colombier extern	double	ceil(double);
1223e12c5d1SDavid du Colombier extern	double	hypot(double, double);
1233e12c5d1SDavid du Colombier extern	double	sin(double);
1243e12c5d1SDavid du Colombier extern	double	cos(double);
1253e12c5d1SDavid du Colombier extern	double	tan(double);
1263e12c5d1SDavid du Colombier extern	double	asin(double);
1273e12c5d1SDavid du Colombier extern	double	acos(double);
1283e12c5d1SDavid du Colombier extern	double	sinh(double);
1293e12c5d1SDavid du Colombier extern	double	cosh(double);
1303e12c5d1SDavid du Colombier extern	double	tanh(double);
1313e12c5d1SDavid du Colombier extern	double	sqrt(double);
1323e12c5d1SDavid du Colombier extern	double	fmod(double, double);
1333e12c5d1SDavid du Colombier 
1343e12c5d1SDavid du Colombier #define	HUGE	3.4028234e38
1353e12c5d1SDavid du Colombier #define	PIO2	1.570796326794896619231e0
1363e12c5d1SDavid du Colombier #define	PI	(PIO2+PIO2)
1373e12c5d1SDavid du Colombier 
1383e12c5d1SDavid du Colombier /*
1393e12c5d1SDavid du Colombier  * Time-of-day
1403e12c5d1SDavid du Colombier  */
1413e12c5d1SDavid du Colombier 
1423e12c5d1SDavid du Colombier typedef
1433e12c5d1SDavid du Colombier struct Tm
1443e12c5d1SDavid du Colombier {
1453e12c5d1SDavid du Colombier 	int	sec;
1463e12c5d1SDavid du Colombier 	int	min;
1473e12c5d1SDavid du Colombier 	int	hour;
1483e12c5d1SDavid du Colombier 	int	mday;
1493e12c5d1SDavid du Colombier 	int	mon;
1503e12c5d1SDavid du Colombier 	int	year;
1513e12c5d1SDavid du Colombier 	int	wday;
1523e12c5d1SDavid du Colombier 	int	yday;
1533e12c5d1SDavid du Colombier 	char	zone[4];
1543e12c5d1SDavid du Colombier } Tm;
1553e12c5d1SDavid du Colombier 
1563e12c5d1SDavid du Colombier extern	Tm*	gmtime(long);
1573e12c5d1SDavid du Colombier extern	Tm*	localtime(long);
1583e12c5d1SDavid du Colombier extern	char*	asctime(Tm*);
1593e12c5d1SDavid du Colombier extern	char*	ctime(long);
1603e12c5d1SDavid du Colombier extern	double	cputime(void);
1613e12c5d1SDavid du Colombier extern	long	times(long*);
1623e12c5d1SDavid du Colombier 
1633e12c5d1SDavid du Colombier /*
1643e12c5d1SDavid du Colombier  * one-of-a-kind
1653e12c5d1SDavid du Colombier  */
166*219b2ee8SDavid du Colombier enum
167*219b2ee8SDavid du Colombier {
168*219b2ee8SDavid du Colombier 	PNPROC		= 1,
169*219b2ee8SDavid du Colombier 	PNGROUP		= 2,
170*219b2ee8SDavid du Colombier };
1713e12c5d1SDavid du Colombier 
1723e12c5d1SDavid du Colombier extern	int	abs(int);
1733e12c5d1SDavid du Colombier extern	int	atexit(void(*)(void));
1743e12c5d1SDavid du Colombier extern	void	atexitdont(void(*)(void));
1753e12c5d1SDavid du Colombier extern	int	atnotify(int(*)(void*, char*), int);
1763e12c5d1SDavid du Colombier extern	double	atof(char*);
1773e12c5d1SDavid du Colombier extern	int	atoi(char*);
1783e12c5d1SDavid du Colombier extern	long	atol(char*);
1793e12c5d1SDavid du Colombier extern	double	charstod(int(*)(void*), void*);
1803e12c5d1SDavid du Colombier extern	int	decrypt(void*, void*, int);
1813e12c5d1SDavid du Colombier extern	int	encrypt(void*, void*, int);
1823e12c5d1SDavid du Colombier extern	void	exits(char*);
1833e12c5d1SDavid du Colombier extern	double	frexp(double, int*);
1843e12c5d1SDavid du Colombier extern	char*	getenv(char*);
1853e12c5d1SDavid du Colombier extern	int	getfields(char*, char**, int);
1863e12c5d1SDavid du Colombier extern	int	getmfields(char*, char**, int);
1873e12c5d1SDavid du Colombier extern	char*	getuser(void);
1883e12c5d1SDavid du Colombier extern	char*	getwd(char*, int);
1893e12c5d1SDavid du Colombier extern	long	labs(long);
1903e12c5d1SDavid du Colombier extern	double	ldexp(double, int);
1913e12c5d1SDavid du Colombier extern	void	longjmp(jmp_buf, int);
1923e12c5d1SDavid du Colombier extern	char*	mktemp(char*);
1933e12c5d1SDavid du Colombier extern	double	modf(double, double*);
1943e12c5d1SDavid du Colombier extern	int	netcrypt(void*, void*);
1953e12c5d1SDavid du Colombier extern	void	notejmp(void*, jmp_buf, int);
1963e12c5d1SDavid du Colombier extern	void	perror(char*);
197*219b2ee8SDavid du Colombier extern  int	postnote(int, int, char *);
1983e12c5d1SDavid du Colombier extern	double	pow10(int);
1993e12c5d1SDavid du Colombier extern	int	putenv(char*, char*);
2003e12c5d1SDavid du Colombier extern	void	qsort(void*, long, long, int (*)(void*, void*));
2013e12c5d1SDavid du Colombier extern	char*	setfields(char*);
2023e12c5d1SDavid du Colombier extern	int	setjmp(jmp_buf);
2033e12c5d1SDavid du Colombier extern	double	strtod(char*, char**);
2043e12c5d1SDavid du Colombier extern	long	strtol(char*, char**, int);
2053e12c5d1SDavid du Colombier extern	ulong	strtoul(char*, char**, int);
2063e12c5d1SDavid du Colombier extern	void	syslog(int, char*, char*, ...);
2073e12c5d1SDavid du Colombier extern	long	time(long*);
2083e12c5d1SDavid du Colombier extern	int	tolower(int);
2093e12c5d1SDavid du Colombier extern	int	toupper(int);
2103e12c5d1SDavid du Colombier 
2113e12c5d1SDavid du Colombier 
2123e12c5d1SDavid du Colombier /*
2133e12c5d1SDavid du Colombier  *  network dialing and authentication
2143e12c5d1SDavid du Colombier  */
2153e12c5d1SDavid du Colombier #define NETPATHLEN 40
2163e12c5d1SDavid du Colombier extern	int	accept(int, char*);
2173e12c5d1SDavid du Colombier extern	int	announce(char*, char*);
2183e12c5d1SDavid du Colombier extern	int	dial(char*, char*, char*, int*);
2193e12c5d1SDavid du Colombier extern	int	hangup(int);
2203e12c5d1SDavid du Colombier extern	int	listen(char*, char*);
2213e12c5d1SDavid du Colombier extern	char*	netmkaddr(char*, char*, char*);
2223e12c5d1SDavid du Colombier extern	int	reject(int, char*, char*);
2233e12c5d1SDavid du Colombier 
2243e12c5d1SDavid du Colombier /*
2253e12c5d1SDavid du Colombier  * system calls
2263e12c5d1SDavid du Colombier  *
2273e12c5d1SDavid du Colombier  */
2283e12c5d1SDavid du Colombier #define	NAMELEN	28	/* length of path element, including '\0' */
2293e12c5d1SDavid du Colombier #define	DIRLEN	116	/* length of machine-independent Dir structure */
2303e12c5d1SDavid du Colombier #define	ERRLEN	64	/* length of error string */
2313e12c5d1SDavid du Colombier 
2323e12c5d1SDavid du Colombier #define	MORDER	0x0003	/* mask for bits defining order of mounting */
2333e12c5d1SDavid du Colombier #define	MREPL	0x0000	/* mount replaces object */
2343e12c5d1SDavid du Colombier #define	MBEFORE	0x0001	/* mount goes before others in union directory */
2353e12c5d1SDavid du Colombier #define	MAFTER	0x0002	/* mount goes after others in union directory */
2363e12c5d1SDavid du Colombier #define	MCREATE	0x0004	/* permit creation in mounted directory */
2373e12c5d1SDavid du Colombier #define	MMASK	0x0007	/* all bits on */
2383e12c5d1SDavid du Colombier 
2393e12c5d1SDavid du Colombier #define	OREAD	0	/* open for read */
2403e12c5d1SDavid du Colombier #define	OWRITE	1	/* write */
2413e12c5d1SDavid du Colombier #define	ORDWR	2	/* read and write */
2423e12c5d1SDavid du Colombier #define	OEXEC	3	/* execute, == read but check execute permission */
2433e12c5d1SDavid du Colombier #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
2443e12c5d1SDavid du Colombier #define	OCEXEC	32	/* or'ed in, close on exec */
2453e12c5d1SDavid du Colombier #define	ORCLOSE	64	/* or'ed in, remove on close */
2463e12c5d1SDavid du Colombier 
247*219b2ee8SDavid du Colombier /* Segattch */
248*219b2ee8SDavid du Colombier #define	SG_RONLY	0040	/* read only */
249*219b2ee8SDavid du Colombier #define	SG_CEXEC	0100	/* detach on exec */
250*219b2ee8SDavid du Colombier 
2513e12c5d1SDavid du Colombier #define	NCONT	0	/* continue after note */
2523e12c5d1SDavid du Colombier #define	NDFLT	1	/* terminate after note */
253*219b2ee8SDavid du Colombier #define	NSAVE	2	/* clear note but hold state */
254*219b2ee8SDavid du Colombier #define	NRSTR	3	/* restore saved state */
2553e12c5d1SDavid du Colombier 
2563e12c5d1SDavid du Colombier #define CHDIR		0x80000000	/* mode bit for directories */
2573e12c5d1SDavid du Colombier #define CHAPPEND	0x40000000	/* mode bit for append only files */
2583e12c5d1SDavid du Colombier #define CHEXCL		0x20000000	/* mode bit for exclusive use files */
259*219b2ee8SDavid du Colombier #define CHMOUNT		0x10000000	/* mode bit for mounted channel */
2603e12c5d1SDavid du Colombier #define CHREAD		0x4		/* mode bit for read permission */
2613e12c5d1SDavid du Colombier #define CHWRITE		0x2		/* mode bit for write permission */
2623e12c5d1SDavid du Colombier #define CHEXEC		0x1		/* mode bit for execute permission */
2633e12c5d1SDavid du Colombier 
2643e12c5d1SDavid du Colombier /* rfork */
2653e12c5d1SDavid du Colombier enum
2663e12c5d1SDavid du Colombier {
2673e12c5d1SDavid du Colombier 	RFNAMEG		= (1<<0),
2683e12c5d1SDavid du Colombier 	RFENVG		= (1<<1),
2693e12c5d1SDavid du Colombier 	RFFDG		= (1<<2),
2703e12c5d1SDavid du Colombier 	RFNOTEG		= (1<<3),
2713e12c5d1SDavid du Colombier 	RFPROC		= (1<<4),
2723e12c5d1SDavid du Colombier 	RFMEM		= (1<<5),
2733e12c5d1SDavid du Colombier 	RFNOWAIT	= (1<<6),
2743e12c5d1SDavid du Colombier 	RFCNAMEG	= (1<<10),
2753e12c5d1SDavid du Colombier 	RFCENVG		= (1<<11),
2763e12c5d1SDavid du Colombier 	RFCFDG		= (1<<12)
2773e12c5d1SDavid du Colombier };
2783e12c5d1SDavid du Colombier 
2793e12c5d1SDavid du Colombier typedef
2803e12c5d1SDavid du Colombier struct Qid
2813e12c5d1SDavid du Colombier {
2823e12c5d1SDavid du Colombier 	ulong	path;
2833e12c5d1SDavid du Colombier 	ulong	vers;
2843e12c5d1SDavid du Colombier } Qid;
2853e12c5d1SDavid du Colombier 
2863e12c5d1SDavid du Colombier typedef
2873e12c5d1SDavid du Colombier struct Dir
2883e12c5d1SDavid du Colombier {
2893e12c5d1SDavid du Colombier 	char	name[NAMELEN];
2903e12c5d1SDavid du Colombier 	char	uid[NAMELEN];
2913e12c5d1SDavid du Colombier 	char	gid[NAMELEN];
2923e12c5d1SDavid du Colombier 	Qid	qid;
2933e12c5d1SDavid du Colombier 	ulong	mode;
2943e12c5d1SDavid du Colombier 	int	atime;
2953e12c5d1SDavid du Colombier 	int	mtime;
2963e12c5d1SDavid du Colombier 	Length;
297bd389b36SDavid du Colombier 	ushort	type;
298bd389b36SDavid du Colombier 	ushort	dev;
2993e12c5d1SDavid du Colombier } Dir;
3003e12c5d1SDavid du Colombier 
3013e12c5d1SDavid du Colombier typedef
3023e12c5d1SDavid du Colombier struct Waitmsg
3033e12c5d1SDavid du Colombier {
3043e12c5d1SDavid du Colombier 	char	pid[12];	/* of loved one */
3053e12c5d1SDavid du Colombier 	char	time[3*12];	/* of loved one & descendants */
3063e12c5d1SDavid du Colombier 	char	msg[ERRLEN];
3073e12c5d1SDavid du Colombier } Waitmsg;
3083e12c5d1SDavid du Colombier 
3093e12c5d1SDavid du Colombier extern	void	_exits(char*);
3103e12c5d1SDavid du Colombier 
3113e12c5d1SDavid du Colombier extern	void	abort(void);
3123e12c5d1SDavid du Colombier extern	int	access(char*, int);
3133e12c5d1SDavid du Colombier extern	long	alarm(ulong);
3143e12c5d1SDavid du Colombier extern	int	bind(char*, char*, int);
3153e12c5d1SDavid du Colombier extern	int	brk(void*);
3163e12c5d1SDavid du Colombier extern	int	chdir(char*);
3173e12c5d1SDavid du Colombier extern	int	close(int);
3183e12c5d1SDavid du Colombier extern	int	create(char*, int, ulong);
3193e12c5d1SDavid du Colombier extern	int	dup(int, int);
3203e12c5d1SDavid du Colombier extern	int	errstr(char*);
3213e12c5d1SDavid du Colombier extern	int	exec(char*, char*[]);
3223e12c5d1SDavid du Colombier extern	int	execl(char*, ...);
3233e12c5d1SDavid du Colombier extern  int	filsys(int, int, char*);
3243e12c5d1SDavid du Colombier extern	int	fork(void);
3253e12c5d1SDavid du Colombier extern	int	rfork(int);
326*219b2ee8SDavid du Colombier extern	int	fauth(int, char*);
327*219b2ee8SDavid du Colombier extern	int	fsession(int, char*);
3283e12c5d1SDavid du Colombier extern	int	fstat(int, char*);
3293e12c5d1SDavid du Colombier extern	int	fwstat(int, char*);
330*219b2ee8SDavid du Colombier extern	int	mount(int, char*, int, char*);
3313e12c5d1SDavid du Colombier extern	int	unmount(char*, char*);
3323e12c5d1SDavid du Colombier extern	int	noted(int);
3333e12c5d1SDavid du Colombier extern	int	notify(void(*)(void*, char*));
3343e12c5d1SDavid du Colombier extern	int	open(char*, int);
3353e12c5d1SDavid du Colombier extern	int	pipe(int*);
3363e12c5d1SDavid du Colombier extern	long	read(int, void*, long);
337*219b2ee8SDavid du Colombier extern	long	readn(int, void*, long);
338*219b2ee8SDavid du Colombier #define		read9p read
3393e12c5d1SDavid du Colombier extern	int	remove(char*);
3403e12c5d1SDavid du Colombier extern	void*	sbrk(ulong);
3413e12c5d1SDavid du Colombier extern	long	seek(int, long, int);
342*219b2ee8SDavid du Colombier extern	long	segattach(int, char*, void*, ulong);
3433e12c5d1SDavid du Colombier extern	int	segbrk(void*, void*);
3443e12c5d1SDavid du Colombier extern	int	segdetach(void*);
3453e12c5d1SDavid du Colombier extern	int	segflush(void*, ulong);
3463e12c5d1SDavid du Colombier extern	int	segfree(void*, ulong);
3473e12c5d1SDavid du Colombier extern	int	sleep(long);
3483e12c5d1SDavid du Colombier extern	int	stat(char*, char*);
3493e12c5d1SDavid du Colombier extern	int	wait(Waitmsg*);
3503e12c5d1SDavid du Colombier extern	long	write(int, void*, long);
351*219b2ee8SDavid du Colombier #define		write9p write
3523e12c5d1SDavid du Colombier extern	int	wstat(char*, char*);
3533e12c5d1SDavid du Colombier extern	int	rendezvous(ulong, ulong);
3543e12c5d1SDavid du Colombier 
3553e12c5d1SDavid du Colombier extern	int	dirstat(char*, Dir*);
3563e12c5d1SDavid du Colombier extern	int	dirfstat(int, Dir*);
3573e12c5d1SDavid du Colombier extern	int	dirwstat(char*, Dir*);
3583e12c5d1SDavid du Colombier extern	int	dirfwstat(int, Dir*);
3593e12c5d1SDavid du Colombier extern	long	dirread(int, Dir*, long);
3603e12c5d1SDavid du Colombier extern	int	getpid(void);
3613e12c5d1SDavid du Colombier extern	int	getppid(void);
362*219b2ee8SDavid du Colombier extern	void	werrstr(char*, ...);
3633e12c5d1SDavid du Colombier 
3643e12c5d1SDavid du Colombier extern char *argv0;
3653e12c5d1SDavid du Colombier #define	ARGBEGIN	for((argv0? 0: (argv0=*argv)),argv++,argc--;\
3663e12c5d1SDavid du Colombier 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
3673e12c5d1SDavid du Colombier 			    argc--, argv++) {\
3683e12c5d1SDavid du Colombier 				char *_args, *_argt;\
3693e12c5d1SDavid du Colombier 				Rune _argc;\
3703e12c5d1SDavid du Colombier 				_args = &argv[0][1];\
3713e12c5d1SDavid du Colombier 				if(_args[0]=='-' && _args[1]==0){\
3723e12c5d1SDavid du Colombier 					argc--; argv++; break;\
3733e12c5d1SDavid du Colombier 				}\
3743e12c5d1SDavid du Colombier 				_argc = 0;\
3753e12c5d1SDavid du Colombier 				while(*_args && (_args += chartorune(&_argc, _args)))\
3763e12c5d1SDavid du Colombier 				switch(_argc)
3773e12c5d1SDavid du Colombier #define	ARGEND		SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc);
3783e12c5d1SDavid du Colombier #define	ARGF()		(_argt=_args, _args="",\
3793e12c5d1SDavid du Colombier 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
3803e12c5d1SDavid du Colombier #define	ARGC()		_argc
381