Commit | Line | Data |
---|---|---|
04c6839a WJ |
1 | #include "quipu/util.h" |
2 | #include "quipu/name.h" | |
3 | ||
4 | RDN rdn_merge (a,b) | |
5 | RDN a,b; | |
6 | { | |
7 | register RDN aptr, bptr, result, trail; | |
8 | ||
9 | if ( a == NULLRDN ) | |
10 | return (b); | |
11 | if ( b == NULLRDN ) | |
12 | return (a); | |
13 | ||
14 | /* start sequence off, make sure 'a' is the first */ | |
15 | switch (rdn_cmp_comp (a,b)) { | |
16 | case 0: /* equal */ | |
17 | result = a; | |
18 | aptr = a->rdn_next; | |
19 | rdn_comp_free (b); | |
20 | bptr = b->rdn_next; | |
21 | break; | |
22 | case -1: | |
23 | result = b; | |
24 | aptr = a; | |
25 | bptr = b->rdn_next; | |
26 | break; | |
27 | case 1: | |
28 | result = a; | |
29 | aptr = a->rdn_next; | |
30 | bptr = b; | |
31 | break; | |
32 | } | |
33 | ||
34 | trail = result; | |
35 | while ( (aptr != NULLRDN) && (bptr != NULLRDN) ) { | |
36 | ||
37 | switch (rdn_cmp_comp (aptr,bptr)) { | |
38 | case 0: /* equal */ | |
39 | trail->rdn_next = aptr; | |
40 | trail = aptr; | |
41 | rdn_comp_free (bptr); | |
42 | aptr = aptr->rdn_next; | |
43 | bptr = bptr->rdn_next; | |
44 | break; | |
45 | case -1: | |
46 | trail->rdn_next = bptr; | |
47 | trail = bptr; | |
48 | bptr = bptr->rdn_next; | |
49 | break; | |
50 | case 1: | |
51 | trail->rdn_next = aptr; | |
52 | trail = aptr; | |
53 | aptr = aptr->rdn_next; | |
54 | break; | |
55 | } | |
56 | } | |
57 | if (aptr == NULLRDN) | |
58 | trail->rdn_next = bptr; | |
59 | else | |
60 | trail->rdn_next = aptr; | |
61 | ||
62 | return (result); | |
63 | } | |
64 |