mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
94 lines
1.5 KiB
C
94 lines
1.5 KiB
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;
|
|
}
|
|
if(first)
|
|
last->line = first;
|
|
setmalloctag(first, getcallerpc(&cp));
|
|
return first;
|
|
}
|