#include <u.h> | |
#include <libc.h> | |
#include <bio.h> | |
#include <ndb.h> | |
/* replace a in t with b, the line structure in b is lost, c'est la vie */ | |
Ndbtuple* | |
ndbsubstitute(Ndbtuple *t, Ndbtuple *a, Ndbtuple *b) | |
{ | |
Ndbtuple *nt; | |
if(a == b) | |
return t; | |
if(b == nil) | |
return ndbdiscard(t, a); | |
/* all pointers to a become pointers to b */ | |
for(nt = t; nt != nil; nt = nt->entry){ | |
if(nt->line == a) | |
nt->line = b; | |
if(nt->entry == a) | |
nt->entry = b; | |
} | |
/* end of b chain points to a's successors */ | |
for(nt = b; nt->entry; nt = nt->entry){ | |
nt->line = nt->entry; | |
} | |
nt->line = a->line; | |
nt->entry = a->entry; | |
a->entry = nil; | |
ndbfree(a); | |
if(a == t) | |
return b; | |
else | |
return t; | |
} |