/* * 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()); *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; }
/* * allocate a tuple */ struct ndbtuple* ndbnew(char *attr, char *val) { struct ndbtuple *t; t = calloc(1, sizeof(*t)); if(t == NULL){ fprintf(stderr, "ndbnew %r"); exit(1); } if(attr != NULL) strncpy(t->attr, attr, sizeof(t->attr)-1); t->val = t->valbuf; if(val != NULL) ndbsetval(t, val, strlen(val)); ndbsetmalloctag(t, getcallerpc(&attr)); return t; }