diff options
| author | rsc <devnull@localhost> | 2005-02-11 19:41:16 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2005-02-11 19:41:16 +0000 |
| commit | d957951b75df08a9bb0293e3e13ff87759afbb92 (patch) | |
| tree | 4d7868b0d223956217cbc8819d7afb3bec532cca /src/libndb/ndbsubstitute.c | |
| parent | ad017cfbf5530cfc3ae2fafd723cdade2a4405f6 (diff) | |
| download | plan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.tar.gz plan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.zip | |
new
Diffstat (limited to 'src/libndb/ndbsubstitute.c')
| -rw-r--r-- | src/libndb/ndbsubstitute.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/libndb/ndbsubstitute.c b/src/libndb/ndbsubstitute.c new file mode 100644 index 00000000..46f63712 --- /dev/null +++ b/src/libndb/ndbsubstitute.c @@ -0,0 +1,39 @@ +#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; +} |
