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