Changes user includes to <library/header.h> (XCC)
[akaros.git] / user / ndblib / ndbaux.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 #include <stdlib.h>
10
11 #include <stdio.h>
12 #include <parlib/parlib.h>
13 #include <unistd.h>
14 #include <signal.h>
15 #include <fcntl.h>
16 #include <ctype.h>
17 #include <iplib/iplib.h>
18 #include <ndblib/ndb.h>
19
20
21 /*
22  *  parse a single tuple
23  */
24 char*
25 _ndbparsetuple(char *cp, struct ndbtuple **tp)
26 {
27         char *p;
28         int len;
29         struct ndbtuple *t;
30
31         /* a '#' starts a comment lasting till new line */
32         while (isspace(*cp) && *cp)
33                 cp++;
34         if (!*cp)
35                 return 0;
36         if(*cp == '#' || *cp == '\n')
37                 return 0;
38
39         t = ndbnew(NULL, NULL);
40         *tp = t;
41
42         /* parse attribute */
43         p = cp;
44         while(*cp != '=' && !isspace(*cp) && *cp != '\n')
45                 cp++;
46         len = cp - p;
47         if(len >= Ndbalen)
48                 len = Ndbalen-1;
49         strncpy(t->attr, p, len);
50
51         /* parse value */
52         while (isspace(*cp) && *cp)
53                 cp++;
54         if(*cp == '='){
55                 cp++;
56                 if(*cp == '"'){
57                         p = ++cp;
58                         while(*cp != '\n' && *cp != '"')
59                                 cp++;
60                         len = cp - p;
61                         if(*cp == '"')
62                                 cp++;
63                 } else if(*cp == '#'){
64                         len = 0;
65                 } else {
66                         p = cp;
67                         while(!isspace(*cp) && *cp != '\n')
68                                 cp++;
69                         len = cp - p;
70                 }
71                 ndbsetval(t, p, len);
72         }
73
74         return cp;
75 }
76
77 /*
78  *  parse all tuples in a line.  we assume that the 
79  *  line ends in a '\n'.
80  *
81  *  the tuples are linked as a list using ->entry and
82  *  as a ring using ->line.
83  */
84 struct ndbtuple*
85 _ndbparseline(char *cp)
86 {
87         struct ndbtuple *t;
88         struct ndbtuple *first, *last;
89
90         first = last = 0;
91         while(*cp != '#' && *cp != '\n'){
92                 t = 0;
93                 cp = _ndbparsetuple(cp, &t);
94                 if(cp == 0)
95                         break;
96                 if(first){
97                         last->line = t;
98                         last->entry = t;
99                 } else
100                         first = t;
101                 last = t;
102                 t->line = 0;
103                 t->entry = 0;
104         }
105         if(first)
106                 last->line = first;
107         ndbsetmalloctag(first, getcallerpc(&cp));
108         return first;
109 }