1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #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;
- }
|