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