|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bio.h> | 
|  | #include <ctype.h> | 
|  | #include <ndb.h> | 
|  | #include "ndbhf.h" | 
|  |  | 
|  | /* | 
|  | *  free a parsed entry | 
|  | */ | 
|  | void | 
|  | ndbfree(Ndbtuple *t) | 
|  | { | 
|  | Ndbtuple *tn; | 
|  |  | 
|  | for(; t; t = tn){ | 
|  | tn = t->entry; | 
|  | if(t->val != t->valbuf){ | 
|  | free(t->val); | 
|  | } | 
|  | free(t); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* | 
|  | *  set a value in a tuple | 
|  | */ | 
|  | void | 
|  | ndbsetval(Ndbtuple *t, char *val, int n) | 
|  | { | 
|  | if(n < Ndbvlen){ | 
|  | if(t->val != t->valbuf){ | 
|  | free(t->val); | 
|  | t->val = t->valbuf; | 
|  | } | 
|  | } else { | 
|  | if(t->val != t->valbuf) | 
|  | t->val = realloc(t->val, n+1); | 
|  | else | 
|  | t->val = malloc(n+1); | 
|  | if(t->val == nil) | 
|  | sysfatal("ndbsetval %r"); | 
|  | } | 
|  | strncpy(t->val, val, n); | 
|  | t->val[n] = 0; | 
|  | } | 
|  |  | 
|  | /* | 
|  | *  allocate a tuple | 
|  | */ | 
|  | Ndbtuple* | 
|  | ndbnew(char *attr, char *val) | 
|  | { | 
|  | Ndbtuple *t; | 
|  |  | 
|  | t = mallocz(sizeof(*t), 1); | 
|  | if(t == nil) | 
|  | sysfatal("ndbnew %r"); | 
|  | if(attr != nil) | 
|  | strncpy(t->attr, attr, sizeof(t->attr)-1); | 
|  | t->val = t->valbuf; | 
|  | if(val != nil) | 
|  | ndbsetval(t, val, strlen(val)); | 
|  | return t; | 
|  | } |