xref: /plan9/sys/src/libndb/ndbparse.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier #include <ctype.h>
5219b2ee8SDavid du Colombier #include <ndb.h>
63e12c5d1SDavid du Colombier #include "ndbhf.h"
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier /*
93e12c5d1SDavid du Colombier  *  Parse a data base entry.  Entries may span multiple
103e12c5d1SDavid du Colombier  *  lines.  An entry starts on a left margin.  All subsequent
113e12c5d1SDavid du Colombier  *  lines must be indented by white space.  An entry consists
123e12c5d1SDavid du Colombier  *  of tuples of the forms:
133e12c5d1SDavid du Colombier  *	attribute-name
143e12c5d1SDavid du Colombier  *	attribute-name=value
153e12c5d1SDavid du Colombier  *	attribute-name="value with white space"
163e12c5d1SDavid du Colombier  *
173e12c5d1SDavid du Colombier  *  The parsing returns a 2-dimensional structure.  The first
183e12c5d1SDavid du Colombier  *  dimension joins all tuples. All tuples on the same line
193e12c5d1SDavid du Colombier  *  form a ring along the second dimension.
203e12c5d1SDavid du Colombier  */
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier /*
233e12c5d1SDavid du Colombier  *  parse the next entry in the file
243e12c5d1SDavid du Colombier  */
253e12c5d1SDavid du Colombier Ndbtuple*
ndbparse(Ndb * db)263e12c5d1SDavid du Colombier ndbparse(Ndb *db)
273e12c5d1SDavid du Colombier {
283e12c5d1SDavid du Colombier 	char *line;
293e12c5d1SDavid du Colombier 	Ndbtuple *t;
303e12c5d1SDavid du Colombier 	Ndbtuple *first, *last;
313e12c5d1SDavid du Colombier 	int len;
323e12c5d1SDavid du Colombier 
333e12c5d1SDavid du Colombier 	first = last = 0;
343e12c5d1SDavid du Colombier 	for(;;){
35219b2ee8SDavid du Colombier 		if((line = Brdline(&db->b, '\n')) == 0)
363e12c5d1SDavid du Colombier 			break;
37219b2ee8SDavid du Colombier 		len = Blinelen(&db->b);
38bd389b36SDavid du Colombier 		if(line[len-1] != '\n')
39bd389b36SDavid du Colombier 			break;
40219b2ee8SDavid du Colombier 		if(first && !ISWHITE(*line) && *line != '#'){
41219b2ee8SDavid du Colombier 			Bseek(&db->b, -len, 1);
42a9f680aeSDavid du Colombier 			break;
433e12c5d1SDavid du Colombier 		}
44219b2ee8SDavid du Colombier 		t = _ndbparseline(line);
453e12c5d1SDavid du Colombier 		if(t == 0)
463e12c5d1SDavid du Colombier 			continue;
47*1a4050f5SDavid du Colombier 		setmalloctag(t, getcallerpc(&db));
483e12c5d1SDavid du Colombier 		if(first)
493e12c5d1SDavid du Colombier 			last->entry = t;
503e12c5d1SDavid du Colombier 		else
513e12c5d1SDavid du Colombier 			first = t;
523e12c5d1SDavid du Colombier 		last = t;
533e12c5d1SDavid du Colombier 		while(last->entry)
543e12c5d1SDavid du Colombier 			last = last->entry;
553e12c5d1SDavid du Colombier 	}
56*1a4050f5SDavid du Colombier 	ndbsetmalloctag(first, getcallerpc(&db));
573e12c5d1SDavid du Colombier 	return first;
583e12c5d1SDavid du Colombier }
59