#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; | |
} | |
if(first) | |
last->line = first; | |
setmalloctag(first, getcallerpc(&cp)); | |
return first; | |
} |