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 Colombierndbparse(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