/* 
 * This file is part of the UCB release of Plan 9. It is subject to the license
 * terms in the LICENSE file found in the top-level directory of this
 * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
 * part of the UCB release of Plan 9, including this file, may be copied,
 * modified, propagated, or distributed except according to the terms contained
 * in the LICENSE file.
 */
#pragma once

#include <fcall.h>
#include <stdio.h>

__BEGIN_DECLS

enum
{
	Ndbalen=	32,	/* max attribute length */
	Ndbvlen=	64,	/* max value length */
};

struct ndbcache;
/*
 *  the database
 */
struct ndb
{
	struct ndb	*next;

	FILE		*b;		/* buffered input file */
	uint8_t		buf[256];	/* and its buffer */

	uint32_t	mtime;		/* mtime of db file */
	struct qid	qid;		/* qid of db file */
	char		file[128];	/* path name of db file */
	uint32_t	length;		/* length of db file */
	int		isopen;		/* true if the file is open */

	int		nohash;		/* don't look for hash files */
	struct ndbhf	*hf;		/* open hash files */

	int		ncache;		/* size of tuple cache */
	struct ndbcache	*cache;		/* cached entries */
};

/*
 *  a parsed entry, doubly linked
 */
struct ndbtuple
{
	char		attr[Ndbalen];	/* attribute name */
	char		*val;		/* value(s) */
	struct ndbtuple	*entry;		/* next tuple in this entry */
	struct ndbtuple	*line;		/* next tuple on this line */
	uint32_t	ptr;		/* (for the application - starts 0) */
	char		valbuf[Ndbvlen];/* initial allocation for value */
};

/*
 *  each hash file is of the form
 *
 *		+---------------------------------------+
 *		|	mtime of db file (4 bytes)	|
 *		+---------------------------------------+
 *		|  size of table (in entries - 4 bytes)	|
 *		+---------------------------------------+
 *		|		hash table		|
 *		+---------------------------------------+
 *		|		hash chains		|
 *		+---------------------------------------+
 *
 *  hash collisions are resolved using chained entries added to the
 *  the end of the hash table.
 *
 *  Hash entries are of the form
 *
 *		+-------------------------------+
 *		|	offset	(3 bytes) 	|
 *		+-------------------------------+
 *
 *  Chain entries are of the form
 *
 *		+-------------------------------+
 *		|	offset1	(3 bytes) 	|
 *		+-------------------------------+
 *		|	offset2	(3 bytes) 	|
 *		+-------------------------------+
 *
 *  The top bit of an offset set to 1 indicates a pointer to a hash chain entry.
 */
#define NDBULLEN	4		/* unsigned long length in bytes */
#define NDBPLEN		3		/* pointer length in bytes */
#define NDBHLEN		(2*NDBULLEN)	/* hash file header length in bytes */

/*
 *  finger pointing to current point in a search
 */
struct ndbs
{
	struct ndb	*db;	/* data base file being searched */
	struct ndbhf	*hf;	/* hash file being searched */
	int		type;
	uint32_t	ptr;	/* current pointer */
	uint32_t	ptr1;	/* next pointer */
	struct ndbtuple *t;	/* last attribute value pair found */
};

struct ndbcache
{
	struct ndbcache	*next;
	char		*attr;
	char		*val;
	struct ndbs	s;
	struct ndbtuple	*t;
};

/*
 *  bit defs for pointers in hash files
 */
#define NDBSPEC 	(1<<23)
#define NDBCHAIN	NDBSPEC		/* points to a collision chain */
#define NDBNAP		(NDBSPEC|1)	/* not a pointer */

/*
 *  macros for packing and unpacking pointers
 */
#define NDBPUTP(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; }
#define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16))

/*
 *  macros for packing and unpacking unsigned longs
 */
#define NDBPUTUL(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; (a)[3] = (v)>>24; }
#define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24))

#define NDB_IPlen 16

struct ndbtuple *csgetval(char*, char*, char*, char*, char*);
char *csgetvalue(char*, char*, char*, char*, struct ndbtuple**);
struct ndbtuple *csipinfo(char*, char*, char*, char**, int);
struct ndbtuple *dnsquery(char*, char*, char*);
char *ipattr(char*);
struct ndb *ndbcat(struct ndb*, struct ndb*);
int ndbchanged(struct ndb*);
void ndbclose(struct ndb*);
struct ndbtuple *ndbconcatenate(struct ndbtuple*, struct ndbtuple*);
struct ndbtuple *ndbdiscard(struct ndbtuple*, struct ndbtuple*);
void ndbfree(struct ndbtuple*);
struct ndbtuple *ndbgetipaddr(struct ndb*, char*);
struct ndbtuple *ndbgetval(struct ndb*, struct ndbs*, char*, char*, char*,
			   char*);
char *ndbgetvalue(struct ndb*, struct ndbs*, char*, char*, char*,
		  struct ndbtuple**);
struct ndbtuple *ndbfindattr(struct ndbtuple*, struct ndbtuple*, char*);
uint32_t ndbhash(char*, int);
struct ndbtuple *ndbipinfo(struct ndb*, char*, char*, char**, int);
struct ndbtuple *ndblookval(struct ndbtuple*, struct ndbtuple*, char*, char*);
struct ndbtuple *ndbnew(char*, char*);
struct ndb *ndbopen(char*);
struct ndbtuple *ndbparse(struct ndb*);
int ndbreopen(struct ndb*);
struct ndbtuple *ndbreorder(struct ndbtuple*, struct ndbtuple*);
struct ndbtuple *ndbsearch(struct ndb*, struct ndbs*, char*, char*);
void ndbsetval(struct ndbtuple*, char*, int);
struct ndbtuple *ndbsnext(struct ndbs*, char*, char*);
struct ndbtuple *ndbsubstitute(struct ndbtuple*, struct ndbtuple*,
			       struct ndbtuple*);
char *_ndbparsetuple(char *cp, struct ndbtuple **tp);
struct ndbtuple *_ndbparseline(char *cp);
//void ndbsetmalloctag(struct ndbtuple*, uintptr_t);
static inline void ndbsetmalloctag(struct ndbtuple*t, uintptr_t v){}

static inline uintptr_t getcallerpc(void *v){return 0;}
static inline void setmalloctag(void *v){}

void _ndbcacheflush(struct ndb *db);
/* No implementation for this, dumped into a garbage file */
void setnetmtpt(char *net, int n, char *x);

__END_DECLS
