Fixes stat() #include
[akaros.git] / user / ndblib / ndbsubstitute.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 #include <stdlib.h>
10
11 #include <stdio.h>
12 #include <parlib.h>
13 #include <unistd.h>
14 #include <signal.h>
15 #include <fcntl.h>
16 #include <iplib.h>
17 #include <ndb.h>
18
19 /* replace a in t with b, the line structure in b is lost, c'est la vie */
20 struct ndbtuple*
21 ndbsubstitute(struct ndbtuple *t, struct ndbtuple *a, struct ndbtuple *b)
22 {
23         struct ndbtuple *nt;
24
25         if(a == b){
26                 ndbsetmalloctag(t, getcallerpc(&t));
27                 return t;
28         }
29         if(b == NULL){
30                 t = ndbdiscard(t, a);
31                 ndbsetmalloctag(t, getcallerpc(&t));
32                 return t;
33         }
34
35         /* all pointers to a become pointers to b */
36         for(nt = t; nt != NULL; nt = nt->entry){
37                 if(nt->line == a)
38                         nt->line = b;
39                 if(nt->entry == a)
40                         nt->entry = b;
41         }
42
43         /* end of b chain points to a's successors */
44         for(nt = b; nt->entry; nt = nt->entry)
45                 nt->line = nt->entry;
46         nt->line = a->line;
47         nt->entry = a->entry;
48
49         a->entry = NULL;
50         ndbfree(a);
51
52         if(a == t){
53                 ndbsetmalloctag(b, getcallerpc(&t));
54                 return b;
55         }else{
56                 ndbsetmalloctag(t, getcallerpc(&t));
57                 return t;
58         }
59 }