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/ndbreorder.c | |
parent | ad017cfbf5530cfc3ae2fafd723cdade2a4405f6 (diff) | |
download | plan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.tar.gz plan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.tar.bz2 plan9port-d957951b75df08a9bb0293e3e13ff87759afbb92.zip |
new
Diffstat (limited to 'src/libndb/ndbreorder.c')
-rw-r--r-- | src/libndb/ndbreorder.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/libndb/ndbreorder.c b/src/libndb/ndbreorder.c new file mode 100644 index 00000000..167d0a0a --- /dev/null +++ b/src/libndb/ndbreorder.c @@ -0,0 +1,53 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include <ndb.h> + +/* + * reorder the tuple to put x's line first in the entry and x fitst in its line + */ +Ndbtuple* +ndbreorder(Ndbtuple *t, Ndbtuple *x) +{ + Ndbtuple *nt; + Ndbtuple *last, *prev; + + /* if x is first, we're done */ + if(x == t) + return t; + + /* find end of x's line */ + for(last = x; last->line == last->entry; last = last->line) + ; + + /* rotate to make this line first */ + if(last->line != t){ + + /* detach this line and everything after it from the entry */ + for(nt = t; nt->entry != last->line; nt = nt->entry) + ; + nt->entry = nil; + + /* switch */ + for(nt = last; nt->entry != nil; nt = nt->entry) + ; + nt->entry = t; + } + + /* rotate line to make x first */ + if(x != last->line){ + + /* find entry before x */ + for(prev = last; prev->line != x; prev = prev->line); + ; + + /* detach line */ + nt = last->entry; + last->entry = last->line; + + /* reattach */ + prev->entry = nt; + } + + return x; +} |