xref: /plan9/sys/src/libndb/ndbreorder.c (revision 95a264b3d2508e9e4f5589ac908b62aedc5a9755)
1*95a264b3SDavid du Colombier #include <u.h>
2*95a264b3SDavid du Colombier #include <libc.h>
3*95a264b3SDavid du Colombier #include <bio.h>
4*95a264b3SDavid du Colombier #include <ndb.h>
5*95a264b3SDavid du Colombier 
6*95a264b3SDavid du Colombier /*
7*95a264b3SDavid du Colombier  *  reorder the tuple to put x's line first in the entry and x fitst in its line
8*95a264b3SDavid du Colombier  */
9*95a264b3SDavid du Colombier Ndbtuple*
ndbreorder(Ndbtuple * t,Ndbtuple * x)10*95a264b3SDavid du Colombier ndbreorder(Ndbtuple *t, Ndbtuple *x)
11*95a264b3SDavid du Colombier {
12*95a264b3SDavid du Colombier 	Ndbtuple *nt;
13*95a264b3SDavid du Colombier 	Ndbtuple *last, *prev;
14*95a264b3SDavid du Colombier 
15*95a264b3SDavid du Colombier 	/* if x is first, we're done */
16*95a264b3SDavid du Colombier 	if(x == t)
17*95a264b3SDavid du Colombier 		return t;
18*95a264b3SDavid du Colombier 
19*95a264b3SDavid du Colombier 	/* find end of x's line */
20*95a264b3SDavid du Colombier 	for(last = x; last->line == last->entry; last = last->line)
21*95a264b3SDavid du Colombier 		;
22*95a264b3SDavid du Colombier 
23*95a264b3SDavid du Colombier 	/* rotate to make this line first */
24*95a264b3SDavid du Colombier 	if(last->line != t){
25*95a264b3SDavid du Colombier 
26*95a264b3SDavid du Colombier 		/* detach this line and everything after it from the entry */
27*95a264b3SDavid du Colombier 		for(nt = t; nt->entry != last->line; nt = nt->entry)
28*95a264b3SDavid du Colombier 			;
29*95a264b3SDavid du Colombier 		nt->entry = nil;
30*95a264b3SDavid du Colombier 
31*95a264b3SDavid du Colombier 		/* switch */
32*95a264b3SDavid du Colombier 		for(nt = last; nt->entry != nil; nt = nt->entry)
33*95a264b3SDavid du Colombier 			;
34*95a264b3SDavid du Colombier 		nt->entry = t;
35*95a264b3SDavid du Colombier 	}
36*95a264b3SDavid du Colombier 
37*95a264b3SDavid du Colombier 	/* rotate line to make x first */
38*95a264b3SDavid du Colombier 	if(x != last->line){
39*95a264b3SDavid du Colombier 
40*95a264b3SDavid du Colombier 		/* find entry before x */
41*95a264b3SDavid du Colombier 		for(prev = last; prev->line != x; prev = prev->line);
42*95a264b3SDavid du Colombier 			;
43*95a264b3SDavid du Colombier 
44*95a264b3SDavid du Colombier 		/* detach line */
45*95a264b3SDavid du Colombier 		nt = last->entry;
46*95a264b3SDavid du Colombier 		last->entry = last->line;
47*95a264b3SDavid du Colombier 
48*95a264b3SDavid du Colombier 		/* reattach */
49*95a264b3SDavid du Colombier 		prev->entry = nt;
50*95a264b3SDavid du Colombier 	}
51*95a264b3SDavid du Colombier 
52*95a264b3SDavid du Colombier 	return x;
53*95a264b3SDavid du Colombier }
54