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