xref: /plan9-contrib/sys/include/libc.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #pragma	lib	"libc.a"
2 #pragma src	"/sys/src/libc"
3 
4 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
5 
6 /*
7  * mem routines
8  */
9 extern	void*	memccpy(void*, void*, int, ulong);
10 extern	void*	memset(void*, int, ulong);
11 extern	int	memcmp(void*, void*, ulong);
12 extern	void*	memcpy(void*, void*, ulong);
13 extern	void*	memmove(void*, void*, ulong);
14 extern	void*	memchr(void*, int, ulong);
15 
16 /*
17  * string routines
18  */
19 extern	char*	strcat(char*, char*);
20 extern	char*	strchr(char*, char);
21 extern	int	strcmp(char*, char*);
22 extern	char*	strcpy(char*, char*);
23 extern	char*	strdup(char*);
24 extern	char*	strncat(char*, char*, long);
25 extern	char*	strncpy(char*, char*, long);
26 extern	int	strncmp(char*, char*, long);
27 extern	char*	strpbrk(char*, char*);
28 extern	char*	strrchr(char*, char);
29 extern	char*	strtok(char*, char*);
30 extern	long	strlen(char*);
31 extern	long	strspn(char*, char*);
32 extern	long	strcspn(char*, char*);
33 extern	char*	strstr(char*, char*);
34 extern	int	tokenize(char*, char**, int);
35 
36 enum
37 {
38 	UTFmax		= 3,		/* maximum bytes per rune */
39 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
40 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
41 	Runeerror	= 0x80,		/* decoding error in UTF */
42 };
43 
44 /*
45  * new rune routines
46  */
47 extern	int	runetochar(char*, Rune*);
48 extern	int	chartorune(Rune*, char*);
49 extern	int	runelen(long);
50 extern	int	fullrune(char*, int);
51 
52 /*
53  * rune routines from converted str routines
54  */
55 extern	int	utflen(char*);
56 extern	char*	utfrune(char*, long);
57 extern	char*	utfrrune(char*, long);
58 extern	char*	utfutf(char*, char*);
59 
60 /*
61  * malloc
62  */
63 extern	void*	malloc(long);
64 extern	void	free(void*);
65 extern	void*	calloc(long, long);
66 extern	void*	realloc(void*, long);
67 
68 /*
69  * print routines
70  */
71 typedef	struct	Fconv	Fconv;
72 struct	Fconv
73 {
74 	char*	out;		/* pointer to next output */
75 	char*	eout;		/* pointer to end */
76 	int	f1;
77 	int	f2;
78 	int	f3;
79 	int	chr;
80 };
81 extern	char*	doprint(char*, char*, char*, void*);
82 extern	int	print(char*, ...);
83 extern	int	snprint(char*, int, char*, ...);
84 extern	int	sprint(char*, char*, ...);
85 extern	int	fprint(int, char*, ...);
86 
87 extern	int	fmtinstall(int, int (*)(void*, Fconv*));
88 extern	int	numbconv(void*, Fconv*);
89 extern	void	strconv(char*, Fconv*);
90 extern	int	fltconv(void*, Fconv*);
91 /*
92  * random number
93  */
94 extern	void	srand(long);
95 extern	int	rand(void);
96 extern	int	nrand(int);
97 extern	long	lrand(void);
98 extern	long	lnrand(long);
99 extern	double	frand(void);
100 
101 /*
102  * math
103  */
104 extern	ulong	getfcr(void);
105 extern	void	setfsr(ulong);
106 extern	ulong	getfsr(void);
107 extern	void	setfcr(ulong);
108 extern	double	NaN(void);
109 extern	double	Inf(int);
110 extern	int	isNaN(double);
111 extern	int	isInf(double, int);
112 
113 extern	double	pow(double, double);
114 extern	double	atan2(double, double);
115 extern	double	fabs(double);
116 extern	double	atan(double);
117 extern	double	log(double);
118 extern	double	log10(double);
119 extern	double	exp(double);
120 extern	double	floor(double);
121 extern	double	ceil(double);
122 extern	double	hypot(double, double);
123 extern	double	sin(double);
124 extern	double	cos(double);
125 extern	double	tan(double);
126 extern	double	asin(double);
127 extern	double	acos(double);
128 extern	double	sinh(double);
129 extern	double	cosh(double);
130 extern	double	tanh(double);
131 extern	double	sqrt(double);
132 extern	double	fmod(double, double);
133 
134 #define	HUGE	3.4028234e38
135 #define	PIO2	1.570796326794896619231e0
136 #define	PI	(PIO2+PIO2)
137 
138 /*
139  * Time-of-day
140  */
141 
142 typedef
143 struct Tm
144 {
145 	int	sec;
146 	int	min;
147 	int	hour;
148 	int	mday;
149 	int	mon;
150 	int	year;
151 	int	wday;
152 	int	yday;
153 	char	zone[4];
154 } Tm;
155 
156 extern	Tm*	gmtime(long);
157 extern	Tm*	localtime(long);
158 extern	char*	asctime(Tm*);
159 extern	char*	ctime(long);
160 extern	double	cputime(void);
161 extern	long	times(long*);
162 
163 /*
164  * one-of-a-kind
165  */
166 enum
167 {
168 	PNPROC		= 1,
169 	PNGROUP		= 2,
170 };
171 
172 extern	int	abs(int);
173 extern	int	atexit(void(*)(void));
174 extern	void	atexitdont(void(*)(void));
175 extern	int	atnotify(int(*)(void*, char*), int);
176 extern	double	atof(char*);
177 extern	int	atoi(char*);
178 extern	long	atol(char*);
179 extern	double	charstod(int(*)(void*), void*);
180 extern	int	decrypt(void*, void*, int);
181 extern	int	encrypt(void*, void*, int);
182 extern	void	exits(char*);
183 extern	double	frexp(double, int*);
184 extern	char*	getenv(char*);
185 extern	int	getfields(char*, char**, int);
186 extern	int	getmfields(char*, char**, int);
187 extern	char*	getuser(void);
188 extern	char*	getwd(char*, int);
189 extern	long	labs(long);
190 extern	double	ldexp(double, int);
191 extern	void	longjmp(jmp_buf, int);
192 extern	char*	mktemp(char*);
193 extern	double	modf(double, double*);
194 extern	int	netcrypt(void*, void*);
195 extern	void	notejmp(void*, jmp_buf, int);
196 extern	void	perror(char*);
197 extern  int	postnote(int, int, char *);
198 extern	double	pow10(int);
199 extern	int	putenv(char*, char*);
200 extern	void	qsort(void*, long, long, int (*)(void*, void*));
201 extern	char*	setfields(char*);
202 extern	int	setjmp(jmp_buf);
203 extern	double	strtod(char*, char**);
204 extern	long	strtol(char*, char**, int);
205 extern	ulong	strtoul(char*, char**, int);
206 extern	void	syslog(int, char*, char*, ...);
207 extern	long	time(long*);
208 extern	int	tolower(int);
209 extern	int	toupper(int);
210 
211 
212 /*
213  *  network dialing and authentication
214  */
215 #define NETPATHLEN 40
216 extern	int	accept(int, char*);
217 extern	int	announce(char*, char*);
218 extern	int	dial(char*, char*, char*, int*);
219 extern	int	hangup(int);
220 extern	int	listen(char*, char*);
221 extern	char*	netmkaddr(char*, char*, char*);
222 extern	int	reject(int, char*, char*);
223 
224 /*
225  * system calls
226  *
227  */
228 #define	NAMELEN	28	/* length of path element, including '\0' */
229 #define	DIRLEN	116	/* length of machine-independent Dir structure */
230 #define	ERRLEN	64	/* length of error string */
231 
232 #define	MORDER	0x0003	/* mask for bits defining order of mounting */
233 #define	MREPL	0x0000	/* mount replaces object */
234 #define	MBEFORE	0x0001	/* mount goes before others in union directory */
235 #define	MAFTER	0x0002	/* mount goes after others in union directory */
236 #define	MCREATE	0x0004	/* permit creation in mounted directory */
237 #define	MMASK	0x0007	/* all bits on */
238 
239 #define	OREAD	0	/* open for read */
240 #define	OWRITE	1	/* write */
241 #define	ORDWR	2	/* read and write */
242 #define	OEXEC	3	/* execute, == read but check execute permission */
243 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
244 #define	OCEXEC	32	/* or'ed in, close on exec */
245 #define	ORCLOSE	64	/* or'ed in, remove on close */
246 
247 /* Segattch */
248 #define	SG_RONLY	0040	/* read only */
249 #define	SG_CEXEC	0100	/* detach on exec */
250 
251 #define	NCONT	0	/* continue after note */
252 #define	NDFLT	1	/* terminate after note */
253 #define	NSAVE	2	/* clear note but hold state */
254 #define	NRSTR	3	/* restore saved state */
255 
256 #define CHDIR		0x80000000	/* mode bit for directories */
257 #define CHAPPEND	0x40000000	/* mode bit for append only files */
258 #define CHEXCL		0x20000000	/* mode bit for exclusive use files */
259 #define CHMOUNT		0x10000000	/* mode bit for mounted channel */
260 #define CHREAD		0x4		/* mode bit for read permission */
261 #define CHWRITE		0x2		/* mode bit for write permission */
262 #define CHEXEC		0x1		/* mode bit for execute permission */
263 
264 /* rfork */
265 enum
266 {
267 	RFNAMEG		= (1<<0),
268 	RFENVG		= (1<<1),
269 	RFFDG		= (1<<2),
270 	RFNOTEG		= (1<<3),
271 	RFPROC		= (1<<4),
272 	RFMEM		= (1<<5),
273 	RFNOWAIT	= (1<<6),
274 	RFCNAMEG	= (1<<10),
275 	RFCENVG		= (1<<11),
276 	RFCFDG		= (1<<12)
277 };
278 
279 typedef
280 struct Qid
281 {
282 	ulong	path;
283 	ulong	vers;
284 } Qid;
285 
286 typedef
287 struct Dir
288 {
289 	char	name[NAMELEN];
290 	char	uid[NAMELEN];
291 	char	gid[NAMELEN];
292 	Qid	qid;
293 	ulong	mode;
294 	int	atime;
295 	int	mtime;
296 	Length;
297 	ushort	type;
298 	ushort	dev;
299 } Dir;
300 
301 typedef
302 struct Waitmsg
303 {
304 	char	pid[12];	/* of loved one */
305 	char	time[3*12];	/* of loved one & descendants */
306 	char	msg[ERRLEN];
307 } Waitmsg;
308 
309 extern	void	_exits(char*);
310 
311 extern	void	abort(void);
312 extern	int	access(char*, int);
313 extern	long	alarm(ulong);
314 extern	int	bind(char*, char*, int);
315 extern	int	brk(void*);
316 extern	int	chdir(char*);
317 extern	int	close(int);
318 extern	int	create(char*, int, ulong);
319 extern	int	dup(int, int);
320 extern	int	errstr(char*);
321 extern	int	exec(char*, char*[]);
322 extern	int	execl(char*, ...);
323 extern  int	filsys(int, int, char*);
324 extern	int	fork(void);
325 extern	int	rfork(int);
326 extern	int	fauth(int, char*);
327 extern	int	fsession(int, char*);
328 extern	int	fstat(int, char*);
329 extern	int	fwstat(int, char*);
330 extern	int	mount(int, char*, int, char*);
331 extern	int	unmount(char*, char*);
332 extern	int	noted(int);
333 extern	int	notify(void(*)(void*, char*));
334 extern	int	open(char*, int);
335 extern	int	pipe(int*);
336 extern	long	read(int, void*, long);
337 extern	long	readn(int, void*, long);
338 #define		read9p read
339 extern	int	remove(char*);
340 extern	void*	sbrk(ulong);
341 extern	long	seek(int, long, int);
342 extern	long	segattach(int, char*, void*, ulong);
343 extern	int	segbrk(void*, void*);
344 extern	int	segdetach(void*);
345 extern	int	segflush(void*, ulong);
346 extern	int	segfree(void*, ulong);
347 extern	int	sleep(long);
348 extern	int	stat(char*, char*);
349 extern	int	wait(Waitmsg*);
350 extern	long	write(int, void*, long);
351 #define		write9p write
352 extern	int	wstat(char*, char*);
353 extern	int	rendezvous(ulong, ulong);
354 
355 extern	int	dirstat(char*, Dir*);
356 extern	int	dirfstat(int, Dir*);
357 extern	int	dirwstat(char*, Dir*);
358 extern	int	dirfwstat(int, Dir*);
359 extern	long	dirread(int, Dir*, long);
360 extern	int	getpid(void);
361 extern	int	getppid(void);
362 extern	void	werrstr(char*, ...);
363 
364 extern char *argv0;
365 #define	ARGBEGIN	for((argv0? 0: (argv0=*argv)),argv++,argc--;\
366 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
367 			    argc--, argv++) {\
368 				char *_args, *_argt;\
369 				Rune _argc;\
370 				_args = &argv[0][1];\
371 				if(_args[0]=='-' && _args[1]==0){\
372 					argc--; argv++; break;\
373 				}\
374 				_argc = 0;\
375 				while(*_args && (_args += chartorune(&_argc, _args)))\
376 				switch(_argc)
377 #define	ARGEND		SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc);
378 #define	ARGF()		(_argt=_args, _args="",\
379 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
380 #define	ARGC()		_argc
381