xref: /plan9/sys/src/libndb/ndbfree.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
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