| /* |
| * This file is part of the UCB release of Plan 9. It is subject to the license |
| * terms in the LICENSE file found in the top-level directory of this |
| * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No |
| * part of the UCB release of Plan 9, including this file, may be copied, |
| * modified, propagated, or distributed except according to the terms contained |
| * in the LICENSE file. |
| */ |
| #include <stdlib.h> |
| |
| #include <stdio.h> |
| #include <parlib/parlib.h> |
| #include <unistd.h> |
| #include <signal.h> |
| #include <fcntl.h> |
| #include <ctype.h> |
| #include <iplib/iplib.h> |
| #include <ndblib/ndb.h> |
| |
| |
| /* |
| * parse a single tuple |
| */ |
| char* |
| _ndbparsetuple(char *cp, struct ndbtuple **tp) |
| { |
| char *p; |
| int len; |
| struct ndbtuple *t; |
| |
| /* a '#' starts a comment lasting till new line */ |
| while (isspace(*cp) && *cp) |
| cp++; |
| if (!*cp) |
| return 0; |
| if(*cp == '#' || *cp == '\n') |
| return 0; |
| |
| t = ndbnew(NULL, NULL); |
| *tp = t; |
| |
| /* parse attribute */ |
| p = cp; |
| while(*cp != '=' && !isspace(*cp) && *cp != '\n') |
| cp++; |
| len = cp - p; |
| if(len >= Ndbalen) |
| len = Ndbalen-1; |
| strncpy(t->attr, p, len); |
| |
| /* parse value */ |
| while (isspace(*cp) && *cp) |
| 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(!isspace(*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. |
| */ |
| struct ndbtuple* |
| _ndbparseline(char *cp) |
| { |
| struct ndbtuple *t; |
| struct 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; |
| ndbsetmalloctag(first, getcallerpc(&cp)); |
| return first; |
| } |