xref: /inferno-os/Irix/mips/include/lib9.h (revision d0e1d143ef6f03c75c008c7ec648859dd260cbab)
1 #define _LARGEFILE64_SOURCE	1
2 #define _FILE_OFFSET_BITS 64
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #define _POSIX_SOURCE
6 #include <stdlib.h>
7 #include <stdarg.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <string.h>
11 #include "math.h"
12 #include <fcntl.h>
13 #include <setjmp.h>
14 #include <float.h>
15 #include <sys/bsd_types.h>
16 #include <time.h>
17 
18 #define	getwd	infgetwd
19 
20 #ifndef EMU
21 typedef struct Proc Proc;
22 #endif
23 
24 #define	nil		((void*)0)
25 
26 typedef unsigned char	uchar;
27 typedef signed char	schar;
28 typedef unsigned short	Rune;
29 typedef long long int	vlong;
30 typedef unsigned long long int	uvlong;
31 typedef unsigned int u32int;
32 typedef uvlong u64int;
33 
34 typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
35 typedef unsigned short u16int;
36 typedef unsigned char u8int;
37 typedef unsigned long uintptr;
38 
39 #define	USED(x)		if(x){}else{}
40 #define	SET(x)
41 
42 #undef nelem
43 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
44 #undef offsetof
45 #define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
46 #undef assert
47 #define	assert(x)	if(x){}else _assert("x")
48 
49 /*
50  * most mem and string routines are declared by ANSI/POSIX files above
51  */
52 
53 extern	char*	strecpy(char*, char*, char*);
54 extern	char*	strdup(const char*);
55 extern	int	cistrncmp(char*, char*, int);
56 extern	int	cistrcmp(char*, char*);
57 extern	char*	cistrstr(char*, char*);
58 extern	int	tokenize(char*, char**, int);
59 
60 enum
61 {
62 	UTFmax		= 3,		/* maximum bytes per rune */
63 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
64 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
65 	Runeerror	= 0x80		/* decoding error in UTF */
66 };
67 
68 /*
69  * rune routines
70  */
71 extern	int	runetochar(char*, Rune*);
72 extern	int	chartorune(Rune*, char*);
73 extern	int	runelen(long);
74 extern	int	runenlen(Rune*, int);
75 extern	int	fullrune(char*, int);
76 extern	int	utflen(char*);
77 extern	int	utfnlen(char*, long);
78 extern	char*	utfrune(char*, long);
79 extern	char*	utfrrune(char*, long);
80 extern	char*	utfutf(char*, char*);
81 extern	char*	utfecpy(char*, char*, char*);
82 
83 extern	Rune*	runestrcat(Rune*, Rune*);
84 extern	Rune*	runestrchr(Rune*, Rune);
85 extern	int	runestrcmp(Rune*, Rune*);
86 extern	Rune*	runestrcpy(Rune*, Rune*);
87 extern	Rune*	runestrncpy(Rune*, Rune*, long);
88 extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
89 extern	Rune*	runestrdup(Rune*);
90 extern	Rune*	runestrncat(Rune*, Rune*, long);
91 extern	int	runestrncmp(Rune*, Rune*, long);
92 extern	Rune*	runestrrchr(Rune*, Rune);
93 extern	long	runestrlen(Rune*);
94 extern	Rune*	runestrstr(Rune*, Rune*);
95 
96 extern	Rune	tolowerrune(Rune);
97 extern	Rune	totitlerune(Rune);
98 extern	Rune	toupperrune(Rune);
99 extern	int	isalpharune(Rune);
100 extern	int	islowerrune(Rune);
101 extern	int	isspacerune(Rune);
102 extern	int	istitlerune(Rune);
103 extern	int	isupperrune(Rune);
104 
105 /*
106  * malloc
107  */
108 extern	void*	malloc(size_t);
109 extern	void*	mallocz(ulong, int);
110 extern	void	free(void*);
111 extern	ulong	msize(void*);
112 extern	void*	calloc(size_t, size_t);
113 extern	void*	realloc(void*, size_t);
114 extern	void		setmalloctag(void*, ulong);
115 extern	void		setrealloctag(void*, ulong);
116 extern	ulong	getmalloctag(void*);
117 extern	ulong	getrealloctag(void*);
118 extern	void*	malloctopoolblock(void*);
119 
120 /*
121  * print routines
122  */
123 typedef struct Fmt	Fmt;
124 struct Fmt{
125 	uchar	runes;			/* output buffer is runes or chars? */
126 	void	*start;			/* of buffer */
127 	void	*to;			/* current place in the buffer */
128 	void	*stop;			/* end of the buffer; overwritten if flush fails */
129 	int	(*flush)(Fmt *);	/* called when to == stop */
130 	void	*farg;			/* to make flush a closure */
131 	int	nfmt;			/* num chars formatted so far */
132 	va_list	args;			/* args passed to dofmt */
133 	int	r;			/* % format Rune */
134 	int	width;
135 	int	prec;
136 	ulong	flags;
137 };
138 extern	vlong	osnsec(void);
139 #define	nsec	osnsec
140 
141 enum{
142 	FmtWidth	= 1,
143 	FmtLeft		= FmtWidth << 1,
144 	FmtPrec		= FmtLeft << 1,
145 	FmtSharp	= FmtPrec << 1,
146 	FmtSpace	= FmtSharp << 1,
147 	FmtSign		= FmtSpace << 1,
148 	FmtZero		= FmtSign << 1,
149 	FmtUnsigned	= FmtZero << 1,
150 	FmtShort	= FmtUnsigned << 1,
151 	FmtLong		= FmtShort << 1,
152 	FmtVLong	= FmtLong << 1,
153 	FmtComma	= FmtVLong << 1,
154 	FmtByte	= FmtComma << 1,
155 
156 	FmtFlag		= FmtByte << 1
157 };
158 
159 extern	int	print(char*, ...);
160 extern	char*	seprint(char*, char*, char*, ...);
161 extern	char*	vseprint(char*, char*, char*, va_list);
162 extern	int	snprint(char*, int, char*, ...);
163 extern	int	vsnprint(char*, int, char*, va_list);
164 extern	char*	smprint(char*, ...);
165 extern	char*	vsmprint(char*, va_list);
166 extern	int	sprint(char*, char*, ...);
167 extern	int	fprint(int, char*, ...);
168 extern	int	vfprint(int, char*, va_list);
169 
170 extern	int	runesprint(Rune*, char*, ...);
171 extern	int	runesnprint(Rune*, int, char*, ...);
172 extern	int	runevsnprint(Rune*, int, char*, va_list);
173 extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
174 extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
175 extern	Rune*	runesmprint(char*, ...);
176 extern	Rune*	runevsmprint(char*, va_list);
177 
178 extern	int	fmtfdinit(Fmt*, int, char*, int);
179 extern	int	fmtfdflush(Fmt*);
180 extern	int	fmtstrinit(Fmt*);
181 extern	char*	fmtstrflush(Fmt*);
182 extern	int	runefmtstrinit(Fmt*);
183 extern	Rune*	runefmtstrflush(Fmt*);
184 
185 extern	int	fmtinstall(int, int (*)(Fmt*));
186 extern	int	dofmt(Fmt*, char*);
187 extern	int	dorfmt(Fmt*, Rune*);
188 extern	int	fmtprint(Fmt*, char*, ...);
189 extern	int	fmtvprint(Fmt*, char*, va_list);
190 extern	int	fmtrune(Fmt*, int);
191 extern	int	fmtstrcpy(Fmt*, char*);
192 extern	int	fmtrunestrcpy(Fmt*, Rune*);
193 /*
194  * error string for %r
195  * supplied on per os basis, not part of fmt library
196  */
197 extern	int	errfmt(Fmt *f);
198 
199 /*
200  * quoted strings
201  */
202 extern	char	*unquotestrdup(char*);
203 extern	Rune	*unquoterunestrdup(Rune*);
204 extern	char	*quotestrdup(char*);
205 extern	Rune	*quoterunestrdup(Rune*);
206 extern	int	quotestrfmt(Fmt*);
207 extern	int	quoterunestrfmt(Fmt*);
208 extern	void	quotefmtinstall(void);
209 extern	int	(*doquote)(int);
210 
211 /*
212  * random number
213  */
214 extern	ulong	truerand(void);
215 extern	ulong	ntruerand(ulong);
216 
217 /*
218  * math
219  */
220 extern	int	isNaN(double);
221 extern	int	isInf(double, int);
222 
223 /*
224  * Time-of-day
225  */
226 
227 typedef struct Tm Tm;
228 struct Tm {
229 	int	sec;
230 	int	min;
231 	int	hour;
232 	int	mday;
233 	int	mon;
234 	int	year;
235 	int	wday;
236 	int	yday;
237 	char	zone[4];
238 	int	tzoff;
239 };
240 
241 /*
242  * one-of-a-kind
243  */
244 extern	void	_assert(char*);
245 extern	double	charstod(int(*)(void*), void*);
246 extern	char*	cleanname(char*);
247 extern	ulong	getcallerpc(void*);
248 extern	int	getfields(char*, char**, int, int, char*);
249 extern	char*	getuser(void);
250 extern	char*	getwd(char*, int);
251 extern	double	ipow10(int);
252 #define	pow10	infpow10
253 extern	double	pow10(int);
254 extern	vlong	strtoll(const char*, char**, int);
255 extern	uvlong	strtoull(const char*, char**, int);
256 extern	void	sysfatal(char*, ...);
257 extern	int	dec64(uchar*, int, char*, int);
258 extern	int	enc64(char*, int, uchar*, int);
259 extern	int	dec32(uchar*, int, char*, int);
260 extern	int	enc32(char*, int, uchar*, int);
261 extern	int	dec16(uchar*, int, char*, int);
262 extern	int	enc16(char*, int, uchar*, int);
263 extern	int	encodefmt(Fmt*);
264 
265 /*
266  *  synchronization
267  */
268 typedef
269 struct Lock {
270 	int	val;
271 	int	pid;
272 } Lock;
273 
274 extern int	_tas(int*);
275 
276 extern	void	lock(Lock*);
277 extern	void	unlock(Lock*);
278 extern	int	canlock(Lock*);
279 
280 typedef struct QLock QLock;
281 struct QLock
282 {
283 	Lock	use;			/* to access Qlock structure */
284 	Proc	*head;			/* next process waiting for object */
285 	Proc	*tail;			/* last process waiting for object */
286 	int	locked;			/* flag */
287 };
288 
289 extern	void	qlock(QLock*);
290 extern	void	qunlock(QLock*);
291 extern	int	canqlock(QLock*);
292 extern	void	_qlockinit(ulong (*)(ulong, ulong));	/* called only by the thread library */
293 
294 typedef
295 struct RWLock
296 {
297 	Lock	l;			/* Lock modify lock */
298 	QLock	x;			/* Mutual exclusion lock */
299 	QLock	k;			/* Lock for waiting writers */
300 	int	readers;		/* Count of readers in lock */
301 } RWLock;
302 
303 extern	int	canrlock(RWLock*);
304 extern	int	canwlock(RWLock*);
305 extern	void	rlock(RWLock*);
306 extern	void	runlock(RWLock*);
307 extern	void	wlock(RWLock*);
308 extern	void	wunlock(RWLock*);
309 
310 /*
311  * network dialing
312  */
313 #define NETPATHLEN 40
314 
315 /*
316  * system calls
317  *
318  */
319 #define	STATMAX	65535U	/* max length of machine-independent stat structure */
320 #define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
321 #define	ERRMAX	128	/* max length of error string */
322 
323 #define	MORDER	0x0003	/* mask for bits defining order of mounting */
324 #define	MREPL	0x0000	/* mount replaces object */
325 #define	MBEFORE	0x0001	/* mount goes before others in union directory */
326 #define	MAFTER	0x0002	/* mount goes after others in union directory */
327 #define	MCREATE	0x0004	/* permit creation in mounted directory */
328 #define	MCACHE	0x0010	/* cache some data */
329 #define	MMASK	0x0017	/* all bits on */
330 
331 #define	OREAD	0	/* open for read */
332 #define	OWRITE	1	/* write */
333 #define	ORDWR	2	/* read and write */
334 #define	OEXEC	3	/* execute, == read but check execute permission */
335 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
336 #define	OCEXEC	32	/* or'ed in, close on exec */
337 #define	ORCLOSE	64	/* or'ed in, remove on close */
338 #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
339 
340 #define	AEXIST	0	/* accessible: exists */
341 #define	AEXEC	1	/* execute access */
342 #define	AWRITE	2	/* write access */
343 #define	AREAD	4	/* read access */
344 
345 /* bits in Qid.type */
346 #define QTDIR		0x80		/* type bit for directories */
347 #define QTAPPEND	0x40		/* type bit for append only files */
348 #define QTEXCL		0x20		/* type bit for exclusive use files */
349 #define QTMOUNT		0x10		/* type bit for mounted channel */
350 #define QTAUTH		0x08		/* type bit for authentication file */
351 #define QTFILE		0x00		/* plain file */
352 
353 /* bits in Dir.mode */
354 #define DMDIR		0x80000000	/* mode bit for directories */
355 #define DMAPPEND	0x40000000	/* mode bit for append only files */
356 #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
357 #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
358 #define DMAUTH		0x08000000	/* mode bit for authentication file */
359 #define DMREAD		0x4		/* mode bit for read permission */
360 #define DMWRITE		0x2		/* mode bit for write permission */
361 #define DMEXEC		0x1		/* mode bit for execute permission */
362 
363 typedef
364 struct Qid
365 {
366 	uvlong	path;
367 	ulong	vers;
368 	uchar	type;
369 } Qid;
370 
371 typedef
372 struct Dir {
373 	/* system-modified data */
374 	ushort	type;	/* server type */
375 	uint	dev;	/* server subtype */
376 	/* file data */
377 	Qid	qid;	/* unique id from server */
378 	ulong	mode;	/* permissions */
379 	ulong	atime;	/* last read time */
380 	ulong	mtime;	/* last write time */
381 	vlong	length;	/* file length */
382 	char	*name;	/* last element of path */
383 	char	*uid;	/* owner name */
384 	char	*gid;	/* group name */
385 	char	*muid;	/* last modifier name */
386 } Dir;
387 
388 extern	Dir*	dirstat(char*);
389 extern	Dir*	dirfstat(int);
390 extern	int	dirwstat(char*, Dir*);
391 extern	int	dirfwstat(int, Dir*);
392 extern	long	dirread(int, Dir**);
393 extern	void	nulldir(Dir*);
394 extern	long	dirreadall(int, Dir**);
395 
396 typedef
397 struct Waitmsg
398 {
399 	int pid;	/* of loved one */
400 	ulong time[3];	/* of loved one & descendants */
401 	char	*msg;
402 } Waitmsg;
403 
404 extern	void	_exits(char*);
405 
406 extern	void	exits(char*);
407 extern	int	create(char*, int, int);
408 extern	int	errstr(char*, uint);
409 
410 extern	void	perror(const char*);
411 extern	long	readn(int, void*, long);
412 extern	int	remove(const char*);
413 extern	void	rerrstr(char*, uint);
414 extern	vlong	seek(int, vlong, int);
415 extern	void	werrstr(char*, ...);
416 
417 extern char *argv0;
418 #define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
419 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
420 			    argc--, argv++) {\
421 				char *_args, *_argt;\
422 				Rune _argc;\
423 				_args = &argv[0][1];\
424 				if(_args[0]=='-' && _args[1]==0){\
425 					argc--; argv++; break;\
426 				}\
427 				_argc = 0;\
428 				while(*_args && (_args += chartorune(&_argc, _args)))\
429 				switch(_argc)
430 #define	ARGEND		SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc);
431 #define	ARGF()		(_argt=_args, _args="",\
432 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
433 #define	EARGF(x)	(_argt=_args, _args="",\
434 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
435 
436 #define	ARGC()		_argc
437 
438 /*
439  *	Extensions for Inferno to basic libc.h
440  */
441 
442 #define	setbinmode()
443 
444 /*
445  *	Extensions for emu kernel emulation
446  */
447 #ifdef	EMU
448 
449 extern	Proc**	Xup;
450 #define	up	(*Xup)
451 
452 typedef	struct	FPU	FPU;
453 
454 /*
455  * This structure must agree with FPsave and FPrestore asm routines
456  */
457 struct FPU
458 {
459 	ulong	fcr31;
460 };
461 
462 typedef sigjmp_buf osjmpbuf;
463 #define	ossetjmp(buf)	sigsetjmp(buf, 1)
464 
465 #endif
466