URI:
       tndbparse.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tndbparse.c (1167B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 #include <ctype.h>
            5 #include <ndb.h>
            6 #include "ndbhf.h"
            7 
            8 /*
            9  *  Parse a data base entry.  Entries may span multiple
           10  *  lines.  An entry starts on a left margin.  All subsequent
           11  *  lines must be indented by white space.  An entry consists
           12  *  of tuples of the forms:
           13  *        attribute-name
           14  *        attribute-name=value
           15  *        attribute-name="value with white space"
           16  *
           17  *  The parsing returns a 2-dimensional structure.  The first
           18  *  dimension joins all tuples. All tuples on the same line
           19  *  form a ring along the second dimension.
           20  */
           21 
           22 /*
           23  *  parse the next entry in the file
           24  */
           25 Ndbtuple*
           26 ndbparse(Ndb *db)
           27 {
           28         char *line;
           29         Ndbtuple *t;
           30         Ndbtuple *first, *last;
           31         int len;
           32 
           33         first = last = 0;
           34         for(;;){
           35                 if((line = Brdline(&db->b, '\n')) == 0)
           36                         break;
           37                 len = Blinelen(&db->b);
           38                 if(line[len-1] != '\n')
           39                         break;
           40                 if(first && !ISWHITE(*line) && *line != '#'){
           41                         Bseek(&db->b, -len, 1);
           42                         break;
           43                 }
           44                 t = _ndbparseline(line);
           45                 if(t == 0)
           46                         continue;
           47                 if(first)
           48                         last->entry = t;
           49                 else
           50                         first = t;
           51                 last = t;
           52                 while(last->entry)
           53                         last = last->entry;
           54         }
           55         setmalloctag(first, getcallerpc(&db));
           56         return first;
           57 }