955 lines · 24.4 KB · C
RawDownload
/* * Lib9 is miscellany from the Plan 9 C library that doesn't * fit into libutf or into libfmt, but is still missing from traditional * Unix C libraries. */#ifndef _LIBC_H_#define _LIBC_H_ 1#if defined(__cplusplus)extern "C" {#endif                                                                 #include <utf.h>#include <fmt.h> /* * Begin usual libc.h  */ #ifndef nil#define	nil	((void*)0)#endif#define	nelem(x)	(sizeof(x)/sizeof((x)[0])) #ifndef offsetof#define offsetof(s, m)	(ulong)(&(((s*)0)->m))#endif /* * mem routines (provided by system <string.h>) *extern	void*	memccpy(void*, void*, int, ulong);extern	void*	memset(void*, int, ulong);extern	int	memcmp(void*, void*, ulong);extern	void*	memcpy(void*, void*, ulong);extern	void*	memmove(void*, void*, ulong);extern	void*	memchr(void*, int, ulong); */ /* * string routines (provided by system <string.h>) *extern	char*	strcat(char*, char*);extern	char*	strchr(char*, int);extern	int	strcmp(char*, char*);extern	char*	strcpy(char*, char*); */extern	char*	strecpy(char*, char*, char*);extern	char*	p9strdup(char*);/*extern	char*	strncat(char*, char*, long);extern	char*	strncpy(char*, char*, long);extern	int	strncmp(char*, char*, long);extern	char*	strpbrk(char*, char*);extern	char*	strrchr(char*, int);extern	char*	strtok(char*, char*);extern	long	strlen(char*);extern	long	strspn(char*, char*);extern	long	strcspn(char*, char*);extern	char*	strstr(char*, char*); */extern	int	cistrncmp(char*, char*, int);extern	int	cistrcmp(char*, char*);extern	char*	cistrstr(char*, char*);extern	int	tokenize(char*, char**, int); /*enum{	UTFmax		= 4,	Runesync	= 0x80,	Runeself	= 0x80,	Runeerror	= 0xFFFD,	Runemax	= 0x10FFFF,};*/ /* * rune routines (provided by <utf.h> *extern	int	runetochar(char*, Rune*);extern	int	chartorune(Rune*, char*);extern	int	runelen(long);extern	int	runenlen(Rune*, int);extern	int	fullrune(char*, int);extern	int	utflen(char*);extern	int	utfnlen(char*, long);extern	char*	utfrune(char*, long);extern	char*	utfrrune(char*, long);extern	char*	utfutf(char*, char*);extern	char*	utfecpy(char*, char*, char*); extern	Rune*	runestrcat(Rune*, Rune*);extern	Rune*	runestrchr(Rune*, Rune);extern	int	runestrcmp(Rune*, Rune*);extern	Rune*	runestrcpy(Rune*, Rune*);extern	Rune*	runestrncpy(Rune*, Rune*, long);extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);extern	Rune*	runestrdup(Rune*);extern	Rune*	runestrncat(Rune*, Rune*, long);extern	int	runestrncmp(Rune*, Rune*, long);extern	Rune*	runestrrchr(Rune*, Rune);extern	long	runestrlen(Rune*);extern	Rune*	runestrstr(Rune*, Rune*); extern	Rune	tolowerrune(Rune);extern	Rune	totitlerune(Rune);extern	Rune	toupperrune(Rune);extern	int	isalpharune(Rune);extern	int	islowerrune(Rune);extern	int	isspacerune(Rune);extern	int	istitlerune(Rune);extern	int	isupperrune(Rune); */ /* * malloc (provied by system <stdlib.h>) *extern	void*	malloc(ulong); */extern	void*	p9malloc(ulong);extern	void*	mallocz(ulong, int);extern	void	p9free(void*);extern	void*	p9calloc(ulong, ulong);extern	void*	p9realloc(void*, ulong);extern	void		setmalloctag(void*, ulong);extern	void		setrealloctag(void*, ulong);extern	ulong	getmalloctag(void*);extern	ulong	getrealloctag(void*);/*extern	void*	malloctopoolblock(void*);*/#ifndef NOPLAN9DEFINES#define	malloc	p9malloc#define	realloc	p9realloc#define	calloc	p9calloc#define	free	p9free#undef strdup#define	strdup	p9strdup#endif /* * print routines (provided by <fmt.h>) *typedef struct Fmt	Fmt;struct Fmt{	uchar	runes;	void	*start;	void	*to;	void	*stop;	int	(*flush)(Fmt *);	void	*farg;	int	nfmt;	va_list	args;	int	r;	int	width;	int	prec;	ulong	flags;}; enum{	FmtWidth	= 1,	FmtLeft		= FmtWidth << 1,	FmtPrec		= FmtLeft << 1,	FmtSharp	= FmtPrec << 1,	FmtSpace	= FmtSharp << 1,	FmtSign		= FmtSpace << 1,	FmtZero		= FmtSign << 1,	FmtUnsigned	= FmtZero << 1,	FmtShort	= FmtUnsigned << 1,	FmtLong		= FmtShort << 1,	FmtVLong	= FmtLong << 1,	FmtComma	= FmtVLong << 1,	FmtByte	= FmtComma << 1, 	FmtFlag		= FmtByte << 1}; extern	int	print(char*, ...);extern	char*	seprint(char*, char*, char*, ...);extern	char*	vseprint(char*, char*, char*, va_list);extern	int	snprint(char*, int, char*, ...);extern	int	vsnprint(char*, int, char*, va_list);extern	char*	smprint(char*, ...);extern	char*	vsmprint(char*, va_list);extern	int	sprint(char*, char*, ...);extern	int	fprint(int, char*, ...);extern	int	vfprint(int, char*, va_list); extern	int	runesprint(Rune*, char*, ...);extern	int	runesnprint(Rune*, int, char*, ...);extern	int	runevsnprint(Rune*, int, char*, va_list);extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);extern	Rune*	runesmprint(char*, ...);extern	Rune*	runevsmprint(char*, va_list); extern	int	fmtfdinit(Fmt*, int, char*, int);extern	int	fmtfdflush(Fmt*);extern	int	fmtstrinit(Fmt*);extern	char*	fmtstrflush(Fmt*);extern	int	runefmtstrinit(Fmt*);extern	Rune*	runefmtstrflush(Fmt*); extern	int	fmtinstall(int, int (*)(Fmt*));extern	int	dofmt(Fmt*, char*);extern	int	dorfmt(Fmt*, Rune*);extern	int	fmtprint(Fmt*, char*, ...);extern	int	fmtvprint(Fmt*, char*, va_list);extern	int	fmtrune(Fmt*, int);extern	int	fmtstrcpy(Fmt*, char*);extern	int	fmtrunestrcpy(Fmt*, Rune*); */ /* * error string for %r * supplied on per os basis, not part of fmt library * * (provided by lib9, but declared in fmt.h) *extern	int	errfmt(Fmt *f); */ /* * quoted strings */extern	char	*unquotestrdup(char*);extern	Rune	*unquoterunestrdup(Rune*);extern	char	*quotestrdup(char*);extern	Rune	*quoterunestrdup(Rune*);/* * in fmt.h *extern	void	quotefmtinstall(void);extern	int	quotestrfmt(Fmt*);extern	int	quoterunestrfmt(Fmt*); */#ifndef NOPLAN9DEFINES#define doquote fmtdoquote#endifextern	int	needsrcquote(int); /* * random number */extern	void	p9srand(long);extern	int	p9rand(void); extern	int	p9nrand(int);extern	long	p9lrand(void);extern	long	p9lnrand(long);extern	double	p9frand(void);extern	ulong	truerand(void);			/* uses /dev/random */extern	ulong	ntruerand(ulong);		/* uses /dev/random */ #ifndef NOPLAN9DEFINES#define	srand	p9srand#define	rand	p9rand#define	nrand	p9nrand#define	lrand	p9lrand#define	lnrand	p9lnrand#define	frand	p9frand#endif /* * math */extern	ulong	getfcr(void);extern	void	setfsr(ulong);extern	ulong	getfsr(void);extern	void	setfcr(ulong);extern	double	NaN(void);extern	double	Inf(int);extern	int	isNaN(double);extern	int	isInf(double, int);extern	ulong	umuldiv(ulong, ulong, ulong);extern	long	muldiv(long, long, long); /* * provided by math.h *extern	double	pow(double, double);extern	double	atan2(double, double);extern	double	fabs(double);extern	double	atan(double);extern	double	log(double);extern	double	log10(double);extern	double	exp(double);extern	double	floor(double);extern	double	ceil(double);extern	double	hypot(double, double);extern	double	sin(double);extern	double	cos(double);extern	double	tan(double);extern	double	asin(double);extern	double	acos(double);extern	double	sinh(double);extern	double	cosh(double);extern	double	tanh(double);extern	double	sqrt(double);extern	double	fmod(double, double);#define	HUGE	3.4028234e38#define	PIO2	1.570796326794896619231e0#define	PI	(PIO2+PIO2) */#define PI	M_PI#define	PIO2	M_PI_2 /* * Time-of-day */ typedefstruct Tm{	int	sec;	int	min;	int	hour;	int	mday;	int	mon;	int	year;	int	wday;	int	yday;	char	zone[4];	int	tzoff;} Tm; extern	Tm*	p9gmtime(long);extern	Tm*	p9localtime(long);extern	char*	p9asctime(Tm*);extern	char*	p9ctime(long);extern	double	p9cputime(void);extern	long	p9times(long*);extern	long	p9tm2sec(Tm*);extern	vlong	p9nsec(void); #ifndef NOPLAN9DEFINES#define	gmtime		p9gmtime#define	localtime	p9localtime#define	asctime		p9asctime#define	ctime		p9ctime#define	cputime		p9cputime#define	times		p9times#define	tm2sec		p9tm2sec#define	nsec		p9nsec#endif /* * one-of-a-kind */enum{	PNPROC		= 1,	PNGROUP		= 2}; /* extern	int	abs(int); <stdlib.h> */extern	int	p9atexit(void(*)(void));extern	void	p9atexitdont(void(*)(void));extern	int	atnotify(int(*)(void*, char*), int);/*  * <stdlib.h>extern	double	atof(char*); <stdlib.h> */extern	int	p9atoi(char*);extern	long	p9atol(char*);extern	vlong	p9atoll(char*);extern	double	fmtcharstod(int(*)(void*), void*);extern	char*	cleanname(char*);extern	int	p9decrypt(void*, void*, int);extern	int	p9encrypt(void*, void*, int);extern	int	netcrypt(void*, void*);extern	int	dec64(uchar*, int, char*, int);extern	int	enc64(char*, int, uchar*, int);extern	int	dec32(uchar*, int, char*, int);extern	int	enc32(char*, int, uchar*, int);extern	int	dec16(uchar*, int, char*, int);extern	int	enc16(char*, int, uchar*, int);extern	int	encodefmt(Fmt*);extern	int	dirmodefmt(Fmt*);extern	int	exitcode(char*);extern	void	exits(char*);extern	void	p9exit(int);extern	double	frexp(double, int*);extern	ulong	getcallerpc(void*);extern	char*	p9getenv(char*);extern	int	p9putenv(char*, char*);extern	int	getfields(char*, char**, int, int, char*);extern	int	gettokens(char *, char **, int, char *);extern	char*	getuser(void);extern	char*	p9getwd(char*, int);extern	int	iounit(int);/* extern	long	labs(long); <math.h> *//* extern	double	ldexp(double, int); <math.h> */extern	void	p9longjmp(p9jmp_buf, int);extern	char*	mktemp(char*);extern	int		opentemp(char*, int);/* extern	double	modf(double, double*); <math.h> */extern	void	p9notejmp(void*, p9jmp_buf, int);extern	void	perror(const char*);extern	int	postnote(int, int, char *);extern	double	p9pow10(int);/* extern	int	putenv(char*, char*); <stdlib.h. *//* extern	void	qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */extern	char*	searchpath(char*);/* extern	int	p9setjmp(p9jmp_buf); */#define p9setjmp(b)	sigsetjmp((void*)(b), 1)/* * <stdlib.h>extern	long	strtol(char*, char**, int);extern	ulong	strtoul(char*, char**, int);extern	vlong	strtoll(char*, char**, int);extern	uvlong	strtoull(char*, char**, int); */extern	void	sysfatal(char*, ...);extern	void	p9syslog(int, char*, char*, ...);extern	long	p9time(long*);/* extern	int	tolower(int); <ctype.h> *//* extern	int	toupper(int); <ctype.h> */extern	void	needstack(int);extern	char*	readcons(char*, char*, int); extern	void	(*_pin)(void);extern	void	(*_unpin)(void); #ifndef NOPLAN9DEFINES#define atexit		p9atexit#define atexitdont	p9atexitdont#define atoi		p9atoi#define atol		p9atol#define atoll		p9atoll#define encrypt		p9encrypt#ifndef NOEXITDEFINE# define exit		p9exit#endif#define decrypt		p9decrypt#define getenv		p9getenv#define	getwd		p9getwd#define	longjmp		p9longjmp#undef  setjmp#define setjmp		p9setjmp#define putenv		p9putenv#define notejmp		p9notejmp#define jmp_buf		p9jmp_buf#define time		p9time#define pow10		p9pow10#define strtod		fmtstrtod#define charstod	fmtcharstod#define syslog		p9syslog#endif /* *  just enough information so that libc can be *  properly locked without dragging in all of libthread */typedef struct _Thread _Thread;typedef struct _Threadlist _Threadlist;struct _Threadlist{	_Thread	*head;	_Thread	*tail;}; extern	_Thread	*(*threadnow)(void); /* *  synchronization */typedef struct Lock Lock;struct Lock{#ifdef __MINGW32__	int init;	MingwCritSect mutex;#endif#ifdef PLAN9PORT_USING_PTHREADS	int init;	pthread_mutex_t mutex;#endif	int held;}; extern	void	lock(Lock*);extern	void	unlock(Lock*);extern	int	canlock(Lock*);extern	int	(*_lock)(Lock*, int, ulong);extern	void	(*_unlock)(Lock*, ulong);	 typedef struct QLock QLock;struct QLock{	Lock		l;	_Thread	*owner;	_Threadlist	waiting;}; extern	void	qlock(QLock*);extern	void	qunlock(QLock*);extern	int	canqlock(QLock*);extern	int	(*_qlock)(QLock*, int, ulong);	/* do not use */extern	void	(*_qunlock)(QLock*, ulong);

Lines 1–500 of 955.