xref: /plan9/sys/src/libndb/ndbaux.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include <ctype.h>
5219b2ee8SDavid du Colombier #include <ndb.h>
6219b2ee8SDavid du Colombier #include "ndbhf.h"
7219b2ee8SDavid du Colombier 
8219b2ee8SDavid du Colombier 
9219b2ee8SDavid du Colombier /*
10219b2ee8SDavid du Colombier  *  parse a single tuple
11219b2ee8SDavid du Colombier  */
12219b2ee8SDavid du Colombier char*
_ndbparsetuple(char * cp,Ndbtuple ** tp)13219b2ee8SDavid du Colombier _ndbparsetuple(char *cp, Ndbtuple **tp)
14219b2ee8SDavid du Colombier {
15219b2ee8SDavid du Colombier 	char *p;
16219b2ee8SDavid du Colombier 	int len;
17219b2ee8SDavid du Colombier 	Ndbtuple *t;
18219b2ee8SDavid du Colombier 
19219b2ee8SDavid du Colombier 	/* a '#' starts a comment lasting till new line */
20219b2ee8SDavid du Colombier 	EATWHITE(cp);
21219b2ee8SDavid du Colombier 	if(*cp == '#' || *cp == '\n')
22219b2ee8SDavid du Colombier 		return 0;
23219b2ee8SDavid du Colombier 
2495a264b3SDavid du Colombier 	t = ndbnew(nil, nil);
25a9f680aeSDavid du Colombier 	setmalloctag(t, getcallerpc(&cp));
26219b2ee8SDavid du Colombier 	*tp = t;
27219b2ee8SDavid du Colombier 
28219b2ee8SDavid du Colombier 	/* parse attribute */
29219b2ee8SDavid du Colombier 	p = cp;
30219b2ee8SDavid du Colombier 	while(*cp != '=' && !ISWHITE(*cp) && *cp != '\n')
31219b2ee8SDavid du Colombier 		cp++;
32219b2ee8SDavid du Colombier 	len = cp - p;
33219b2ee8SDavid du Colombier 	if(len >= Ndbalen)
3408fd2d13SDavid du Colombier 		len = Ndbalen-1;
35219b2ee8SDavid du Colombier 	strncpy(t->attr, p, len);
36219b2ee8SDavid du Colombier 
37219b2ee8SDavid du Colombier 	/* parse value */
38219b2ee8SDavid du Colombier 	EATWHITE(cp);
39219b2ee8SDavid du Colombier 	if(*cp == '='){
40219b2ee8SDavid du Colombier 		cp++;
41219b2ee8SDavid du Colombier 		if(*cp == '"'){
42219b2ee8SDavid du Colombier 			p = ++cp;
43219b2ee8SDavid du Colombier 			while(*cp != '\n' && *cp != '"')
44219b2ee8SDavid du Colombier 				cp++;
45219b2ee8SDavid du Colombier 			len = cp - p;
46219b2ee8SDavid du Colombier 			if(*cp == '"')
47219b2ee8SDavid du Colombier 				cp++;
487dd7cddfSDavid du Colombier 		} else if(*cp == '#'){
497dd7cddfSDavid du Colombier 			len = 0;
50219b2ee8SDavid du Colombier 		} else {
51219b2ee8SDavid du Colombier 			p = cp;
52219b2ee8SDavid du Colombier 			while(!ISWHITE(*cp) && *cp != '\n')
53219b2ee8SDavid du Colombier 				cp++;
54219b2ee8SDavid du Colombier 			len = cp - p;
55219b2ee8SDavid du Colombier 		}
5695a264b3SDavid du Colombier 		ndbsetval(t, p, len);
57219b2ee8SDavid du Colombier 	}
58219b2ee8SDavid du Colombier 
59219b2ee8SDavid du Colombier 	return cp;
60219b2ee8SDavid du Colombier }
61219b2ee8SDavid du Colombier 
62219b2ee8SDavid du Colombier /*
63219b2ee8SDavid du Colombier  *  parse all tuples in a line.  we assume that the
64219b2ee8SDavid du Colombier  *  line ends in a '\n'.
65219b2ee8SDavid du Colombier  *
66219b2ee8SDavid du Colombier  *  the tuples are linked as a list using ->entry and
67219b2ee8SDavid du Colombier  *  as a ring using ->line.
68219b2ee8SDavid du Colombier  */
69219b2ee8SDavid du Colombier Ndbtuple*
_ndbparseline(char * cp)70219b2ee8SDavid du Colombier _ndbparseline(char *cp)
71219b2ee8SDavid du Colombier {
72219b2ee8SDavid du Colombier 	Ndbtuple *t;
73219b2ee8SDavid du Colombier 	Ndbtuple *first, *last;
74219b2ee8SDavid du Colombier 
75219b2ee8SDavid du Colombier 	first = last = 0;
76219b2ee8SDavid du Colombier 	while(*cp != '#' && *cp != '\n'){
77219b2ee8SDavid du Colombier 		t = 0;
78219b2ee8SDavid du Colombier 		cp = _ndbparsetuple(cp, &t);
79219b2ee8SDavid du Colombier 		if(cp == 0)
80219b2ee8SDavid du Colombier 			break;
81219b2ee8SDavid du Colombier 		if(first){
82219b2ee8SDavid du Colombier 			last->line = t;
83219b2ee8SDavid du Colombier 			last->entry = t;
84219b2ee8SDavid du Colombier 		} else
85219b2ee8SDavid du Colombier 			first = t;
86219b2ee8SDavid du Colombier 		last = t;
87219b2ee8SDavid du Colombier 		t->line = 0;
88219b2ee8SDavid du Colombier 		t->entry = 0;
89*1a4050f5SDavid du Colombier 		setmalloctag(t, getcallerpc(&cp));
90219b2ee8SDavid du Colombier 	}
91219b2ee8SDavid du Colombier 	if(first)
92219b2ee8SDavid du Colombier 		last->line = first;
93*1a4050f5SDavid du Colombier 	ndbsetmalloctag(first, getcallerpc(&cp));
94219b2ee8SDavid du Colombier 	return first;
95219b2ee8SDavid du Colombier }
96