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