xref: /plan9/sys/src/cmd/unix/drawterm/include/lib.h (revision 58da3067adcdccaaa043d0bfde28ba83b7ced07d)
18ccd4a63SDavid du Colombier /* avoid name conflicts */
28ccd4a63SDavid du Colombier #define accept	pm_accept
38ccd4a63SDavid du Colombier #define listen  pm_listen
48ccd4a63SDavid du Colombier #define sleep	ksleep
58ccd4a63SDavid du Colombier #define wakeup	kwakeup
6*58da3067SDavid du Colombier #ifdef strtod
7*58da3067SDavid du Colombier #undef strtod
8*58da3067SDavid du Colombier #endif
90d601874SDavid du Colombier #define strtod		fmtstrtod
108ccd4a63SDavid du Colombier 
118ccd4a63SDavid du Colombier /* conflicts on some os's */
128ccd4a63SDavid du Colombier #define encrypt	libencrypt
138ccd4a63SDavid du Colombier #define decrypt libdecrypt
148ccd4a63SDavid du Colombier #define oserror	liboserror
158ccd4a63SDavid du Colombier #define clone	libclone
168ccd4a63SDavid du Colombier #define atexit	libatexit
178ccd4a63SDavid du Colombier #define log2	liblog2
188ccd4a63SDavid du Colombier #define log	liblog
198ccd4a63SDavid du Colombier #define reboot	libreboot
2096cbc34fSDavid du Colombier #define strtoll libstrtoll
218ccd4a63SDavid du Colombier #undef timeradd
228ccd4a63SDavid du Colombier #define timeradd	xtimeradd
238ccd4a63SDavid du Colombier 
248ccd4a63SDavid du Colombier 
258ccd4a63SDavid du Colombier #define	nil	((void*)0)
268ccd4a63SDavid du Colombier 
278ccd4a63SDavid du Colombier typedef unsigned char	p9_uchar;
288ccd4a63SDavid du Colombier typedef unsigned int	p9_uint;
298ccd4a63SDavid du Colombier typedef unsigned int	p9_ulong;
308ccd4a63SDavid du Colombier typedef int		p9_long;
318ccd4a63SDavid du Colombier typedef signed char	p9_schar;
328ccd4a63SDavid du Colombier typedef unsigned short	p9_ushort;
33a1216cc6SDavid du Colombier typedef unsigned int	Rune;
348ccd4a63SDavid du Colombier typedef unsigned int	p9_u32int;
358ccd4a63SDavid du Colombier typedef p9_u32int mpdigit;
368ccd4a63SDavid du Colombier 
378ccd4a63SDavid du Colombier /* make sure we don't conflict with predefined types */
388ccd4a63SDavid du Colombier #define schar	p9_schar
398ccd4a63SDavid du Colombier #define uchar	p9_uchar
408ccd4a63SDavid du Colombier #define ushort	p9_ushort
418ccd4a63SDavid du Colombier #define uint	p9_uint
428ccd4a63SDavid du Colombier #define u32int	p9_u32int
438ccd4a63SDavid du Colombier 
448ccd4a63SDavid du Colombier /* #define long int rather than p9_long so that "unsigned long" is valid */
458ccd4a63SDavid du Colombier #define long	int
468ccd4a63SDavid du Colombier #define ulong	p9_ulong
478ccd4a63SDavid du Colombier #define vlong	p9_vlong
488ccd4a63SDavid du Colombier #define uvlong	p9_uvlong
498ccd4a63SDavid du Colombier 
508ccd4a63SDavid du Colombier #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
518ccd4a63SDavid du Colombier #define SET(x)		((x)=0)
528ccd4a63SDavid du Colombier #define	USED(x)		if(x);else
538ccd4a63SDavid du Colombier 
548ccd4a63SDavid du Colombier enum
558ccd4a63SDavid du Colombier {
56a1216cc6SDavid du Colombier 	UTFmax		= 4,		/* maximum bytes per rune */
578ccd4a63SDavid du Colombier 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
588ccd4a63SDavid du Colombier 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
59a1216cc6SDavid du Colombier 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
60a1216cc6SDavid du Colombier 	Runemax		= 0x10FFFF,	/* 21-bit rune */
61a1216cc6SDavid du Colombier 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
628ccd4a63SDavid du Colombier };
638ccd4a63SDavid du Colombier 
648ccd4a63SDavid du Colombier /*
6596cbc34fSDavid du Colombier  * new rune routines
668ccd4a63SDavid du Colombier  */
678ccd4a63SDavid du Colombier extern	int	runetochar(char*, Rune*);
688ccd4a63SDavid du Colombier extern	int	chartorune(Rune*, char*);
698ccd4a63SDavid du Colombier extern	int	runelen(long);
708ccd4a63SDavid du Colombier extern	int	fullrune(char*, int);
7196cbc34fSDavid du Colombier 
7296cbc34fSDavid du Colombier extern  int	wstrtoutf(char*, Rune*, int);
7396cbc34fSDavid du Colombier extern  int	wstrutflen(Rune*);
7496cbc34fSDavid du Colombier 
7596cbc34fSDavid du Colombier /*
7696cbc34fSDavid du Colombier  * rune routines from converted str routines
7796cbc34fSDavid du Colombier  */
7896cbc34fSDavid du Colombier extern	long	utflen(char*);
798ccd4a63SDavid du Colombier extern	char*	utfrune(char*, long);
808ccd4a63SDavid du Colombier extern	char*	utfrrune(char*, long);
818ccd4a63SDavid du Colombier 
828ccd4a63SDavid du Colombier /*
838ccd4a63SDavid du Colombier  * Syscall data structures
848ccd4a63SDavid du Colombier  */
858ccd4a63SDavid du Colombier #define	MORDER	0x0003	/* mask for bits defining order of mounting */
868ccd4a63SDavid du Colombier #define	MREPL	0x0000	/* mount replaces object */
878ccd4a63SDavid du Colombier #define	MBEFORE	0x0001	/* mount goes before others in union directory */
888ccd4a63SDavid du Colombier #define	MAFTER	0x0002	/* mount goes after others in union directory */
898ccd4a63SDavid du Colombier #define	MCREATE	0x0004	/* permit creation in mounted directory */
908ccd4a63SDavid du Colombier #define	MCACHE	0x0010	/* cache some data */
918ccd4a63SDavid du Colombier #define	MMASK	0x0017	/* all bits on */
928ccd4a63SDavid du Colombier 
938ccd4a63SDavid du Colombier #define	OREAD	0	/* open for read */
948ccd4a63SDavid du Colombier #define	OWRITE	1	/* write */
958ccd4a63SDavid du Colombier #define	ORDWR	2	/* read and write */
968ccd4a63SDavid du Colombier #define	OEXEC	3	/* execute, == read but check execute permission */
978ccd4a63SDavid du Colombier #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
988ccd4a63SDavid du Colombier #define	OCEXEC	32	/* or'ed in, close on exec */
998ccd4a63SDavid du Colombier #define	ORCLOSE	64	/* or'ed in, remove on close */
1008ccd4a63SDavid du Colombier #define	OEXCL   0x1000	/* or'ed in, exclusive create */
1018ccd4a63SDavid du Colombier 
1028ccd4a63SDavid du Colombier #define	NCONT	0	/* continue after note */
1038ccd4a63SDavid du Colombier #define	NDFLT	1	/* terminate after note */
1048ccd4a63SDavid du Colombier #define	NSAVE	2	/* clear note but hold state */
1058ccd4a63SDavid du Colombier #define	NRSTR	3	/* restore saved state */
1068ccd4a63SDavid du Colombier 
1078ccd4a63SDavid du Colombier #define	ERRMAX			128	/* max length of error string */
1088ccd4a63SDavid du Colombier #define	KNAMELEN		28	/* max length of name held in kernel */
1098ccd4a63SDavid du Colombier 
1108ccd4a63SDavid du Colombier /* bits in Qid.type */
1118ccd4a63SDavid du Colombier #define QTDIR		0x80		/* type bit for directories */
1128ccd4a63SDavid du Colombier #define QTAPPEND	0x40		/* type bit for append only files */
1138ccd4a63SDavid du Colombier #define QTEXCL		0x20		/* type bit for exclusive use files */
1148ccd4a63SDavid du Colombier #define QTMOUNT		0x10		/* type bit for mounted channel */
1158ccd4a63SDavid du Colombier #define QTAUTH		0x08		/* type bit for authentication file */
1168ccd4a63SDavid du Colombier #define QTFILE		0x00		/* plain file */
1178ccd4a63SDavid du Colombier 
1188ccd4a63SDavid du Colombier /* bits in Dir.mode */
1198ccd4a63SDavid du Colombier #define DMDIR		0x80000000	/* mode bit for directories */
1208ccd4a63SDavid du Colombier #define DMAPPEND		0x40000000	/* mode bit for append only files */
1218ccd4a63SDavid du Colombier #define DMEXCL		0x20000000	/* mode bit for exclusive use files */
1228ccd4a63SDavid du Colombier #define DMMOUNT		0x10000000	/* mode bit for mounted channel */
1238ccd4a63SDavid du Colombier #define DMAUTH		0x08000000	/* mode bit for authentication files */
1248ccd4a63SDavid du Colombier #define DMREAD		0x4		/* mode bit for read permission */
1258ccd4a63SDavid du Colombier #define DMWRITE		0x2		/* mode bit for write permission */
1268ccd4a63SDavid du Colombier #define DMEXEC		0x1		/* mode bit for execute permission */
1278ccd4a63SDavid du Colombier 
1288ccd4a63SDavid du Colombier typedef struct Lock
1298ccd4a63SDavid du Colombier {
13096cbc34fSDavid du Colombier #ifdef PTHREAD
13196cbc34fSDavid du Colombier 	int init;
13296cbc34fSDavid du Colombier 	pthread_mutex_t mutex;
13396cbc34fSDavid du Colombier #else
1348ccd4a63SDavid du Colombier 	long	key;
13596cbc34fSDavid du Colombier #endif
1368ccd4a63SDavid du Colombier } Lock;
1378ccd4a63SDavid du Colombier 
1388ccd4a63SDavid du Colombier typedef struct QLock
1398ccd4a63SDavid du Colombier {
1408ccd4a63SDavid du Colombier 	Lock	lk;
1418ccd4a63SDavid du Colombier 	struct Proc	*hold;
1428ccd4a63SDavid du Colombier 	struct Proc	*first;
1438ccd4a63SDavid du Colombier 	struct Proc	*last;
1448ccd4a63SDavid du Colombier } QLock;
1458ccd4a63SDavid du Colombier 
1468ccd4a63SDavid du Colombier typedef
1478ccd4a63SDavid du Colombier struct Qid
1488ccd4a63SDavid du Colombier {
1498ccd4a63SDavid du Colombier 	uvlong	path;
1508ccd4a63SDavid du Colombier 	ulong	vers;
1518ccd4a63SDavid du Colombier 	uchar	type;
1528ccd4a63SDavid du Colombier } Qid;
1538ccd4a63SDavid du Colombier 
1548ccd4a63SDavid du Colombier typedef
1558ccd4a63SDavid du Colombier struct Dir {
1568ccd4a63SDavid du Colombier 	/* system-modified data */
1578ccd4a63SDavid du Colombier 	ushort	type;	/* server type */
1588ccd4a63SDavid du Colombier 	uint	dev;	/* server subtype */
1598ccd4a63SDavid du Colombier 	/* file data */
1608ccd4a63SDavid du Colombier 	Qid	qid;	/* unique id from server */
1618ccd4a63SDavid du Colombier 	ulong	mode;	/* permissions */
1628ccd4a63SDavid du Colombier 	ulong	atime;	/* last read time */
1638ccd4a63SDavid du Colombier 	ulong	mtime;	/* last write time */
1648ccd4a63SDavid du Colombier 	vlong	length;	/* file length */
1658ccd4a63SDavid du Colombier 	char	*name;	/* last element of path */
1668ccd4a63SDavid du Colombier 	char	*uid;	/* owner name */
1678ccd4a63SDavid du Colombier 	char	*gid;	/* group name */
1688ccd4a63SDavid du Colombier 	char	*muid;	/* last modifier name */
1698ccd4a63SDavid du Colombier } Dir;
1708ccd4a63SDavid du Colombier 
1718ccd4a63SDavid du Colombier typedef
1728ccd4a63SDavid du Colombier struct Waitmsg
1738ccd4a63SDavid du Colombier {
1748ccd4a63SDavid du Colombier 	int pid;	/* of loved one */
1758ccd4a63SDavid du Colombier 	ulong time[3];	/* of loved one & descendants */
1768ccd4a63SDavid du Colombier 	char	*msg;
1778ccd4a63SDavid du Colombier } Waitmsg;
1788ccd4a63SDavid du Colombier 
1798ccd4a63SDavid du Colombier /*
1808ccd4a63SDavid du Colombier  * print routines
1818ccd4a63SDavid du Colombier  */
1828ccd4a63SDavid du Colombier typedef struct Fmt	Fmt;
1838ccd4a63SDavid du Colombier struct Fmt{
1848ccd4a63SDavid du Colombier 	uchar	runes;			/* output buffer is runes or chars? */
1858ccd4a63SDavid du Colombier 	void	*start;			/* of buffer */
1868ccd4a63SDavid du Colombier 	void	*to;			/* current place in the buffer */
1878ccd4a63SDavid du Colombier 	void	*stop;			/* end of the buffer; overwritten if flush fails */
1888ccd4a63SDavid du Colombier 	int	(*flush)(Fmt *);	/* called when to == stop */
1898ccd4a63SDavid du Colombier 	void	*farg;			/* to make flush a closure */
1908ccd4a63SDavid du Colombier 	int	nfmt;			/* num chars formatted so far */
1918ccd4a63SDavid du Colombier 	va_list	args;			/* args passed to dofmt */
1928ccd4a63SDavid du Colombier 	int	r;			/* % format Rune */
1938ccd4a63SDavid du Colombier 	int	width;
1948ccd4a63SDavid du Colombier 	int	prec;
1958ccd4a63SDavid du Colombier 	ulong	flags;
1968ccd4a63SDavid du Colombier };
1978ccd4a63SDavid du Colombier 
1988ccd4a63SDavid du Colombier enum{
1998ccd4a63SDavid du Colombier 	FmtWidth	= 1,
2008ccd4a63SDavid du Colombier 	FmtLeft		= FmtWidth << 1,
2018ccd4a63SDavid du Colombier 	FmtPrec		= FmtLeft << 1,
2028ccd4a63SDavid du Colombier 	FmtSharp	= FmtPrec << 1,
2038ccd4a63SDavid du Colombier 	FmtSpace	= FmtSharp << 1,
2048ccd4a63SDavid du Colombier 	FmtSign		= FmtSpace << 1,
2058ccd4a63SDavid du Colombier 	FmtZero		= FmtSign << 1,
2068ccd4a63SDavid du Colombier 	FmtUnsigned	= FmtZero << 1,
2078ccd4a63SDavid du Colombier 	FmtShort	= FmtUnsigned << 1,
2088ccd4a63SDavid du Colombier 	FmtLong		= FmtShort << 1,
2098ccd4a63SDavid du Colombier 	FmtVLong	= FmtLong << 1,
2108ccd4a63SDavid du Colombier 	FmtComma	= FmtVLong << 1,
2118ccd4a63SDavid du Colombier 	FmtByte	= FmtComma << 1,
2128ccd4a63SDavid du Colombier 
2130d601874SDavid du Colombier 	FmtFlag		= FmtByte << 1,
2140d601874SDavid du Colombier 	FmtLDouble	= FmtFlag << 1
2158ccd4a63SDavid du Colombier };
2168ccd4a63SDavid du Colombier 
2178ccd4a63SDavid du Colombier extern	int	print(char*, ...);
2188ccd4a63SDavid du Colombier extern	char*	seprint(char*, char*, char*, ...);
2198ccd4a63SDavid du Colombier extern	char*	vseprint(char*, char*, char*, va_list);
2208ccd4a63SDavid du Colombier extern	int	snprint(char*, int, char*, ...);
2218ccd4a63SDavid du Colombier extern	int	vsnprint(char*, int, char*, va_list);
2228ccd4a63SDavid du Colombier extern	char*	smprint(char*, ...);
2238ccd4a63SDavid du Colombier extern	char*	vsmprint(char*, va_list);
2248ccd4a63SDavid du Colombier extern	int	sprint(char*, char*, ...);
2258ccd4a63SDavid du Colombier extern	int	fprint(int, char*, ...);
2268ccd4a63SDavid du Colombier extern	int	vfprint(int, char*, va_list);
2278ccd4a63SDavid du Colombier 
2288ccd4a63SDavid du Colombier extern	int	(*doquote)(int);
2298ccd4a63SDavid du Colombier extern	int	runesprint(Rune*, char*, ...);
2308ccd4a63SDavid du Colombier extern	int	runesnprint(Rune*, int, char*, ...);
2318ccd4a63SDavid du Colombier extern	int	runevsnprint(Rune*, int, char*, va_list);
2328ccd4a63SDavid du Colombier extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
2338ccd4a63SDavid du Colombier extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
2348ccd4a63SDavid du Colombier extern	Rune*	runesmprint(char*, ...);
2358ccd4a63SDavid du Colombier extern	Rune*	runevsmprint(char*, va_list);
2368ccd4a63SDavid du Colombier 
23796cbc34fSDavid du Colombier extern       Rune*	runestrchr(Rune*, Rune);
23896cbc34fSDavid du Colombier extern       long	runestrlen(Rune*);
23996cbc34fSDavid du Colombier extern       Rune*	runestrstr(Rune*, Rune*);
24096cbc34fSDavid du Colombier 
2418ccd4a63SDavid du Colombier extern	int	fmtfdinit(Fmt*, int, char*, int);
2428ccd4a63SDavid du Colombier extern	int	fmtfdflush(Fmt*);
2438ccd4a63SDavid du Colombier extern	int	fmtstrinit(Fmt*);
2448ccd4a63SDavid du Colombier extern	int	fmtinstall(int, int (*)(Fmt*));
2458ccd4a63SDavid du Colombier extern	char*	fmtstrflush(Fmt*);
2468ccd4a63SDavid du Colombier extern	int	runefmtstrinit(Fmt*);
2478ccd4a63SDavid du Colombier extern	Rune*	runefmtstrflush(Fmt*);
2481a4050f5SDavid du Colombier extern	int	encodefmt(Fmt*);
2498ccd4a63SDavid du Colombier extern	int	fmtstrcpy(Fmt*, char*);
2508ccd4a63SDavid du Colombier extern	int	fmtprint(Fmt*, char*, ...);
2518ccd4a63SDavid du Colombier extern	int	fmtvprint(Fmt*, char*, va_list);
2528ccd4a63SDavid du Colombier extern	void*	mallocz(ulong, int);
2538ccd4a63SDavid du Colombier 
254ec59a3ddSDavid du Colombier extern	uintptr	getcallerpc(void*);
2558ccd4a63SDavid du Colombier extern	char*	cleanname(char*);
2568ccd4a63SDavid du Colombier extern	void	sysfatal(char*, ...);
2578ccd4a63SDavid du Colombier extern	char*	strecpy(char*, char*, char*);
2588ccd4a63SDavid du Colombier 
2598ccd4a63SDavid du Colombier extern	int	tokenize(char*, char**, int);
2608ccd4a63SDavid du Colombier extern	int	getfields(char*, char**, int, int, char*);
2618ccd4a63SDavid du Colombier extern	char*	utfecpy(char*, char*, char*);
2628ccd4a63SDavid du Colombier extern	long	tas(long*);
2638ccd4a63SDavid du Colombier extern	void	quotefmtinstall(void);
2648ccd4a63SDavid du Colombier extern	int	dec64(uchar*, int, char*, int);
2658ccd4a63SDavid du Colombier extern	int	enc64(char*, int, uchar*, int);
2668ccd4a63SDavid du Colombier extern	int	dec32(uchar*, int, char*, int);
2678ccd4a63SDavid du Colombier extern	int	enc32(char*, int, uchar*, int);
268ec59a3ddSDavid du Colombier extern	int	enc16(char*, int, uchar*, int);
2698ccd4a63SDavid du Colombier void		hnputs(void *p, unsigned short v);
2708ccd4a63SDavid du Colombier extern	int	dofmt(Fmt*, char*);
2718ccd4a63SDavid du Colombier extern	double	__NaN(void);
2728ccd4a63SDavid du Colombier extern	int	__isNaN(double);
2730d601874SDavid du Colombier extern	double	strtod(const char*, char**);
2748ccd4a63SDavid du Colombier extern	int	utfnlen(char*, long);
2758ccd4a63SDavid du Colombier extern	double	__Inf(int);
2768ccd4a63SDavid du Colombier extern	int	__isInf(double, int);
2770d601874SDavid du Colombier 
2780d601874SDavid du Colombier extern int (*fmtdoquote)(int);
2790d601874SDavid du Colombier 
280