Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <ctype.h>5 #include <ndb.h>6 #include "ndbhf.h"9 /*10 * parse a single tuple11 */12 char*13 _ndbparsetuple(char *cp, Ndbtuple **tp)14 {15 char *p;16 int len;17 Ndbtuple *t;19 /* a '#' starts a comment lasting till new line */20 EATWHITE(cp);21 if(*cp == '#' || *cp == '\n')22 return 0;24 t = ndbnew(nil, nil);25 setmalloctag(t, getcallerpc(&cp));26 *tp = t;28 /* parse attribute */29 p = cp;30 while(*cp != '=' && !ISWHITE(*cp) && *cp != '\n')31 cp++;32 len = cp - p;33 if(len >= Ndbalen)34 len = Ndbalen-1;35 strncpy(t->attr, p, len);37 /* parse value */38 EATWHITE(cp);39 if(*cp == '='){40 cp++;41 if(*cp == '"'){42 p = ++cp;43 while(*cp != '\n' && *cp != '"')44 cp++;45 len = cp - p;46 if(*cp == '"')47 cp++;48 } else if(*cp == '#'){49 len = 0;50 } else {51 p = cp;52 while(!ISWHITE(*cp) && *cp != '\n')53 cp++;54 len = cp - p;55 }56 ndbsetval(t, p, len);57 }59 return cp;60 }62 /*63 * parse all tuples in a line. we assume that the64 * line ends in a '\n'.65 *66 * the tuples are linked as a list using ->entry and67 * as a ring using ->line.68 */69 Ndbtuple*70 _ndbparseline(char *cp)71 {72 Ndbtuple *t;73 Ndbtuple *first, *last;75 first = last = 0;76 while(*cp != '#' && *cp != '\n'){77 t = 0;78 cp = _ndbparsetuple(cp, &t);79 if(cp == 0)80 break;81 if(first){82 last->line = t;83 last->entry = t;84 } else85 first = t;86 last = t;87 t->line = 0;88 t->entry = 0;89 }90 if(first)91 last->line = first;92 setmalloctag(first, getcallerpc(&cp));93 return first;94 }