Commit | Line | Data |
---|---|---|
04c6839a WJ |
1 | #include "quipu/util.h" |
2 | #include "quipu/attrvalue.h" | |
3 | #include "quipu/dsp.h" /* for ds_error.h */ | |
4 | #include "quipu/ds_error.h" | |
5 | ||
6 | extern LLog * log_dsap; | |
7 | ||
8 | AV_Sequence avs_merge (a,b) | |
9 | AV_Sequence a,b; | |
10 | { | |
11 | register AV_Sequence aptr, bptr, result, trail, tmp; | |
12 | ||
13 | if ( a == NULLAV ) | |
14 | return (b); | |
15 | if ( b == NULLAV ) | |
16 | return (a); | |
17 | ||
18 | /* start sequence off, make sure 'a' is the first */ | |
19 | switch (avs_cmp_comp (a,b)) { | |
20 | default: | |
21 | LLOG (log_dsap,LLOG_EXCEPTIONS,("matching failed in avs_merge")) ; | |
22 | /* continue as if equal */ | |
23 | ||
24 | case 0: /* equal */ | |
25 | result = a; | |
26 | aptr = a->avseq_next; | |
27 | bptr = b->avseq_next; | |
28 | avs_comp_free (b); | |
29 | break; | |
30 | case -1: | |
31 | result = b; | |
32 | aptr = a; | |
33 | bptr = b->avseq_next; | |
34 | break; | |
35 | case 2: /* no compare function defined - treat as if a > b */ | |
36 | case 1: | |
37 | result = a; | |
38 | aptr = a->avseq_next; | |
39 | bptr = b; | |
40 | break; | |
41 | } | |
42 | ||
43 | trail = result; | |
44 | while ( (aptr != NULLAV) && (bptr != NULLAV) ) { | |
45 | ||
46 | switch (avs_cmp_comp (aptr,bptr)) { | |
47 | default: | |
48 | LLOG (log_dsap,LLOG_EXCEPTIONS,("matching failed in avs_merge (2)")) ; | |
49 | /* continue as if equal */ | |
50 | ||
51 | case 0: /* equal */ | |
52 | trail->avseq_next = aptr; | |
53 | trail = aptr; | |
54 | tmp = bptr->avseq_next; | |
55 | avs_comp_free (bptr); | |
56 | aptr = aptr->avseq_next; | |
57 | bptr = tmp; | |
58 | break; | |
59 | case -1: | |
60 | trail->avseq_next = bptr; | |
61 | trail = bptr; | |
62 | bptr = bptr->avseq_next; | |
63 | break; | |
64 | case 2: /* no compare function defined - treat as if a > b */ | |
65 | case 1: | |
66 | trail->avseq_next = aptr; | |
67 | trail = aptr; | |
68 | aptr = aptr->avseq_next; | |
69 | break; | |
70 | } | |
71 | } | |
72 | if (aptr == NULLAV) | |
73 | trail->avseq_next = bptr; | |
74 | else | |
75 | trail->avseq_next = aptr; | |
76 | ||
77 | return (result); | |
78 | } | |
79 | ||
80 |