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