386BSD 0.1 development
[unix-history] / usr / othersrc / contrib / isode / dsap / common / rdn_merge.c
CommitLineData
04c6839a
WJ
1#include "quipu/util.h"
2#include "quipu/name.h"
3
4RDN rdn_merge (a,b)
5RDN a,b;
6{
7register 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