xref: /inferno-os/os/port/lib.h (revision d3641b487cf5cdc46e9b537d30eb37736e5c7b1a)
1  
2  /*
3   * functions (possibly) linked in, complete, from libc.
4   */
5  #define nelem(x)	(sizeof(x)/sizeof((x)[0]))
6  #define offsetof(s, m)	(ulong)(&(((s*)0)->m))
7  #define assert(x)	if(x){}else _assert("x")
8  
9  /*
10   * mem routines
11   */
12  extern	void*	memccpy(void*, void*, int, ulong);
13  extern	void*	memset(void*, int, ulong);
14  extern	int	memcmp(void*, void*, ulong);
15  extern	void*	memmove(void*, void*, ulong);
16  extern	void*	memchr(void*, int, ulong);
17  
18  /*
19   * string routines
20   */
21  extern	char*	strcat(char*, char*);
22  extern	char*	strchr(char*, int);
23  extern	char*	strrchr(char*, int);
24  extern	int	strcmp(char*, char*);
25  extern	char*	strcpy(char*, char*);
26  extern	char*	strecpy(char*, char*, char*);
27  extern	char*	strncat(char*, char*, long);
28  extern	char*	strncpy(char*, char*, long);
29  extern	int	strncmp(char*, char*, long);
30  extern	long	strlen(char*);
31  extern	char*	strdup(char*);
32  extern	char*	strstr(char*, char*);
33  extern	int	cistrncmp(char*, char*, int);
34  extern	int	cistrcmp(char*, char*);
35  extern	char*	cistrstr(char*, char*);
36  extern	int	atoi(char*);
37  extern	int	fullrune(char*, int);
38  
39  enum
40  {
41  	UTFmax		= 4,		/* maximum bytes per rune */
42  	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
43  	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
44  	Runeerror	= 0xFFFD,	/* decoding error in UTF */
45  	Runemax		= 0x10FFFF,	/* 21-bit rune */
46  	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
47  };
48  
49  /*
50   * rune routines
51   */
52  extern	int	runetochar(char*, Rune*);
53  extern	int	chartorune(Rune*, char*);
54  extern	char*	utfrune(char*, long);
55  extern	int	utflen(char*);
56  extern	int	runelen(long);
57  
58  extern	int	abs(int);
59  
60  /*
61   * print routines
62   */
63  typedef struct Fmt	Fmt;
64  typedef int (*Fmts)(Fmt*);
65  struct Fmt{
66  	uchar	runes;			/* output buffer is runes or chars? */
67  	void	*start;			/* of buffer */
68  	void	*to;			/* current place in the buffer */
69  	void	*stop;			/* end of the buffer; overwritten if flush fails */
70  	int	(*flush)(Fmt *);	/* called when to == stop */
71  	void	*farg;			/* to make flush a closure */
72  	int	nfmt;			/* num chars formatted so far */
73  	va_list	args;			/* args passed to dofmt */
74  	int	r;			/* % format Rune */
75  	int	width;
76  	int	prec;
77  	ulong	flags;
78  };
79  extern	int	print(char*, ...);
80  extern	char*	seprint(char*, char*, char*, ...);
81  extern	char*	vseprint(char*, char*, char*, va_list);
82  extern	char*	smprint(char*, ...);
83  extern	char*	vsmprint(char*, va_list);
84  extern	int	snprint(char*, int, char*, ...);
85  extern	int	vsnprint(char*, int, char*, va_list);
86  extern	int	sprint(char*, char*, ...);
87  
88  extern	int	fmtinstall(int, int (*)(Fmt*));
89  extern	void	quotefmtinstall(void);
90  extern	int	fmtprint(Fmt*, char*, ...);
91  extern	int	fmtstrcpy(Fmt*, char*);
92  
93  #pragma	varargck	argpos	fmtprint	2
94  #pragma	varargck	argpos	print		1
95  #pragma	varargck	argpos	seprint		3
96  #pragma	varargck	argpos	snprint		3
97  #pragma	varargck	argpos	sprint		2
98  #pragma	varargck	argpos	vseprint	3
99  #pragma	varargck	argpos	vsnprint	3
100  
101  extern	int	fltconv(Fmt*);
102  
103  /*
104   * math
105   */
106  extern int	isNaN(double);
107  extern int	isInf(double, int);
108  extern double	floor(double);
109  extern double	frexp(double, int*);
110  extern double	pow10(int);
111  
112  /*
113   * one-of-a-kind
114   */
115  extern	char*	cleanname(char*);
116  extern	ulong	getcallerpc(void*);
117  
118  extern	long	strtol(char*, char**, int);
119  extern	ulong	strtoul(char*, char**, int);
120  extern	vlong	strtoll(char*, char**, int);
121  extern	uvlong	strtoull(char*, char**, int);
122  extern	char	etext[];
123  extern	char	edata[];
124  extern	char	end[];
125  extern	int	getfields(char*, char**, int, int, char*);
126  extern	int	tokenize(char*, char**, int);
127  extern	int	dec64(uchar*, int, char*, int);
128  extern	void	qsort(void*, long, long, int (*)(void*, void*));
129  
130  extern	int	toupper(int);
131  extern	char*	netmkaddr(char*, char*, char*);
132  extern	int	myetheraddr(uchar*, char*);
133  extern	int	parseether(uchar*, char*);
134  
135  /*
136   * network dialling
137   */
138  #define	NETPATHLEN	40
139  
140  /*
141   * Syscall data structures
142   */
143  #define	MORDER	0x0003	/* mask for bits defining order of mounting */
144  #define	MREPL	0x0000	/* mount replaces object */
145  #define	MBEFORE	0x0001	/* mount goes before others in union directory */
146  #define	MAFTER	0x0002	/* mount goes after others in union directory */
147  #define	MCREATE	0x0004	/* permit creation in mounted directory */
148  #define	MCACHE	0x0010	/* cache some data */
149  #define	MMASK	0x0017	/* all bits on */
150  
151  #define	OREAD	0	/* open for read */
152  #define	OWRITE	1	/* write */
153  #define	ORDWR	2	/* read and write */
154  #define	OEXEC	3	/* execute, == read but check execute permission */
155  #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
156  #define	OCEXEC	32	/* or'ed in, close on exec */
157  #define	ORCLOSE	64	/* or'ed in, remove on close */
158  #define OEXCL   0x1000	/* or'ed in, exclusive create */
159  
160  #define	NCONT	0	/* continue after note */
161  #define	NDFLT	1	/* terminate after note */
162  #define	NSAVE	2	/* clear note but hold state */
163  #define	NRSTR	3	/* restore saved state */
164  
165  typedef struct Qid	Qid;
166  typedef struct Dir	Dir;
167  typedef struct Waitmsg	Waitmsg;
168  
169  #define	STATMAX	65535U	/* max length of machine-independent stat structure */
170  #define	ERRMAX			128	/* max length of error string */
171  #define	KNAMELEN		28	/* max length of name held in kernel */
172  
173  /* bits in Qid.type */
174  #define QTDIR		0x80		/* type bit for directories */
175  #define QTAPPEND	0x40		/* type bit for append only files */
176  #define QTEXCL		0x20		/* type bit for exclusive use files */
177  #define QTMOUNT		0x10		/* type bit for mounted channel */
178  #define QTAUTH		0x08		/* type bit for authentication file */
179  #define QTFILE		0x00		/* plain file */
180  
181  /* bits in Dir.mode */
182  #define DMDIR		0x80000000	/* mode bit for directories */
183  #define DMAPPEND	0x40000000	/* mode bit for append only files */
184  #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
185  #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
186  #define DMREAD		0x4		/* mode bit for read permission */
187  #define DMWRITE		0x2		/* mode bit for write permission */
188  #define DMEXEC		0x1		/* mode bit for execute permission */
189  
190  struct Qid
191  {
192  	uvlong	path;
193  	ulong	vers;
194  	uchar	type;
195  };
196  
197  struct Dir {
198  	/* system-modified data */
199  	ushort	type;	/* server type */
200  	uint	dev;	/* server subtype */
201  	/* file data */
202  	Qid	qid;	/* unique id from server */
203  	ulong	mode;	/* permissions */
204  	ulong	atime;	/* last read time */
205  	ulong	mtime;	/* last write time */
206  	vlong	length;	/* file length: see <u.h> */
207  	char	*name;	/* last element of path */
208  	char	*uid;	/* owner name */
209  	char	*gid;	/* group name */
210  	char	*muid;	/* last modifier name */
211  };
212  
213  struct Waitmsg
214  {
215  	int	pid;	/* of loved one */
216  	ulong	time[3];	/* of loved one and descendants */
217  	char	msg[ERRMAX];	/* actually variable-size in user mode */
218  };
219