Blame


1 d957951b 2005-02-11 devnull #include <u.h>
2 d957951b 2005-02-11 devnull #include <libc.h>
3 d957951b 2005-02-11 devnull #include <bio.h>
4 d957951b 2005-02-11 devnull #include <ctype.h>
5 d957951b 2005-02-11 devnull #include <ndb.h>
6 d957951b 2005-02-11 devnull #include "ndbhf.h"
7 d957951b 2005-02-11 devnull
8 d957951b 2005-02-11 devnull /*
9 d957951b 2005-02-11 devnull * Parse a data base entry. Entries may span multiple
10 d957951b 2005-02-11 devnull * lines. An entry starts on a left margin. All subsequent
11 d957951b 2005-02-11 devnull * lines must be indented by white space. An entry consists
12 d957951b 2005-02-11 devnull * of tuples of the forms:
13 d957951b 2005-02-11 devnull * attribute-name
14 d957951b 2005-02-11 devnull * attribute-name=value
15 d957951b 2005-02-11 devnull * attribute-name="value with white space"
16 d957951b 2005-02-11 devnull *
17 d957951b 2005-02-11 devnull * The parsing returns a 2-dimensional structure. The first
18 d957951b 2005-02-11 devnull * dimension joins all tuples. All tuples on the same line
19 d957951b 2005-02-11 devnull * form a ring along the second dimension.
20 d957951b 2005-02-11 devnull */
21 d957951b 2005-02-11 devnull
22 d957951b 2005-02-11 devnull /*
23 d957951b 2005-02-11 devnull * parse the next entry in the file
24 d957951b 2005-02-11 devnull */
25 d957951b 2005-02-11 devnull Ndbtuple*
26 d957951b 2005-02-11 devnull ndbparse(Ndb *db)
27 d957951b 2005-02-11 devnull {
28 d957951b 2005-02-11 devnull char *line;
29 d957951b 2005-02-11 devnull Ndbtuple *t;
30 d957951b 2005-02-11 devnull Ndbtuple *first, *last;
31 d957951b 2005-02-11 devnull int len;
32 d957951b 2005-02-11 devnull
33 d957951b 2005-02-11 devnull first = last = 0;
34 d957951b 2005-02-11 devnull for(;;){
35 d957951b 2005-02-11 devnull if((line = Brdline(&db->b, '\n')) == 0)
36 d957951b 2005-02-11 devnull break;
37 d957951b 2005-02-11 devnull len = Blinelen(&db->b);
38 d957951b 2005-02-11 devnull if(line[len-1] != '\n')
39 d957951b 2005-02-11 devnull break;
40 d957951b 2005-02-11 devnull if(first && !ISWHITE(*line) && *line != '#'){
41 d957951b 2005-02-11 devnull Bseek(&db->b, -len, 1);
42 d957951b 2005-02-11 devnull break;
43 d957951b 2005-02-11 devnull }
44 d957951b 2005-02-11 devnull t = _ndbparseline(line);
45 d957951b 2005-02-11 devnull if(t == 0)
46 d957951b 2005-02-11 devnull continue;
47 d957951b 2005-02-11 devnull if(first)
48 d957951b 2005-02-11 devnull last->entry = t;
49 d957951b 2005-02-11 devnull else
50 d957951b 2005-02-11 devnull first = t;
51 d957951b 2005-02-11 devnull last = t;
52 d957951b 2005-02-11 devnull while(last->entry)
53 d957951b 2005-02-11 devnull last = last->entry;
54 d957951b 2005-02-11 devnull }
55 d957951b 2005-02-11 devnull setmalloctag(first, getcallerpc(&db));
56 d957951b 2005-02-11 devnull return first;
57 d957951b 2005-02-11 devnull }