ref: a8f8de1cdeec7f9bee287c137b576e0249e8df82
dir: /sys/src/libndb/ndbsubstitute.c/
#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){ ndbsetmalloctag(t, getcallerpc(&t)); return t; } if(b == nil){ t = ndbdiscard(t, a); ndbsetmalloctag(t, getcallerpc(&t)); return t; } /* 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){ ndbsetmalloctag(b, getcallerpc(&t)); return b; }else{ ndbsetmalloctag(t, getcallerpc(&t)); return t; } }