xref: /inferno-os/Solaris/386/include/lib9.h (revision 2b69dba5038ffd0b59cf30a4c44bce549e5097f8)
1 #define _POSIX_SOURCE
2 #define	_POSIX_C_SOURCE	1
3 #define _LARGEFILE64_SOURCE	1
4 #define _FILE_OFFSET_BITS 64
5 #include <stdlib.h>
6 #include <stdarg.h>
7 #include <errno.h>
8 #include <string.h>
9 #include "math.h"
10 #include <fcntl.h>
11 #include <setjmp.h>
12 #include <float.h>
13 
14 #define	getwd	infgetwd
15 
16 /*
17  * math/dtoa.c
18  */
19 #define __LITTLE_ENDIAN
20 
21 #define	nil		((void*)0)
22 
23 typedef unsigned char	uchar;
24 typedef unsigned int	uint;
25 typedef unsigned long	ulong;
26 typedef signed char	schar;
27 typedef unsigned short	ushort;
28 typedef unsigned short	Rune;
29 typedef long long int	vlong;
30 typedef unsigned long long int	uvlong;
31 typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
32 typedef unsigned short u16int;
33 typedef unsigned char u8int;
34 typedef unsigned long uintptr;
35 
36 #define	USED(x)		if(x);else
37 #define	SET(x)
38 
39 #define nelem(x)	(sizeof(x)/sizeof((x)[0]))
40 
41 /*
42  * mem and string routines are declared by ANSI/POSIX files above
43  */
44 
45 enum
46 {
47 	UTFmax		= 3,		/* maximum bytes per rune */
48 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
49 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
50 	Runeerror	= 0x80		/* decoding error in UTF */
51 };
52 
53 /*
54  * rune routines
55  */
56 extern	int	runetochar(char*, Rune*);
57 extern	int	chartorune(Rune*, char*);
58 extern	int	runelen(long);
59 extern	int	runenlen(Rune*, int);
60 extern	int	fullrune(char*, int);
61 extern	int	utflen(char*);
62 extern	int	utfnlen(char*, long);
63 extern	char*	utfrune(char*, long);
64 extern	char*	utfrrune(char*, long);
65 extern	char*	utfutf(char*, char*);
66 extern	char*	utfecpy(char*, char*, char*);
67 
68 extern	Rune*	runestrcat(Rune*, Rune*);
69 extern	Rune*	runestrchr(Rune*, Rune);
70 extern	int	runestrcmp(Rune*, Rune*);
71 extern	Rune*	runestrcpy(Rune*, Rune*);
72 extern	Rune*	runestrncpy(Rune*, Rune*, long);
73 extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
74 extern	Rune*	runestrdup(Rune*);
75 extern	Rune*	runestrncat(Rune*, Rune*, long);
76 extern	int	runestrncmp(Rune*, Rune*, long);
77 extern	Rune*	runestrrchr(Rune*, Rune);
78 extern	long	runestrlen(Rune*);
79 extern	Rune*	runestrstr(Rune*, Rune*);
80 
81 extern	Rune	tolowerrune(Rune);
82 extern	Rune	totitlerune(Rune);
83 extern	Rune	toupperrune(Rune);
84 extern	int	isalpharune(Rune);
85 extern	int	islowerrune(Rune);
86 extern	int	isspacerune(Rune);
87 extern	int	istitlerune(Rune);
88 extern	int	isupperrune(Rune);
89 
90 /*
91  * malloc
92  */
93 extern	void*	malloc(size_t);
94 extern	void*	mallocz(ulong, int);
95 extern	void	free(void*);
96 extern	ulong	msize(void*);
97 extern	void*	calloc(size_t, size_t);
98 extern	void*	realloc(void*, size_t);
99 extern	void		setmalloctag(void*, ulong);
100 extern	void		setrealloctag(void*, ulong);
101 extern	ulong	getmalloctag(void*);
102 extern	ulong	getrealloctag(void*);
103 extern	void*	malloctopoolblock(void*);
104 
105 extern	int	getfields(char*, char**, int, int, char*);
106 extern	ulong	getcallerpc(void*);
107 
108 /*
109  * print routines
110  */
111 typedef struct Fmt	Fmt;
112 struct Fmt{
113 	uchar	runes;			/* output buffer is runes or chars? */
114 	void	*start;			/* of buffer */
115 	void	*to;			/* current place in the buffer */
116 	void	*stop;			/* end of the buffer; overwritten if flush fails */
117 	int	(*flush)(Fmt *);	/* called when to == stop */
118 	void	*farg;			/* to make flush a closure */
119 	int	nfmt;			/* num chars formatted so far */
120 	va_list	args;			/* args passed to dofmt */
121 	int	r;			/* % format Rune */
122 	int	width;
123 	int	prec;
124 	ulong	flags;
125 };
126 
127 enum{
128 	FmtWidth	= 1,
129 	FmtLeft		= FmtWidth << 1,
130 	FmtPrec		= FmtLeft << 1,
131 	FmtSharp	= FmtPrec << 1,
132 	FmtSpace	= FmtSharp << 1,
133 	FmtSign		= FmtSpace << 1,
134 	FmtZero		= FmtSign << 1,
135 	FmtUnsigned	= FmtZero << 1,
136 	FmtShort	= FmtUnsigned << 1,
137 	FmtLong		= FmtShort << 1,
138 	FmtVLong	= FmtLong << 1,
139 	FmtComma	= FmtVLong << 1,
140 	FmtByte	= FmtComma << 1,
141 
142 	FmtFlag		= FmtByte << 1
143 };
144 
145 extern	int	print(char*, ...);
146 extern	char*	seprint(char*, char*, char*, ...);
147 extern	char*	vseprint(char*, char*, char*, va_list);
148 extern	int	snprint(char*, int, char*, ...);
149 extern	int	vsnprint(char*, int, char*, va_list);
150 extern	char*	smprint(char*, ...);
151 extern	char*	vsmprint(char*, va_list);
152 extern	int	sprint(char*, char*, ...);
153 extern	int	fprint(int, char*, ...);
154 extern	int	vfprint(int, char*, va_list);
155 
156 extern	int	runesprint(Rune*, char*, ...);
157 extern	int	runesnprint(Rune*, int, char*, ...);
158 extern	int	runevsnprint(Rune*, int, char*, va_list);
159 extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
160 extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
161 extern	Rune*	runesmprint(char*, ...);
162 extern	Rune*	runevsmprint(char*, va_list);
163 
164 extern	int	fmtfdinit(Fmt*, int, char*, int);
165 extern	int	fmtfdflush(Fmt*);
166 extern	int	fmtstrinit(Fmt*);
167 extern	char*	fmtstrflush(Fmt*);
168 extern	int	runefmtstrinit(Fmt*);
169 extern	Rune*	runefmtstrflush(Fmt*);
170 
171 extern	int	fmtinstall(int, int (*)(Fmt*));
172 extern	int	dofmt(Fmt*, char*);
173 extern	int	dorfmt(Fmt*, Rune*);
174 extern	int	fmtprint(Fmt*, char*, ...);
175 extern	int	fmtvprint(Fmt*, char*, va_list);
176 extern	int	fmtrune(Fmt*, int);
177 extern	int	fmtstrcpy(Fmt*, char*);
178 extern	int	fmtrunestrcpy(Fmt*, Rune*);
179 /*
180  * error string for %r
181  * supplied on per os basis, not part of fmt library
182  */
183 extern	int	errfmt(Fmt *f);
184 
185 /*
186  * quoted strings
187  */
188 extern	char	*unquotestrdup(char*);
189 extern	Rune	*unquoterunestrdup(Rune*);
190 extern	char	*quotestrdup(char*);
191 extern	Rune	*quoterunestrdup(Rune*);
192 extern	int	quotestrfmt(Fmt*);
193 extern	int	quoterunestrfmt(Fmt*);
194 extern	void	quotefmtinstall(void);
195 extern	int	(*doquote)(int);
196 
197 extern	char*	strdup(const char*);
198 extern	int	tokenize(char*, char**, int);
199 extern	vlong	strtoll(const char*, char**, int);
200 
201 extern	int	isNaN(double);
202 extern	int	isInf(double, int);
203 
204 /*
205  * Time-of-day
206  */
207 
208 typedef struct Tm Tm;
209 struct Tm {
210 	int	sec;
211 	int	min;
212 	int	hour;
213 	int	mday;
214 	int	mon;
215 	int	year;
216 	int	wday;
217 	int	yday;
218 	char	zone[4];
219 };
220 
221 /*
222  * one-of-a-kind
223  */
224 extern	int	getfields(char*, char**, int, int, char*);
225 extern	char*	getuser(void);
226 extern	char*	getwd(char*, int);
227 extern	double	pow10(int);
228 extern	double	ipow10(int);
229 extern	vlong	strtoll(const char*, char**, int);
230 extern	uvlong	strtoull(const char*, char**, int);
231 extern	void	sysfatal(char*, ...);
232 extern	int	dec64(uchar*, int, char*, int);
233 extern	int	enc64(char*, int, uchar*, int);
234 extern	int	dec32(uchar*, int, char*, int);
235 extern	int	enc32(char*, int, uchar*, int);
236 extern	int	dec16(uchar*, int, char*, int);
237 extern	int	enc16(char*, int, uchar*, int);
238 extern	int	encodefmt(Fmt*);
239 
240 /*
241  *  synchronization
242  */
243 typedef
244 struct Lock {
245 	int	val;
246 	int	pid;
247 } Lock;
248 
249 extern int	_tas(int*);
250 
251 extern	void	lock(Lock*);
252 extern	void	unlock(Lock*);
253 extern	int	canlock(Lock*);
254 
255 typedef struct QLock QLock;
256 struct QLock
257 {
258 	Lock	use;			/* to access Qlock structure */
259 	Proc	*head;			/* next process waiting for object */
260 	Proc	*tail;			/* last process waiting for object */
261 	int	locked;			/* flag */
262 };
263 
264 extern	void	qlock(QLock*);
265 extern	void	qunlock(QLock*);
266 extern	int	canqlock(QLock*);
267 extern	void	_qlockinit(ulong (*)(ulong, ulong));	/* called only by the thread library */
268 
269 typedef
270 struct RWLock
271 {
272 	Lock	l;			/* Lock modify lock */
273 	QLock	x;			/* Mutual exclusion lock */
274 	QLock	k;			/* Lock for waiting writers */
275 	int	readers;		/* Count of readers in lock */
276 } RWLock;
277 
278 extern	int	canrlock(RWLock*);
279 extern	int	canwlock(RWLock*);
280 extern	void	rlock(RWLock*);
281 extern	void	runlock(RWLock*);
282 extern	void	wlock(RWLock*);
283 extern	void	wunlock(RWLock*);
284 
285 /*
286  * system calls
287  *
288  */
289 enum
290 {
291 	NAMELEN	= 28,
292 	ERRLEN	= 64,
293 	ERRMAX = 128,
294 	DIRLEN	= 116
295 };
296 
297 #define CHDIR		0x80000000	/* mode bit for directories */
298 #define CHAPPEND	0x40000000	/* mode bit for append only files */
299 #define CHEXCL		0x20000000	/* mode bit for exclusive use files */
300 #define CHMOUNT		0x10000000	/* mode bit for mounted channel */
301 #define CHREAD		0x4		/* mode bit for read permission */
302 #define CHWRITE		0x2		/* mode bit for write permission */
303 #define CHEXEC		0x1		/* mode bit for execute permission */
304 
305 #define	MORDER		0x0003		/* mask for bits defining order of mounting */
306 #define	MREPL		0x0000		/* mount replaces object */
307 #define	MBEFORE		0x0001		/* mount goes before others in union directory */
308 #define	MAFTER		0x0002		/* mount goes after others in union directory */
309 #define	MCREATE		0x0004		/* permit creation in mounted directory */
310 #define	MCACHE	0x0010	/* cache some data */
311 #define	MMASK		0x0007		/* all bits on */
312 
313 #define	OREAD		0		/* open for read */
314 #define	OWRITE		1		/* write */
315 #define	ORDWR		2		/* read and write */
316 #define	OEXEC		3		/* execute, == read but check execute permission */
317 #define	OTRUNC		16		/* or'ed in (except for exec), truncate file first */
318 #define	OCEXEC		32		/* or'ed in, close on exec */
319 #define	ORCLOSE		64		/* or'ed in, remove on close */
320 #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
321 
322 typedef
323 struct Qid
324 {
325 	ulong	path;
326 	ulong	vers;
327 } Qid;
328 
329 typedef
330 struct Dir
331 {
332 	char	name[NAMELEN];
333 	char	uid[NAMELEN];
334 	char	gid[NAMELEN];
335 	Qid	qid;
336 	ulong	mode;
337 	int	atime;
338 	int	mtime;
339 	vlong	length;
340 	ushort	type;
341 	ushort	dev;
342 } Dir;
343 
344 extern	int	dirfstat(int, Dir*);
345 extern	int	dirstat(char*, Dir*);
346 extern	int	dirfwstat(int, Dir*);
347 extern	int	dirwstat(char*, Dir*);
348 
349 extern	char*	cleanname(char*);
350 extern	void	exits(char*);
351 extern	void	_exits(char*);
352 extern	int	create(char*, int, int);
353 
354 extern	char*	getuser(void);
355 extern	char*	getwd(char*, int);
356 
357 extern	int	errstr(char*, uint);
358 extern	void	werrstr(char*, ...);
359 
360 #define	ARGBEGIN	for(argv++,argc--;\
361 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
362 			    argc--, argv++) {\
363 				char *_args, *_argt;\
364 				char _argc;\
365 				_args = &argv[0][1];\
366 				if(_args[0]=='-' && _args[1]==0){\
367 					argc--; argv++; break;\
368 				}\
369 				_argc = 0;\
370 				while((_argc = *_args++)!='\0')\
371 				switch(_argc)
372 #define	ARGEND		}
373 #define	ARGF()		(_argt=_args, _args="",\
374 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
375 #define	ARGC()		_argc
376 
377 /*
378  *	Extensions for Inferno to basic libc.h
379  */
380 
381 #define	setbinmode()
382 
383