ref: a3f2d6d23ed1be69fee607bdedadc0438fd01305
dir: /sys/src/libndb/ndbaux.c/
#include <u.h> #include <libc.h> #include <bio.h> #include <ctype.h> #include <ndb.h> #include "ndbhf.h" /* * parse a single tuple */ char* _ndbparsetuple(char *cp, Ndbtuple **tp) { char *p; int len; Ndbtuple *t; /* a '#' starts a comment lasting till new line */ EATWHITE(cp); if(*cp == '#' || *cp == '\n') return 0; t = ndbnew(nil, nil); setmalloctag(t, getcallerpc(&cp)); *tp = t; /* parse attribute */ p = cp; while(*cp != '=' && !ISWHITE(*cp) && *cp != '\n') cp++; len = cp - p; if(len >= Ndbalen) len = Ndbalen-1; strncpy(t->attr, p, len); /* parse value */ EATWHITE(cp); if(*cp == '='){ cp++; if(*cp == '"'){ p = ++cp; while(*cp != '\n' && *cp != '"') cp++; len = cp - p; if(*cp == '"') cp++; } else if(*cp == '#'){ len = 0; } else { p = cp; while(!ISWHITE(*cp) && *cp != '\n') cp++; len = cp - p; } ndbsetval(t, p, len); } return cp; } /* * parse all tuples in a line. we assume that the * line ends in a '\n'. * * the tuples are linked as a list using ->entry and * as a ring using ->line. */ Ndbtuple* _ndbparseline(char *cp) { Ndbtuple *t; Ndbtuple *first, *last; first = last = 0; while(*cp != '#' && *cp != '\n'){ t = 0; cp = _ndbparsetuple(cp, &t); if(cp == 0) break; if(first){ last->line = t; last->entry = t; } else first = t; last = t; t->line = 0; t->entry = 0; setmalloctag(t, getcallerpc(&cp)); } if(first) last->line = first; ndbsetmalloctag(first, getcallerpc(&cp)); return first; }