xref: /plan9/sys/src/cmd/unix/drawterm/include/lib.h (revision 58da3067adcdccaaa043d0bfde28ba83b7ced07d)
1 /* avoid name conflicts */
2 #define accept	pm_accept
3 #define listen  pm_listen
4 #define sleep	ksleep
5 #define wakeup	kwakeup
6 #ifdef strtod
7 #undef strtod
8 #endif
9 #define strtod		fmtstrtod
10 
11 /* conflicts on some os's */
12 #define encrypt	libencrypt
13 #define decrypt libdecrypt
14 #define oserror	liboserror
15 #define clone	libclone
16 #define atexit	libatexit
17 #define log2	liblog2
18 #define log	liblog
19 #define reboot	libreboot
20 #define strtoll libstrtoll
21 #undef timeradd
22 #define timeradd	xtimeradd
23 
24 
25 #define	nil	((void*)0)
26 
27 typedef unsigned char	p9_uchar;
28 typedef unsigned int	p9_uint;
29 typedef unsigned int	p9_ulong;
30 typedef int		p9_long;
31 typedef signed char	p9_schar;
32 typedef unsigned short	p9_ushort;
33 typedef unsigned int	Rune;
34 typedef unsigned int	p9_u32int;
35 typedef p9_u32int mpdigit;
36 
37 /* make sure we don't conflict with predefined types */
38 #define schar	p9_schar
39 #define uchar	p9_uchar
40 #define ushort	p9_ushort
41 #define uint	p9_uint
42 #define u32int	p9_u32int
43 
44 /* #define long int rather than p9_long so that "unsigned long" is valid */
45 #define long	int
46 #define ulong	p9_ulong
47 #define vlong	p9_vlong
48 #define uvlong	p9_uvlong
49 
50 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
51 #define SET(x)		((x)=0)
52 #define	USED(x)		if(x);else
53 
54 enum
55 {
56 	UTFmax		= 4,		/* maximum bytes per rune */
57 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
58 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
59 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
60 	Runemax		= 0x10FFFF,	/* 21-bit rune */
61 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
62 };
63 
64 /*
65  * new rune routines
66  */
67 extern	int	runetochar(char*, Rune*);
68 extern	int	chartorune(Rune*, char*);
69 extern	int	runelen(long);
70 extern	int	fullrune(char*, int);
71 
72 extern  int	wstrtoutf(char*, Rune*, int);
73 extern  int	wstrutflen(Rune*);
74 
75 /*
76  * rune routines from converted str routines
77  */
78 extern	long	utflen(char*);
79 extern	char*	utfrune(char*, long);
80 extern	char*	utfrrune(char*, long);
81 
82 /*
83  * Syscall data structures
84  */
85 #define	MORDER	0x0003	/* mask for bits defining order of mounting */
86 #define	MREPL	0x0000	/* mount replaces object */
87 #define	MBEFORE	0x0001	/* mount goes before others in union directory */
88 #define	MAFTER	0x0002	/* mount goes after others in union directory */
89 #define	MCREATE	0x0004	/* permit creation in mounted directory */
90 #define	MCACHE	0x0010	/* cache some data */
91 #define	MMASK	0x0017	/* all bits on */
92 
93 #define	OREAD	0	/* open for read */
94 #define	OWRITE	1	/* write */
95 #define	ORDWR	2	/* read and write */
96 #define	OEXEC	3	/* execute, == read but check execute permission */
97 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
98 #define	OCEXEC	32	/* or'ed in, close on exec */
99 #define	ORCLOSE	64	/* or'ed in, remove on close */
100 #define	OEXCL   0x1000	/* or'ed in, exclusive create */
101 
102 #define	NCONT	0	/* continue after note */
103 #define	NDFLT	1	/* terminate after note */
104 #define	NSAVE	2	/* clear note but hold state */
105 #define	NRSTR	3	/* restore saved state */
106 
107 #define	ERRMAX			128	/* max length of error string */
108 #define	KNAMELEN		28	/* max length of name held in kernel */
109 
110 /* bits in Qid.type */
111 #define QTDIR		0x80		/* type bit for directories */
112 #define QTAPPEND	0x40		/* type bit for append only files */
113 #define QTEXCL		0x20		/* type bit for exclusive use files */
114 #define QTMOUNT		0x10		/* type bit for mounted channel */
115 #define QTAUTH		0x08		/* type bit for authentication file */
116 #define QTFILE		0x00		/* plain file */
117 
118 /* bits in Dir.mode */
119 #define DMDIR		0x80000000	/* mode bit for directories */
120 #define DMAPPEND		0x40000000	/* mode bit for append only files */
121 #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
122 #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
123 #define DMAUTH		0x08000000	/* mode bit for authentication files */
124 #define DMREAD		0x4		/* mode bit for read permission */
125 #define DMWRITE		0x2		/* mode bit for write permission */
126 #define DMEXEC		0x1		/* mode bit for execute permission */
127 
128 typedef struct Lock
129 {
130 #ifdef PTHREAD
131 	int init;
132 	pthread_mutex_t mutex;
133 #else
134 	long	key;
135 #endif
136 } Lock;
137 
138 typedef struct QLock
139 {
140 	Lock	lk;
141 	struct Proc	*hold;
142 	struct Proc	*first;
143 	struct Proc	*last;
144 } QLock;
145 
146 typedef
147 struct Qid
148 {
149 	uvlong	path;
150 	ulong	vers;
151 	uchar	type;
152 } Qid;
153 
154 typedef
155 struct Dir {
156 	/* system-modified data */
157 	ushort	type;	/* server type */
158 	uint	dev;	/* server subtype */
159 	/* file data */
160 	Qid	qid;	/* unique id from server */
161 	ulong	mode;	/* permissions */
162 	ulong	atime;	/* last read time */
163 	ulong	mtime;	/* last write time */
164 	vlong	length;	/* file length */
165 	char	*name;	/* last element of path */
166 	char	*uid;	/* owner name */
167 	char	*gid;	/* group name */
168 	char	*muid;	/* last modifier name */
169 } Dir;
170 
171 typedef
172 struct Waitmsg
173 {
174 	int pid;	/* of loved one */
175 	ulong time[3];	/* of loved one & descendants */
176 	char	*msg;
177 } Waitmsg;
178 
179 /*
180  * print routines
181  */
182 typedef struct Fmt	Fmt;
183 struct Fmt{
184 	uchar	runes;			/* output buffer is runes or chars? */
185 	void	*start;			/* of buffer */
186 	void	*to;			/* current place in the buffer */
187 	void	*stop;			/* end of the buffer; overwritten if flush fails */
188 	int	(*flush)(Fmt *);	/* called when to == stop */
189 	void	*farg;			/* to make flush a closure */
190 	int	nfmt;			/* num chars formatted so far */
191 	va_list	args;			/* args passed to dofmt */
192 	int	r;			/* % format Rune */
193 	int	width;
194 	int	prec;
195 	ulong	flags;
196 };
197 
198 enum{
199 	FmtWidth	= 1,
200 	FmtLeft		= FmtWidth << 1,
201 	FmtPrec		= FmtLeft << 1,
202 	FmtSharp	= FmtPrec << 1,
203 	FmtSpace	= FmtSharp << 1,
204 	FmtSign		= FmtSpace << 1,
205 	FmtZero		= FmtSign << 1,
206 	FmtUnsigned	= FmtZero << 1,
207 	FmtShort	= FmtUnsigned << 1,
208 	FmtLong		= FmtShort << 1,
209 	FmtVLong	= FmtLong << 1,
210 	FmtComma	= FmtVLong << 1,
211 	FmtByte	= FmtComma << 1,
212 
213 	FmtFlag		= FmtByte << 1,
214 	FmtLDouble	= FmtFlag << 1
215 };
216 
217 extern	int	print(char*, ...);
218 extern	char*	seprint(char*, char*, char*, ...);
219 extern	char*	vseprint(char*, char*, char*, va_list);
220 extern	int	snprint(char*, int, char*, ...);
221 extern	int	vsnprint(char*, int, char*, va_list);
222 extern	char*	smprint(char*, ...);
223 extern	char*	vsmprint(char*, va_list);
224 extern	int	sprint(char*, char*, ...);
225 extern	int	fprint(int, char*, ...);
226 extern	int	vfprint(int, char*, va_list);
227 
228 extern	int	(*doquote)(int);
229 extern	int	runesprint(Rune*, char*, ...);
230 extern	int	runesnprint(Rune*, int, char*, ...);
231 extern	int	runevsnprint(Rune*, int, char*, va_list);
232 extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
233 extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
234 extern	Rune*	runesmprint(char*, ...);
235 extern	Rune*	runevsmprint(char*, va_list);
236 
237 extern       Rune*	runestrchr(Rune*, Rune);
238 extern       long	runestrlen(Rune*);
239 extern       Rune*	runestrstr(Rune*, Rune*);
240 
241 extern	int	fmtfdinit(Fmt*, int, char*, int);
242 extern	int	fmtfdflush(Fmt*);
243 extern	int	fmtstrinit(Fmt*);
244 extern	int	fmtinstall(int, int (*)(Fmt*));
245 extern	char*	fmtstrflush(Fmt*);
246 extern	int	runefmtstrinit(Fmt*);
247 extern	Rune*	runefmtstrflush(Fmt*);
248 extern	int	encodefmt(Fmt*);
249 extern	int	fmtstrcpy(Fmt*, char*);
250 extern	int	fmtprint(Fmt*, char*, ...);
251 extern	int	fmtvprint(Fmt*, char*, va_list);
252 extern	void*	mallocz(ulong, int);
253 
254 extern	uintptr	getcallerpc(void*);
255 extern	char*	cleanname(char*);
256 extern	void	sysfatal(char*, ...);
257 extern	char*	strecpy(char*, char*, char*);
258 
259 extern	int	tokenize(char*, char**, int);
260 extern	int	getfields(char*, char**, int, int, char*);
261 extern	char*	utfecpy(char*, char*, char*);
262 extern	long	tas(long*);
263 extern	void	quotefmtinstall(void);
264 extern	int	dec64(uchar*, int, char*, int);
265 extern	int	enc64(char*, int, uchar*, int);
266 extern	int	dec32(uchar*, int, char*, int);
267 extern	int	enc32(char*, int, uchar*, int);
268 extern	int	enc16(char*, int, uchar*, int);
269 void		hnputs(void *p, unsigned short v);
270 extern	int	dofmt(Fmt*, char*);
271 extern	double	__NaN(void);
272 extern	int	__isNaN(double);
273 extern	double	strtod(const char*, char**);
274 extern	int	utfnlen(char*, long);
275 extern	double	__Inf(int);
276 extern	int	__isInf(double, int);
277 
278 extern int (*fmtdoquote)(int);
279 
280