842 lines · 22.8 KB · C
RawDownload
#pragma	lib	"libc.a"#pragma	src	"/sys/src/libc" #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))#define	offsetof(s, m)	(ulong)(&(((s*)0)->m))#define	assert(x)	if(x){}else _assert("x") /* * mem routines */extern	void*	memccpy(void*, void*, int, usize);extern	void*	memset(void*, int, usize);extern	int	memcmp(void*, void*, usize);extern	void*	memcpy(void*, void*, usize);extern	void*	memmove(void*, void*, usize);extern	void*	memchr(void*, int, usize); /* * string routines */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*	strdup(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,		/* maximum bytes per rune */	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */	Runeerror	= 0xFFFD,	/* decoding error in UTF */	Runemax		= 0x10FFFF,	/* 21 bit rune */	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */}; /* * rune routines */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	int	utfncmp(char*, char*, long); 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*); enum { Maxnormctx = 1+30 };typedef struct Norm Norm;struct Norm {	long (*getrune)(void*);	void *ctx; 	struct {		Rune *e;		Rune a[Maxnormctx];	} ibuf, obuf; 	int compose;};extern	void	norminit(Norm*, int, void*, long (*getrune)(void*));extern	long	normpull(Norm*, Rune*, long, int);extern	long	runecomp(Rune*, long, Rune*, long);extern	long	runedecomp(Rune*, long, Rune*, long);extern	long	utfcomp(char*, long, char*, long);extern	long	utfdecomp(char*, long, char*, long); extern	Rune*	runewbreak(Rune*);extern	char*	utfwbreak(char*);extern	Rune*	runegbreak(Rune*);extern	char*	utfgbreak(char*); 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);extern	int	isdigitrune(Rune); /* * malloc */extern	void*	malloc(ulong);extern	void*	mallocz(ulong, int);extern	void	free(void*);extern	ulong	msize(void*);extern	void*	mallocalign(ulong, ulong, long, ulong);extern	void*	calloc(ulong, ulong);extern	void*	realloc(void*, ulong);extern	void	setmalloctag(void*, uintptr);extern	void	setrealloctag(void*, uintptr);extern	uintptr	getmalloctag(void*);extern	uintptr	getrealloctag(void*);extern	void*	malloctopoolblock(void*); /* * print routines */typedef struct Fmt	Fmt;struct Fmt{	uchar	runes;			/* output buffer is runes or chars? */	void	*start;			/* of buffer */	void	*to;			/* current place in the buffer */	void	*stop;			/* end of the buffer; overwritten if flush fails */	int	(*flush)(Fmt *);	/* called when to == stop */	void	*farg;			/* to make flush a closure */	int	nfmt;			/* num chars formatted so far */	va_list	args;			/* args passed to dofmt */	int	r;			/* % format Rune */	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*); #pragma	varargck	argpos	fmtprint	2#pragma	varargck	argpos	fprint		2#pragma	varargck	argpos	print		1#pragma	varargck	argpos	runeseprint	3#pragma	varargck	argpos	runesmprint	1#pragma	varargck	argpos	runesnprint	3#pragma	varargck	argpos	runesprint	2#pragma	varargck	argpos	seprint		3#pragma	varargck	argpos	smprint		1#pragma	varargck	argpos	snprint		3#pragma	varargck	argpos	sprint		2 #pragma	varargck	type	"lld"	vlong#pragma	varargck	type	"llo"	vlong#pragma	varargck	type	"llx"	vlong#pragma	varargck	type	"llb"	vlong#pragma	varargck	type	"lld"	uvlong#pragma	varargck	type	"llo"	uvlong#pragma	varargck	type	"llx"	uvlong#pragma	varargck	type	"llb"	uvlong#pragma	varargck	type	"ld"	long#pragma	varargck	type	"lo"	long#pragma	varargck	type	"lx"	long#pragma	varargck	type	"lb"	long#pragma	varargck	type	"ld"	ulong#pragma	varargck	type	"lo"	ulong#pragma	varargck	type	"lx"	ulong#pragma	varargck	type	"lb"	ulong#pragma varargck	type	"zd"	intptr#pragma varargck	type	"zo"	intptr#pragma varargck	type	"zx"	intptr#pragma varargck	type	"zb"	intptr#pragma varargck	type	"zd"	uintptr#pragma varargck	type	"zo"	uintptr#pragma varargck	type	"zx"	uintptr#pragma varargck	type	"zb"	uintptr#pragma	varargck	type	"d"	int#pragma	varargck	type	"o"	int#pragma	varargck	type	"x"	int#pragma	varargck	type	"c"	int#pragma	varargck	type	"C"	int#pragma	varargck	type	"b"	int#pragma	varargck	type	"d"	uint#pragma	varargck	type	"x"	uint#pragma	varargck	type	"c"	uint#pragma	varargck	type	"C"	uint#pragma	varargck	type	"b"	uint#pragma	varargck	type	"f"	double#pragma	varargck	type	"e"	double#pragma	varargck	type	"g"	double#pragma	varargck	type	"s"	char*#pragma	varargck	type	"q"	char*#pragma	varargck	type	"S"	Rune*#pragma	varargck	type	"Q"	Rune*#pragma	varargck	type	"r"	void#pragma	varargck	type	"%"	void#pragma	varargck	type	"n"	int*#pragma	varargck	type	"p"	uintptr#pragma	varargck	type	"p"	void*#pragma	varargck	flag	','#pragma	varargck	flag	' '#pragma	varargck	flag	'h'#pragma varargck	type	"<"	void*#pragma varargck	type	"["	void*#pragma varargck	type	"H"	void*#pragma varargck	type	"lH"	void* 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 */extern	int	errfmt(Fmt *f); /* * quoted strings */extern	char	*unquotestrdup(char*);extern	Rune	*unquoterunestrdup(Rune*);extern	char	*quotestrdup(char*);extern	Rune	*quoterunestrdup(Rune*);extern	int	quotestrfmt(Fmt*);extern	int	quoterunestrfmt(Fmt*);extern	void	quotefmtinstall(void);extern	int	(*doquote)(int);extern	int	needsrcquote(int); /* * random number */extern	void	srand(long);extern	int	rand(void);extern	int	nrand(int);extern	long	lrand(void);extern	long	lnrand(long);extern	double	frand(void);extern	ulong	truerand(void);			/* uses /dev/random */extern	ulong	ntruerand(ulong);		/* uses /dev/random */ /* * 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); 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) /* * Time-of-day */typedef struct Tzone Tzone;#pragma incomplete Tzone  typedefstruct Tm{	int	nsec;		/* nseconds (range 0...1e9) */	int	sec;		/* seconds (range 0..60) */	int	min;		/* minutes (0..59) */	int	hour;		/* hours (0..23) */	int	mday;		/* day of the month (1..31) */	int	mon;		/* month of the year (0..11) */	int	year;		/* year A.D. */	int	wday;		/* day of week (0..6, Sunday = 0) */	int	yday;		/* day of year (0..365) */	char	zone[16];	/* time zone name */	int	tzoff;		/* time zone delta from GMT */	Tzone	*tz;		/* time zone associated with this date */} Tm; typedefstruct Tmfmt {	char	*fmt;	Tm	*tm;} Tmfmt; #pragma varargck	type	"τ"	Tmfmt extern	Tzone*	tzload(char *name);extern	Tm*	tmnow(Tm*, Tzone*);extern	Tm*	tmtime(Tm*, vlong, Tzone*);extern	Tm*	tmtimens(Tm*, vlong, int, Tzone*);extern	Tm*	tmparse(Tm*, char*, char*, Tzone*, char **ep);extern	vlong	tmnorm(Tm*);extern	Tmfmt	tmfmt(Tm*, char*);extern	void	tmfmtinstall(void); extern	Tm*	gmtime(long);extern	Tm*	localtime(long);extern	char*	asctime(Tm*);extern	char*	ctime(long);extern	double	cputime(void);extern	long	times(long*);extern	long	tm2sec(Tm*); extern	vlong	nsec(void);extern	vlong	uptime(void);extern	uvlong	fastticks(uvlong*); extern	void	cycles(uvlong*);	/* 64-bit value of the cycle counter if there is one, 0 if there isn't */ /* * one-of-a-kind */enum{	PNPROC		= 1,	PNGROUP		= 2,}; extern	void	_assert(char*);extern	int	abs(int);extern	int	atexit(void(*)(void));extern	void	atexitdont(void(*)(void));extern	int	atnotify(int(*)(void*, char*), int);extern	double	atof(char*);extern	int	atoi(char*);extern	long	atol(char*);extern	vlong	atoll(char*);extern	double	charstod(int(*)(void*), void*);extern	char*	cleanname(char*);extern	int	decrypt(void*, void*, int);extern	int	encrypt(void*, void*, int); extern	int	dec64(uchar*, int, char*, int);extern	int	enc64(char*, int, uchar*, int);extern	int	dec64x(uchar*, int, char*, int, int (*)(int));extern	int	enc64x(char*, int, uchar*, int, int (*)(int));extern	int	dec32(uchar*, int, char*, int);extern	int	enc32(char*, int, uchar*, int);extern	int	dec32x(uchar*, int, char*, int, int (*)(int));extern	int	enc32x(char*, int, uchar*, int, int (*)(int));extern	int	dec16(uchar*, int, char*, int);extern	int	enc16(char*, int, uchar*, int);extern	int	dec64chr(int);extern	int	enc64chr(int);extern	int	dec32chr(int);extern	int	enc32chr(int);extern	int	dec16chr(int);extern	int	enc16chr(int); extern	int	encodefmt(Fmt*);extern	_Noreturn void	exits(char*);extern	double	frexp(double, int*);extern	uintptr	getcallerpc(void*);extern	char*	getenv(char*);extern	int	getfields(char*, char**, int, int, char*);extern	int	gettokens(char *, char **, int, char *);extern	char*	getuser(void);extern	char*	getwd(char*, int);extern	int	iounit(int);extern	long	labs(long);extern	double	ldexp(double, int);extern	_Noreturn void	longjmp(jmp_buf, int);extern	char*	mktemp(char*);extern	double	modf(double, double*);extern	int	netcrypt(void*, void*);extern	void	notejmp(void*, jmp_buf, int);extern	void	perror(char*);extern	int	postnote(int, int, char *);extern	double	pow10(int);extern	int	putenv(char*, char*);extern	void	qsort(void*, usize, usize, int (*)(void*, void*));extern	int	setjmp(jmp_buf);extern	double	strtod(char*, char**);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	_Noreturn void	sysfatal(char*, ...);#pragma	varargck	argpos	sysfatal	1extern	void	syslog(int, char*, char*, ...);#pragma	varargck	argpos	syslog	3extern	long	time(long*);extern	int	tolower(int);extern	int	toupper(int); /* *  profiling */enum {	Profoff,		/* No profiling */	Profuser,		/* Measure user time only (default) */	Profkernel,		/* Measure user + kernel time */	Proftime,		/* Measure total time */	Profsample,		/* Use clock interrupt to sample (default when there is no cycle counter) */}; /* what */extern	void	prof(void (*fn)(void*), void *arg, int entries, int what); /* *  synchronization */typedefstruct Lock {	int	val;} Lock; extern int	_tas(int*); extern	void	lock(Lock*);extern	void	unlock(Lock*);extern	int	canlock(Lock*); typedef struct QLp QLp;struct QLp{	int	inuse;

Lines 1–500 of 842.