1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include <ctype.h>
5219b2ee8SDavid du Colombier #include <ndb.h>
6219b2ee8SDavid du Colombier #include "ndbhf.h"
7219b2ee8SDavid du Colombier
8219b2ee8SDavid du Colombier /*
9219b2ee8SDavid du Colombier * free a parsed entry
10219b2ee8SDavid du Colombier */
11219b2ee8SDavid du Colombier void
ndbfree(Ndbtuple * t)12219b2ee8SDavid du Colombier ndbfree(Ndbtuple *t)
13219b2ee8SDavid du Colombier {
14219b2ee8SDavid du Colombier Ndbtuple *tn;
15219b2ee8SDavid du Colombier
16219b2ee8SDavid du Colombier for(; t; t = tn){
17219b2ee8SDavid du Colombier tn = t->entry;
1895a264b3SDavid du Colombier if(t->val != t->valbuf){
1995a264b3SDavid du Colombier free(t->val);
2095a264b3SDavid du Colombier }
21219b2ee8SDavid du Colombier free(t);
22219b2ee8SDavid du Colombier }
23219b2ee8SDavid du Colombier }
2495a264b3SDavid du Colombier
2595a264b3SDavid du Colombier /*
2695a264b3SDavid du Colombier * set a value in a tuple
2795a264b3SDavid du Colombier */
2895a264b3SDavid du Colombier void
ndbsetval(Ndbtuple * t,char * val,int n)2995a264b3SDavid du Colombier ndbsetval(Ndbtuple *t, char *val, int n)
3095a264b3SDavid du Colombier {
3195a264b3SDavid du Colombier if(n < Ndbvlen){
3295a264b3SDavid du Colombier if(t->val != t->valbuf){
3395a264b3SDavid du Colombier free(t->val);
3495a264b3SDavid du Colombier t->val = t->valbuf;
3595a264b3SDavid du Colombier }
3695a264b3SDavid du Colombier } else {
3795a264b3SDavid du Colombier if(t->val != t->valbuf)
3895a264b3SDavid du Colombier t->val = realloc(t->val, n+1);
3995a264b3SDavid du Colombier else
4095a264b3SDavid du Colombier t->val = malloc(n+1);
4195a264b3SDavid du Colombier if(t->val == nil)
4295a264b3SDavid du Colombier sysfatal("ndbsetval %r");
4395a264b3SDavid du Colombier }
4495a264b3SDavid du Colombier strncpy(t->val, val, n);
4595a264b3SDavid du Colombier t->val[n] = 0;
4695a264b3SDavid du Colombier }
4795a264b3SDavid du Colombier
4895a264b3SDavid du Colombier /*
4995a264b3SDavid du Colombier * allocate a tuple
5095a264b3SDavid du Colombier */
5195a264b3SDavid du Colombier Ndbtuple*
ndbnew(char * attr,char * val)5295a264b3SDavid du Colombier ndbnew(char *attr, char *val)
5395a264b3SDavid du Colombier {
5495a264b3SDavid du Colombier Ndbtuple *t;
5595a264b3SDavid du Colombier
5695a264b3SDavid du Colombier t = mallocz(sizeof(*t), 1);
5795a264b3SDavid du Colombier if(t == nil)
5895a264b3SDavid du Colombier sysfatal("ndbnew %r");
5995a264b3SDavid du Colombier if(attr != nil)
6095a264b3SDavid du Colombier strncpy(t->attr, attr, sizeof(t->attr)-1);
6195a264b3SDavid du Colombier t->val = t->valbuf;
6295a264b3SDavid du Colombier if(val != nil)
6395a264b3SDavid du Colombier ndbsetval(t, val, strlen(val));
64*1a4050f5SDavid du Colombier ndbsetmalloctag(t, getcallerpc(&attr));
6595a264b3SDavid du Colombier return t;
6695a264b3SDavid du Colombier }
67*1a4050f5SDavid du Colombier
68*1a4050f5SDavid du Colombier /*
69*1a4050f5SDavid du Colombier * set owner of a tuple
70*1a4050f5SDavid du Colombier */
71*1a4050f5SDavid du Colombier void
ndbsetmalloctag(Ndbtuple * t,uintptr tag)72*1a4050f5SDavid du Colombier ndbsetmalloctag(Ndbtuple *t, uintptr tag)
73*1a4050f5SDavid du Colombier {
74*1a4050f5SDavid du Colombier for(; t; t=t->entry)
75*1a4050f5SDavid du Colombier setmalloctag(t, tag);
76*1a4050f5SDavid du Colombier }
77