URI:
       tndbreorder.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tndbreorder.c (964B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 #include <ndb.h>
            5 
            6 /*
            7  *  reorder the tuple to put x's line first in the entry and x fitst in its line
            8  */
            9 Ndbtuple*
           10 ndbreorder(Ndbtuple *t, Ndbtuple *x)
           11 {
           12         Ndbtuple *nt;
           13         Ndbtuple *last, *prev;
           14 
           15         /* if x is first, we're done */
           16         if(x == t)
           17                 return t;
           18 
           19         /* find end of x's line */
           20         for(last = x; last->line == last->entry; last = last->line)
           21                 ;
           22 
           23         /* rotate to make this line first */
           24         if(last->line != t){
           25 
           26                 /* detach this line and everything after it from the entry */
           27                 for(nt = t; nt->entry != last->line; nt = nt->entry)
           28                         ;
           29                 nt->entry = nil;
           30 
           31                 /* switch */
           32                 for(nt = last; nt->entry != nil; nt = nt->entry)
           33                         ;
           34                 nt->entry = t;
           35         }
           36 
           37         /* rotate line to make x first */
           38         if(x != last->line){
           39 
           40                 /* find entry before x */
           41                 for(prev = last; prev->line != x; prev = prev->line)
           42                         ;
           43 
           44                 /* detach line */
           45                 nt = last->entry;
           46                 last->entry = last->line;
           47 
           48                 /* reattach */
           49                 prev->entry = nt;
           50         }
           51 
           52         return x;
           53 }