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"
10 d957951b 2005-02-11 devnull * parse a single tuple
13 d957951b 2005-02-11 devnull _ndbparsetuple(char *cp, Ndbtuple **tp)
17 d957951b 2005-02-11 devnull Ndbtuple *t;
19 d957951b 2005-02-11 devnull /* a '#' starts a comment lasting till new line */
20 d957951b 2005-02-11 devnull EATWHITE(cp);
21 d957951b 2005-02-11 devnull if(*cp == '#' || *cp == '\n')
22 d957951b 2005-02-11 devnull return 0;
24 d957951b 2005-02-11 devnull t = ndbnew(nil, nil);
25 d957951b 2005-02-11 devnull setmalloctag(t, getcallerpc(&cp));
28 d957951b 2005-02-11 devnull /* parse attribute */
30 d957951b 2005-02-11 devnull while(*cp != '=' && !ISWHITE(*cp) && *cp != '\n')
32 d957951b 2005-02-11 devnull len = cp - p;
33 d957951b 2005-02-11 devnull if(len >= Ndbalen)
34 d957951b 2005-02-11 devnull len = Ndbalen-1;
35 d957951b 2005-02-11 devnull strncpy(t->attr, p, len);
37 d957951b 2005-02-11 devnull /* parse value */
38 d957951b 2005-02-11 devnull EATWHITE(cp);
39 d957951b 2005-02-11 devnull if(*cp == '='){
41 d957951b 2005-02-11 devnull if(*cp == '"'){
42 d957951b 2005-02-11 devnull p = ++cp;
43 d957951b 2005-02-11 devnull while(*cp != '\n' && *cp != '"')
45 d957951b 2005-02-11 devnull len = cp - p;
46 d957951b 2005-02-11 devnull if(*cp == '"')
48 d957951b 2005-02-11 devnull } else if(*cp == '#'){
52 d957951b 2005-02-11 devnull while(!ISWHITE(*cp) && *cp != '\n')
54 d957951b 2005-02-11 devnull len = cp - p;
56 d957951b 2005-02-11 devnull ndbsetval(t, p, len);
59 d957951b 2005-02-11 devnull return cp;
63 d957951b 2005-02-11 devnull * parse all tuples in a line. we assume that the
64 d957951b 2005-02-11 devnull * line ends in a '\n'.
66 d957951b 2005-02-11 devnull * the tuples are linked as a list using ->entry and
67 d957951b 2005-02-11 devnull * as a ring using ->line.
69 d957951b 2005-02-11 devnull Ndbtuple*
70 d957951b 2005-02-11 devnull _ndbparseline(char *cp)
72 d957951b 2005-02-11 devnull Ndbtuple *t;
73 d957951b 2005-02-11 devnull Ndbtuple *first, *last;
75 d957951b 2005-02-11 devnull first = last = 0;
76 d957951b 2005-02-11 devnull while(*cp != '#' && *cp != '\n'){
78 d957951b 2005-02-11 devnull cp = _ndbparsetuple(cp, &t);
79 d957951b 2005-02-11 devnull if(cp == 0)
81 d957951b 2005-02-11 devnull if(first){
82 d957951b 2005-02-11 devnull last->line = t;
83 d957951b 2005-02-11 devnull last->entry = t;
85 d957951b 2005-02-11 devnull first = t;
86 d957951b 2005-02-11 devnull last = t;
87 d957951b 2005-02-11 devnull t->line = 0;
88 d957951b 2005-02-11 devnull t->entry = 0;
90 d957951b 2005-02-11 devnull if(first)
91 d957951b 2005-02-11 devnull last->line = first;
92 d957951b 2005-02-11 devnull setmalloctag(first, getcallerpc(&cp));
93 d957951b 2005-02-11 devnull return first;