]> git.lizzy.rs Git - plan9front.git/blob - sys/include/ndb.h
aux/cpuid: decode family and model bitfields
[plan9front.git] / sys / include / ndb.h
1 #pragma src     "/sys/src/libndb"
2 #pragma lib     "libndb.a"
3
4 /*
5  *  this include file requires includes of <u.h> and <bio.h>
6  */
7 typedef struct Ndb      Ndb;
8 typedef struct Ndbtuple Ndbtuple;
9 typedef struct Ndbhf    Ndbhf;
10 typedef struct Ndbs     Ndbs;
11 typedef struct Ndbcache Ndbcache;
12
13 #pragma incomplete Ndbhf
14 #pragma incomplete Ndbcache
15
16 enum
17 {
18         Ndbalen=        32,     /* max attribute length */
19         Ndbvlen=        64,     /* max value length */
20 };
21
22 /*
23  *  the database
24  */
25 struct Ndb
26 {
27         Ndb             *next;
28
29         Biobufhdr       b;              /* buffered input file */
30         uchar           buf[256];       /* and its buffer */
31
32         ulong           mtime;          /* mtime of db file */
33         Qid             qid;            /* qid of db file */
34         char            file[128];      /* path name of db file */
35         ulong           length;         /* length of db file */
36
37         int             nohash;         /* don't look for hash files */
38         Ndbhf           *hf;            /* open hash files */
39
40         int             ncache;         /* size of tuple cache */
41         Ndbcache        *cache;         /* cached entries */
42 };
43
44 /*
45  *  a parsed entry, doubly linked
46  */
47 struct Ndbtuple
48 {
49         char            attr[Ndbalen];          /* attribute name */
50         char            *val;                   /* value(s) */
51         Ndbtuple        *entry;                 /* next tuple in this entry */
52         Ndbtuple        *line;                  /* next tuple on this line */
53         ulong           ptr;                    /* (for the application - starts 0) */
54         char            valbuf[Ndbvlen];        /* initial allocation for value */
55 };
56
57 /*
58  *  each hash file is of the form
59  *
60  *              +---------------------------------------+
61  *              |       mtime of db file (4 bytes)      |
62  *              +---------------------------------------+
63  *              |  size of table (in entries - 4 bytes) |
64  *              +---------------------------------------+
65  *              |               hash table              |
66  *              +---------------------------------------+
67  *              |               hash chains             |
68  *              +---------------------------------------+
69  *
70  *  hash collisions are resolved using chained entries added to the
71  *  the end of the hash table.
72  *
73  *  Hash entries are of the form
74  *
75  *              +-------------------------------+
76  *              |       offset  (3 bytes)       |
77  *              +-------------------------------+
78  *
79  *  Chain entries are of the form
80  *
81  *              +-------------------------------+
82  *              |       offset1 (3 bytes)       |
83  *              +-------------------------------+
84  *              |       offset2 (3 bytes)       |
85  *              +-------------------------------+
86  *
87  *  The top bit of an offset set to 1 indicates a pointer to a hash chain entry.
88  */
89 #define NDBULLEN        4               /* unsigned long length in bytes */
90 #define NDBPLEN         3               /* pointer length in bytes */
91 #define NDBHLEN         (2*NDBULLEN)    /* hash file header length in bytes */
92
93 /*
94  *  finger pointing to current point in a search
95  */
96 struct Ndbs
97 {
98         Ndb     *db;    /* data base file being searched */
99         Ndbhf   *hf;    /* hash file being searched */
100         int     type;
101         ulong   ptr;    /* current pointer */
102         ulong   ptr1;   /* next pointer */
103         Ndbtuple *t;    /* last attribute value pair found */
104 };
105
106 /*
107  *  bit defs for pointers in hash files
108  */
109 #define NDBSPEC         (1<<23)
110 #define NDBCHAIN        NDBSPEC         /* points to a collision chain */
111 #define NDBNAP          (NDBSPEC|1)     /* not a pointer */
112
113 /*
114  *  macros for packing and unpacking pointers
115  */
116 #define NDBPUTP(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; }
117 #define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16))
118
119 /*
120  *  macros for packing and unpacking unsigned longs
121  */
122 #define NDBPUTUL(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; (a)[3] = (v)>>24; }
123 #define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24))
124
125 #define NDB_IPlen 16
126
127 Ndbtuple*       csgetval(char*, char*, char*, char*, char*);
128 char*           csgetvalue(char*, char*, char*, char*, Ndbtuple**);
129 Ndbtuple*       csipinfo(char*, char*, char*, char**, int);
130 Ndbtuple*       dnsquery(char*, char*, char*);
131 char*           ipattr(char*);
132 Ndb*            ndbcat(Ndb*, Ndb*);
133 int             ndbchanged(Ndb*);
134 void            ndbclose(Ndb*);
135 Ndbtuple*       ndbconcatenate(Ndbtuple*, Ndbtuple*);
136 Ndbtuple*       ndbdiscard(Ndbtuple*, Ndbtuple*);
137 void            ndbfree(Ndbtuple*);
138 Ndbtuple*       ndbgetipaddr(Ndb*, char*);
139 Ndbtuple*       ndbgetval(Ndb*, Ndbs*, char*, char*, char*, char*);
140 char*           ndbgetvalue(Ndb*, Ndbs*, char*, char*, char*, Ndbtuple**);
141 Ndbtuple*       ndbfindattr(Ndbtuple*, Ndbtuple*, char*);
142 ulong           ndbhash(char*, int);
143 Ndbtuple*       ndbipinfo(Ndb*, char*, char*, char**, int);
144 Ndbtuple*       ndblookval(Ndbtuple*, Ndbtuple*, char*, char*);
145 Ndbtuple*       ndbnew(char*, char*);
146 Ndb*            ndbopen(char*);
147 Ndbtuple*       ndbparse(Ndb*);
148 int             ndbreopen(Ndb*);
149 Ndbtuple*       ndbreorder(Ndbtuple*, Ndbtuple*);
150 Ndbtuple*       ndbsearch(Ndb*, Ndbs*, char*, char*);
151 void            ndbsetval(Ndbtuple*, char*, int);
152 Ndbtuple*       ndbsnext(Ndbs*, char*, char*);
153 Ndbtuple*       ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*);
154 void            ndbsetmalloctag(Ndbtuple*, uintptr);