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 /*
10 d957951b 2005-02-11 devnull * parse a single tuple
11 d957951b 2005-02-11 devnull */
12 d957951b 2005-02-11 devnull char*
13 d957951b 2005-02-11 devnull _ndbparsetuple(char *cp, Ndbtuple **tp)
14 d957951b 2005-02-11 devnull {
15 d957951b 2005-02-11 devnull char *p;
16 d957951b 2005-02-11 devnull int len;
17 d957951b 2005-02-11 devnull Ndbtuple *t;
18 d957951b 2005-02-11 devnull
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;
23 d957951b 2005-02-11 devnull
24 d957951b 2005-02-11 devnull t = ndbnew(nil, nil);
25 d957951b 2005-02-11 devnull setmalloctag(t, getcallerpc(&cp));
26 d957951b 2005-02-11 devnull *tp = t;
27 d957951b 2005-02-11 devnull
28 d957951b 2005-02-11 devnull /* parse attribute */
29 d957951b 2005-02-11 devnull p = cp;
30 d957951b 2005-02-11 devnull while(*cp != '=' && !ISWHITE(*cp) && *cp != '\n')
31 d957951b 2005-02-11 devnull cp++;
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);
36 d957951b 2005-02-11 devnull
37 d957951b 2005-02-11 devnull /* parse value */
38 d957951b 2005-02-11 devnull EATWHITE(cp);
39 d957951b 2005-02-11 devnull if(*cp == '='){
40 d957951b 2005-02-11 devnull 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 != '"')
44 d957951b 2005-02-11 devnull cp++;
45 d957951b 2005-02-11 devnull len = cp - p;
46 d957951b 2005-02-11 devnull if(*cp == '"')
47 d957951b 2005-02-11 devnull cp++;
48 d957951b 2005-02-11 devnull } else if(*cp == '#'){
49 d957951b 2005-02-11 devnull len = 0;
50 d957951b 2005-02-11 devnull } else {
51 d957951b 2005-02-11 devnull p = cp;
52 d957951b 2005-02-11 devnull while(!ISWHITE(*cp) && *cp != '\n')
53 d957951b 2005-02-11 devnull cp++;
54 d957951b 2005-02-11 devnull len = cp - p;
55 d957951b 2005-02-11 devnull }
56 d957951b 2005-02-11 devnull ndbsetval(t, p, len);
57 d957951b 2005-02-11 devnull }
58 d957951b 2005-02-11 devnull
59 d957951b 2005-02-11 devnull return cp;
60 d957951b 2005-02-11 devnull }
61 d957951b 2005-02-11 devnull
62 d957951b 2005-02-11 devnull /*
63 fa325e9b 2020-01-10 cross * parse all tuples in a line. we assume that the
64 d957951b 2005-02-11 devnull * line ends in a '\n'.
65 d957951b 2005-02-11 devnull *
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.
68 d957951b 2005-02-11 devnull */
69 d957951b 2005-02-11 devnull Ndbtuple*
70 d957951b 2005-02-11 devnull _ndbparseline(char *cp)
71 d957951b 2005-02-11 devnull {
72 d957951b 2005-02-11 devnull Ndbtuple *t;
73 d957951b 2005-02-11 devnull Ndbtuple *first, *last;
74 d957951b 2005-02-11 devnull
75 d957951b 2005-02-11 devnull first = last = 0;
76 d957951b 2005-02-11 devnull while(*cp != '#' && *cp != '\n'){
77 d957951b 2005-02-11 devnull t = 0;
78 d957951b 2005-02-11 devnull cp = _ndbparsetuple(cp, &t);
79 d957951b 2005-02-11 devnull if(cp == 0)
80 d957951b 2005-02-11 devnull break;
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;
84 d957951b 2005-02-11 devnull } else
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;
89 d957951b 2005-02-11 devnull }
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;
94 d957951b 2005-02-11 devnull }