Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5 #include <ndb.h>
6 #include "ndbhf.h"
9 /*
10 * parse a single tuple
11 */
12 char*
13 _ndbparsetuple(char *cp, Ndbtuple **tp)
14 {
15 char *p;
16 int len;
17 Ndbtuple *t;
19 /* a '#' starts a comment lasting till new line */
20 EATWHITE(cp);
21 if(*cp == '#' || *cp == '\n')
22 return 0;
24 t = ndbnew(nil, nil);
25 setmalloctag(t, getcallerpc(&cp));
26 *tp = t;
28 /* parse attribute */
29 p = cp;
30 while(*cp != '=' && !ISWHITE(*cp) && *cp != '\n')
31 cp++;
32 len = cp - p;
33 if(len >= Ndbalen)
34 len = Ndbalen-1;
35 strncpy(t->attr, p, len);
37 /* parse value */
38 EATWHITE(cp);
39 if(*cp == '='){
40 cp++;
41 if(*cp == '"'){
42 p = ++cp;
43 while(*cp != '\n' && *cp != '"')
44 cp++;
45 len = cp - p;
46 if(*cp == '"')
47 cp++;
48 } else if(*cp == '#'){
49 len = 0;
50 } else {
51 p = cp;
52 while(!ISWHITE(*cp) && *cp != '\n')
53 cp++;
54 len = cp - p;
55 }
56 ndbsetval(t, p, len);
57 }
59 return cp;
60 }
62 /*
63 * parse all tuples in a line. we assume that the
64 * line ends in a '\n'.
65 *
66 * the tuples are linked as a list using ->entry and
67 * as a ring using ->line.
68 */
69 Ndbtuple*
70 _ndbparseline(char *cp)
71 {
72 Ndbtuple *t;
73 Ndbtuple *first, *last;
75 first = last = 0;
76 while(*cp != '#' && *cp != '\n'){
77 t = 0;
78 cp = _ndbparsetuple(cp, &t);
79 if(cp == 0)
80 break;
81 if(first){
82 last->line = t;
83 last->entry = t;
84 } else
85 first = t;
86 last = t;
87 t->line = 0;
88 t->entry = 0;
89 }
90 if(first)
91 last->line = first;
92 setmalloctag(first, getcallerpc(&cp));
93 return first;
94 }