/*
 * sorted by 4,/^$/|sort -bd +1
 */
int		addarena(Arena *name);
void		addstat(int, int);
void		addstat2(int, int, int, int);
ZBlock		*alloczblock(u32int size, int zeroed, uint alignment);
Arena		*amapitoa(Index *index, u64int a, u64int *aa);
Arena		*amapitoag(Index *index, u64int a, u64int *gstart, u64int *glimit, int *g);
u64int		arenadirsize(Arena *arena, u32int clumps);
int		arenatog(Arena *arena, u64int aa, u64int *gstart, u64int *glimit, int *g);
void		arenaupdate(Arena *arena, u32int size, u8int *score);
int		asumload(Arena *arena, int g, IEntry *entries, int maxentries);
void		backsumarena(Arena *arena);
void	binstats(long (*fn)(Stats *s0, Stats *s1, void*), void *arg, long t0, long t1, Statbin *bin, int nbin);
int		bloominit(Bloom*, vlong, uchar*);
int		bucklook(u8int*, int, u8int*, int);
u32int		buildbucket(Index *ix, IEStream *ies, IBucket *ib, uint);
void		checkdcache(void);
void		checklumpcache(void);
int		clumpinfoeq(ClumpInfo *c, ClumpInfo *d);
int		clumpinfoeq(ClumpInfo *c, ClumpInfo *d);
u32int		clumpmagic(Arena *arena, u64int aa);
uint		countbits(uint n);
int		delarena(Arena *arena);
void		delaykickicache(void);
void		delaykickround(Round*);
void		delaykickroundproc(void*);
void		dirtydblock(DBlock*, int);
void		diskaccess(int);
void		disksched(void);
void		emptydcache(void);
void		emptyicache(void);
void		emptylumpcache(void);
Arena		*findarena(char *name);
int		flushciblocks(Arena *arena);
void		flushdcache(void);
void		flushicache(void);
int		flushpart(Part*);
void		flushqueue(void);
void		fmtzbinit(Fmt *f, ZBlock *b);
void		freearena(Arena *arena);
void		freearenapart(ArenaPart *ap, int freearenas);
void		freeiestream(IEStream *ies);
void		freeifile(IFile *f);
void		freeisect(ISect *is);
void		freeindex(Index *index);
void		freepart(Part *part);
void		freezblock(ZBlock *b);
DBlock		*_getdblock(Part *part, u64int addr, int mode, int load);
DBlock		*getdblock(Part *part, u64int addr, int mode);
u32int		hashbits(u8int *score, int nbits);
char		*hargstr(HConnect*, char*, char*);
vlong	hargint(HConnect*, char*, vlong);
int		hdebug(HConnect*);
int		hdisk(HConnect*);
int		hnotfound(HConnect*);
int		hproc(HConnect*);
int		hsethtml(HConnect*);
int		hsettext(HConnect*);
int		httpdinit(char *address, char *webroot);
int		iaddrcmp(IAddr *ia1, IAddr *ia2);
IEntry*	icachedirty(u32int, u32int, u64int);
ulong	icachedirtyfrac(void);
void		icacheclean(IEntry*);
int		icachelookup(u8int *score, int type, IAddr *ia);
AState	icachestate(void);
int		ientrycmp(const void *vie1, const void *vie2);
char		*ifileline(IFile *f);
int		ifilename(IFile *f, char *dst);
int		ifileu32int(IFile *f, u32int *r);
int		inbloomfilter(Bloom*, u8int*);
int		indexsect(Index *ix, u8int *score);
int		indexsect0(Index *ix, u32int buck);
Arena		*initarena(Part *part, u64int base, u64int size, u32int blocksize);
ArenaPart	*initarenapart(Part *part);
int		initarenasum(void);
void		initbloomfilter(Index*);
void		initdcache(u32int mem);
void		initicache(u32int mem);
void		initicachewrite(void);
IEStream	*initiestream(Part *part, u64int off, u64int clumps, u32int size);
ISect		*initisect(Part *part);
Index		*initindex(char *name, ISect **sects, int n);
void		initlumpcache(u32int size, u32int nblocks);
int		initlumpqueues(int nq);
Part*		initpart(char *name, int mode);
void		initround(Round*, char*, int);
int		initventi(char *config, Config *conf);
void		insertlump(Lump *lump, Packet *p);
int		insertscore(u8int *score, IAddr *ia, int state, AState *as);
void		kickdcache(void);
void		kickicache(void);
void		kickround(Round*, int wait);
int		loadbloom(Bloom*);
ZBlock		*loadclump(Arena *arena, u64int aa, int blocks, Clump *cl, u8int *score, int verify);
DBlock	*loadibucket(Index *index, u8int *score, ISect **is, u32int *buck, IBucket *ib);
int		loadientry(Index *index, u8int *score, int type, IEntry *ie);
void		logerr(int severity, char *fmt, ...);
Lump		*lookuplump(u8int *score, int type);
int		lookupscore(u8int *score, int type, IAddr *ia);
int		maparenas(AMap *am, Arena **arenas, int n, char *what);
void		markbloomfilter(Bloom*, u8int*);
uint		msec(void);
int		namecmp(char *s, char *t);
void		namecp(char *dst, char *src);
int		nameok(char *name);
void		needmainindex(void);
void		needzeroscore(void);
Arena		*newarena(Part *part, u32int, char *name, u64int base, u64int size, u32int blocksize);
ArenaPart	*newarenapart(Part *part, u32int blocksize, u32int tabsize);
ISect		*newisect(Part *part, u32int vers, char *name, u32int blocksize, u32int tabsize);
Index		*newindex(char *name, ISect **sects, int n);
u32int		now(void);
int		okamap(AMap *am, int n, u64int start, u64int stop, char *what);
int		okibucket(IBucket*, ISect*);
int		outputamap(Fmt *f, AMap *am, int n);
int		outputindex(Fmt *f, Index *ix);
int		_packarena(Arena *arena, u8int *buf, int);
int		packarena(Arena *arena, u8int *buf);
int		packarenahead(ArenaHead *head, u8int *buf);
int		packarenapart(ArenaPart *as, u8int *buf);
void		packbloomhead(Bloom*, u8int*);
int		packclump(Clump *c, u8int *buf, u32int);
void		packclumpinfo(ClumpInfo *ci, u8int *buf);
void		packibucket(IBucket *b, u8int *buf, u32int magic);
void		packientry(IEntry *i, u8int *buf);
int		packisect(ISect *is, u8int *buf);
void		packmagic(u32int magic, u8int *buf);
ZBlock		*packet2zblock(Packet *p, u32int size);
int		parseamap(IFile *f, AMapN *amn);
int		parseindex(IFile *f, Index *ix);
void		partblocksize(Part *part, u32int blocksize);
int		partifile(IFile *f, Part *part, u64int start, u32int size);
void		printarenapart(int fd, ArenaPart *ap);
void		printarena(int fd, Arena *arena);
void		printindex(int fd, Index *ix);
void		printstats(void);
void		putdblock(DBlock *b);
void		putlump(Lump *b);
int		queuewrite(Lump *b, Packet *p, int creator, uint ms);
u32int		readarena(Arena *arena, u64int aa, u8int *buf, long n);
int		readarenamap(AMapN *amn, Part *part, u64int base, u32int size);
Bloom	*readbloom(Part*);
int		readclumpinfo(Arena *arena, int clump, ClumpInfo *ci);
int		readclumpinfos(Arena *arena, int clump, ClumpInfo *cis, int n);
ZBlock		*readfile(char *name);
int		readifile(IFile *f, char *name);
Packet		*readlump(u8int *score, int type, u32int size, int *cached);
// If the return value is not negative one, n bytes were successfully read.
// If n == -1, this will ALWAYS report failure, even when the read succeeded.
int		readpart(Part *part, u64int addr, u8int *buf, u32int n);
int		resetbloom(Bloom*);
int		runconfig(char *config, Config*);
int		scorecmp(u8int *, u8int *);
void		scoremem(u8int *score, u8int *buf, int size);
void		setatailstate(AState*);
void		seterr(int severity, char *fmt, ...);
void		setstat(int, long);
void		settrace(char *type);
u64int		sortrawientries(Index *ix, Part *tmp, u64int *tmpoff, Bloom *bloom);
void		startbloomproc(Bloom*);
Memimage*	statgraph(Graph *g);
void		statsinit(void);
int		storeclump(Index *index, ZBlock *b, u8int *score, int type, u32int creator, IAddr *ia);
int		storeientry(Index *index, IEntry *m);
int		strscore(char *s, u8int *score);
int		stru32int(char *s, u32int *r);
int		stru64int(char *s, u64int *r);
void		sumarena(Arena *arena);
int		syncarena(Arena *arena, u32int n, int zok, int fix);
int		syncindex(Index *ix);
void		trace(char *type, char*, ...);
void		traceinit(void);
int		u64log2(u64int v);
u64int		unittoull(char *s);
int		unpackarena(Arena *arena, u8int *buf);
int		unpackarenahead(ArenaHead *head, u8int *buf);
int		unpackarenapart(ArenaPart *as, u8int *buf);
int		unpackbloomhead(Bloom*, u8int*);
int		unpackclump(Clump *c, u8int *buf, u32int);
void		unpackclumpinfo(ClumpInfo *ci, u8int *buf);
void		unpackibucket(IBucket *b, u8int *buf, u32int magic);
void		unpackientry(IEntry *i, u8int *buf);
int		unpackisect(ISect *is, u8int *buf);
u32int		unpackmagic(u8int *buf);
void		ventifmtinstall(void);
void		vtloghdump(Hio*, VtLog*);
void		vtloghlist(Hio*);
int		vtproc(void(*)(void*), void*);
int		vttypevalid(int type);
void		waitforkick(Round*);
int		wbarena(Arena *arena);
int		wbarenahead(Arena *arena);
int		wbarenamap(AMap *am, int n, Part *part, u64int base, u64int size);
int		wbarenapart(ArenaPart *ap);
void		wbbloomhead(Bloom*);
int		wbisect(ISect *is);
int		wbindex(Index *ix);
int		whackblock(u8int *dst, u8int *src, int ssize);
u64int		writeaclump(Arena *a, Clump *c, u8int *clbuf);
u32int		writearena(Arena *arena, u64int aa, u8int *clbuf, u32int n);
int		writebloom(Bloom*);
int		writeclumpinfo(Arena *arean, int clump, ClumpInfo *ci);
int		writepng(Hio*, Memimage*);
u64int		writeiclump(Index *ix, Clump *c, u8int *clbuf);
int		writelump(Packet *p, u8int *score, int type, u32int creator, uint ms);
int		writepart(Part *part, u64int addr, u8int *buf, u32int n);
int		writeqlump(Lump *u, Packet *p, int creator, uint ms);
Packet		*zblock2packet(ZBlock *zb, u32int size);
void		zeropart(Part *part, int blocksize);

/*
#pragma	varargck	argpos	sysfatal		1
#pragma	varargck	argpos	logerr		2
#pragma	varargck	argpos	SetErr		2
*/

#define scorecmp(h1,h2)		memcmp((h1),(h2),VtScoreSize)
#define scorecp(h1,h2)		memmove((h1),(h2),VtScoreSize)

#define MK(t)			((t*)vtmalloc(sizeof(t)))
#define MKZ(t)			((t*)vtmallocz(sizeof(t)))
#define MKN(t,n)		((t*)vtmalloc((n)*sizeof(t)))
#define MKNZ(t,n)		((t*)vtmallocz((n)*sizeof(t)))
#define MKNA(t,at,n)		((t*)vtmalloc(sizeof(t) + (n)*sizeof(at)))
