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