• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 
12 /* Abstract AVL Tree Generic C Package.
13 ** Implementation generation header file.
14 **
15 ** This code is in the public domain.  See cavl_tree.html for interface
16 ** documentation.
17 **
18 ** Version: 1.5  Author: Walt Karas
19 */
20 
21 #undef L_
22 #undef L_EST_LONG_BIT
23 #undef L_SIZE
24 #undef l_tree
25 #undef L_MASK_HIGH_BIT
26 #undef L_LONG_BIT
27 #undef L_BIT_ARR_DEFN
28 #undef L_BIT_ARR_VAL
29 #undef L_BIT_ARR_0
30 #undef L_BIT_ARR_1
31 #undef L_BIT_ARR_ALL
32 #undef L_BIT_ARR_LONGS
33 #undef L_IMPL_MASK
34 #undef L_CHECK_READ_ERROR
35 #undef L_CHECK_READ_ERROR_INV_DEPTH
36 #undef L_SC
37 #undef L_BALANCE_PARAM_PREFIX
38 
39 #ifdef AVL_UNIQUE
40 
41 #define L_ AVL_UNIQUE
42 
43 #else
44 
45 #define L_(X) X
46 
47 #endif
48 
49 /* Determine correct storage class for functions */
50 #ifdef AVL_PRIVATE
51 
52 #define L_SC static
53 
54 #else
55 
56 #define L_SC
57 
58 #endif
59 
60 #ifdef AVL_SIZE
61 
62 #define L_SIZE AVL_SIZE
63 
64 #else
65 
66 #define L_SIZE unsigned long
67 
68 #endif
69 
70 #define L_MASK_HIGH_BIT ((int) ~ ((~ (unsigned) 0) >> 1))
71 
72 /* ANSI C/ISO C++ require that a long have at least 32 bits.  Set
73 ** L_EST_LONG_BIT to be the greatest multiple of 8 in the range
74 ** 32 - 64 (inclusive) that is less than or equal to the number of
75 ** bits in a long.
76 */
77 
78 #if (((LONG_MAX >> 31) >> 7) == 0)
79 
80 #define L_EST_LONG_BIT 32
81 
82 #elif (((LONG_MAX >> 31) >> 15) == 0)
83 
84 #define L_EST_LONG_BIT 40
85 
86 #elif (((LONG_MAX >> 31) >> 23) == 0)
87 
88 #define L_EST_LONG_BIT 48
89 
90 #elif (((LONG_MAX >> 31) >> 31) == 0)
91 
92 #define L_EST_LONG_BIT 56
93 
94 #else
95 
96 #define L_EST_LONG_BIT 64
97 
98 #endif
99 
100 #define L_LONG_BIT (sizeof(long) * CHAR_BIT)
101 
102 #if ((AVL_MAX_DEPTH) > L_EST_LONG_BIT)
103 
104 /* The maximum depth may be greater than the number of bits in a long,
105 ** so multiple longs are needed to hold a bit array indexed by node
106 ** depth. */
107 
108 #define L_BIT_ARR_LONGS (((AVL_MAX_DEPTH) + L_LONG_BIT - 1) / L_LONG_BIT)
109 
110 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME[L_BIT_ARR_LONGS];
111 
112 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) \
113     ((BIT_ARR)[(BIT_NUM) / L_LONG_BIT] & (1L << ((BIT_NUM) % L_LONG_BIT)))
114 
115 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) \
116     (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] &= ~(1L << ((BIT_NUM) % L_LONG_BIT));
117 
118 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) \
119     (BIT_ARR)[(BIT_NUM) / L_LONG_BIT] |= 1L << ((BIT_NUM) % L_LONG_BIT);
120 
121 #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) \
122     { int i = L_BIT_ARR_LONGS; do (BIT_ARR)[--i] = 0L - (BIT_VAL); while(i); }
123 
124 #else /* The bit array can definitely fit in one long */
125 
126 #define L_BIT_ARR_DEFN(NAME) unsigned long NAME;
127 
128 #define L_BIT_ARR_VAL(BIT_ARR, BIT_NUM) ((BIT_ARR) & (1L << (BIT_NUM)))
129 
130 #define L_BIT_ARR_0(BIT_ARR, BIT_NUM) (BIT_ARR) &= ~(1L << (BIT_NUM));
131 
132 #define L_BIT_ARR_1(BIT_ARR, BIT_NUM) (BIT_ARR) |= 1L << (BIT_NUM);
133 
134 #define L_BIT_ARR_ALL(BIT_ARR, BIT_VAL) (BIT_ARR) = 0L - (BIT_VAL);
135 
136 #endif
137 
138 #ifdef AVL_READ_ERRORS_HAPPEN
139 
140 #define L_CHECK_READ_ERROR(ERROR_RETURN) \
141     { if (AVL_READ_ERROR) return(ERROR_RETURN); }
142 
143 #else
144 
145 #define L_CHECK_READ_ERROR(ERROR_RETURN)
146 
147 #endif
148 
149 /* The presumed reason that an instantiation places additional fields
150 ** inside the AVL tree structure is that the SET_ and GET_ macros
151 ** need these fields.  The "balance" function does not explicitly use
152 ** any fields in the AVL tree structure, so only pass an AVL tree
153 ** structure pointer to "balance" if it has instantiation-specific
154 ** fields that are (presumably) needed by the SET_/GET_ calls within
155 ** "balance".
156 */
157 #ifdef AVL_INSIDE_STRUCT
158 
159 #define L_BALANCE_PARAM_CALL_PREFIX l_tree,
160 #define L_BALANCE_PARAM_DECL_PREFIX L_(avl) *l_tree,
161 
162 #else
163 
164 #define L_BALANCE_PARAM_CALL_PREFIX
165 #define L_BALANCE_PARAM_DECL_PREFIX
166 
167 #endif
168 
169 #ifdef AVL_IMPL_MASK
170 
171 #define L_IMPL_MASK (AVL_IMPL_MASK)
172 
173 #else
174 
175 /* Define all functions. */
176 #define L_IMPL_MASK AVL_IMPL_ALL
177 
178 #endif
179 
180 #if (L_IMPL_MASK & AVL_IMPL_INIT)
181 
L_(init)182 L_SC void L_(init)(L_(avl) *l_tree)
183 {
184     l_tree->root = AVL_NULL;
185 }
186 
187 #endif
188 
189 #if (L_IMPL_MASK & AVL_IMPL_IS_EMPTY)
190 
L_(is_empty)191 L_SC int L_(is_empty)(L_(avl) *l_tree)
192 {
193     return(l_tree->root == AVL_NULL);
194 }
195 
196 #endif
197 
198 /* Put the private balance function in the same compilation module as
199 ** the insert function.  */
200 #if (L_IMPL_MASK & AVL_IMPL_INSERT)
201 
202 /* Balances subtree, returns handle of root node of subtree after balancing.
203 */
L_(balance)204 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h)
205 {
206     AVL_HANDLE deep_h;
207 
208     /* Either the "greater than" or the "less than" subtree of
209     ** this node has to be 2 levels deeper (or else it wouldn't
210     ** need balancing).
211     */
212     if (AVL_GET_BALANCE_FACTOR(bal_h) > 0)
213     {
214         /* "Greater than" subtree is deeper. */
215 
216         deep_h = AVL_GET_GREATER(bal_h, 1);
217 
218         L_CHECK_READ_ERROR(AVL_NULL)
219 
220         if (AVL_GET_BALANCE_FACTOR(deep_h) < 0)
221         {
222             int bf;
223 
224             AVL_HANDLE old_h = bal_h;
225             bal_h = AVL_GET_LESS(deep_h, 1);
226             L_CHECK_READ_ERROR(AVL_NULL)
227             AVL_SET_GREATER(old_h, AVL_GET_LESS(bal_h, 1))
228             AVL_SET_LESS(deep_h, AVL_GET_GREATER(bal_h, 1))
229             AVL_SET_LESS(bal_h, old_h)
230             AVL_SET_GREATER(bal_h, deep_h)
231 
232             bf = AVL_GET_BALANCE_FACTOR(bal_h);
233 
234             if (bf != 0)
235             {
236                 if (bf > 0)
237                 {
238                     AVL_SET_BALANCE_FACTOR(old_h, -1)
239                     AVL_SET_BALANCE_FACTOR(deep_h, 0)
240                 }
241                 else
242                 {
243                     AVL_SET_BALANCE_FACTOR(deep_h, 1)
244                     AVL_SET_BALANCE_FACTOR(old_h, 0)
245                 }
246 
247                 AVL_SET_BALANCE_FACTOR(bal_h, 0)
248             }
249             else
250             {
251                 AVL_SET_BALANCE_FACTOR(old_h, 0)
252                 AVL_SET_BALANCE_FACTOR(deep_h, 0)
253             }
254         }
255         else
256         {
257             AVL_SET_GREATER(bal_h, AVL_GET_LESS(deep_h, 0))
258             AVL_SET_LESS(deep_h, bal_h)
259 
260             if (AVL_GET_BALANCE_FACTOR(deep_h) == 0)
261             {
262                 AVL_SET_BALANCE_FACTOR(deep_h, -1)
263                 AVL_SET_BALANCE_FACTOR(bal_h, 1)
264             }
265             else
266             {
267                 AVL_SET_BALANCE_FACTOR(deep_h, 0)
268                 AVL_SET_BALANCE_FACTOR(bal_h, 0)
269             }
270 
271             bal_h = deep_h;
272         }
273     }
274     else
275     {
276         /* "Less than" subtree is deeper. */
277 
278         deep_h = AVL_GET_LESS(bal_h, 1);
279         L_CHECK_READ_ERROR(AVL_NULL)
280 
281         if (AVL_GET_BALANCE_FACTOR(deep_h) > 0)
282         {
283             int bf;
284             AVL_HANDLE old_h = bal_h;
285             bal_h = AVL_GET_GREATER(deep_h, 1);
286             L_CHECK_READ_ERROR(AVL_NULL)
287             AVL_SET_LESS(old_h, AVL_GET_GREATER(bal_h, 0))
288             AVL_SET_GREATER(deep_h, AVL_GET_LESS(bal_h, 0))
289             AVL_SET_GREATER(bal_h, old_h)
290             AVL_SET_LESS(bal_h, deep_h)
291 
292             bf = AVL_GET_BALANCE_FACTOR(bal_h);
293 
294             if (bf != 0)
295             {
296                 if (bf < 0)
297                 {
298                     AVL_SET_BALANCE_FACTOR(old_h, 1)
299                     AVL_SET_BALANCE_FACTOR(deep_h, 0)
300                 }
301                 else
302                 {
303                     AVL_SET_BALANCE_FACTOR(deep_h, -1)
304                     AVL_SET_BALANCE_FACTOR(old_h, 0)
305                 }
306 
307                 AVL_SET_BALANCE_FACTOR(bal_h, 0)
308             }
309             else
310             {
311                 AVL_SET_BALANCE_FACTOR(old_h, 0)
312                 AVL_SET_BALANCE_FACTOR(deep_h, 0)
313             }
314         }
315         else
316         {
317             AVL_SET_LESS(bal_h, AVL_GET_GREATER(deep_h, 0))
318             AVL_SET_GREATER(deep_h, bal_h)
319 
320             if (AVL_GET_BALANCE_FACTOR(deep_h) == 0)
321             {
322                 AVL_SET_BALANCE_FACTOR(deep_h, 1)
323                 AVL_SET_BALANCE_FACTOR(bal_h, -1)
324             }
325             else
326             {
327                 AVL_SET_BALANCE_FACTOR(deep_h, 0)
328                 AVL_SET_BALANCE_FACTOR(bal_h, 0)
329             }
330 
331             bal_h = deep_h;
332         }
333     }
334 
335     return(bal_h);
336 }
337 
L_(insert)338 L_SC AVL_HANDLE L_(insert)(L_(avl) *l_tree, AVL_HANDLE h)
339 {
340     AVL_SET_LESS(h, AVL_NULL)
341     AVL_SET_GREATER(h, AVL_NULL)
342     AVL_SET_BALANCE_FACTOR(h, 0)
343 
344     if (l_tree->root == AVL_NULL)
345         l_tree->root = h;
346     else
347     {
348         /* Last unbalanced node encountered in search for insertion point. */
349         AVL_HANDLE unbal = AVL_NULL;
350         /* Parent of last unbalanced node. */
351         AVL_HANDLE parent_unbal = AVL_NULL;
352         /* Balance factor of last unbalanced node. */
353         int unbal_bf;
354 
355         /* Zero-based depth in tree. */
356         unsigned depth = 0, unbal_depth = 0;
357 
358         /* Records a path into the tree.  If bit n is true, indicates
359         ** take greater branch from the nth node in the path, otherwise
360         ** take the less branch.  bit 0 gives branch from root, and
361         ** so on. */
362         L_BIT_ARR_DEFN(branch)
363 
364         AVL_HANDLE hh = l_tree->root;
365         AVL_HANDLE parent = AVL_NULL;
366         int cmp;
367 
368         do
369         {
370             if (AVL_GET_BALANCE_FACTOR(hh) != 0)
371             {
372                 unbal = hh;
373                 parent_unbal = parent;
374                 unbal_depth = depth;
375             }
376 
377             cmp = AVL_COMPARE_NODE_NODE(h, hh);
378 
379             if (cmp == 0)
380                 /* Duplicate key. */
381                 return(hh);
382 
383             parent = hh;
384 
385             if (cmp > 0)
386             {
387                 hh = AVL_GET_GREATER(hh, 1);
388                 L_BIT_ARR_1(branch, depth)
389             }
390             else
391             {
392                 hh = AVL_GET_LESS(hh, 1);
393                 L_BIT_ARR_0(branch, depth)
394             }
395 
396             L_CHECK_READ_ERROR(AVL_NULL)
397             depth++;
398         }
399         while (hh != AVL_NULL);
400 
401         /*  Add node to insert as leaf of tree. */
402         if (cmp < 0)
403             AVL_SET_LESS(parent, h)
404             else
405                 AVL_SET_GREATER(parent, h)
406 
407                 depth = unbal_depth;
408 
409         if (unbal == AVL_NULL)
410             hh = l_tree->root;
411         else
412         {
413             cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
414             depth++;
415             unbal_bf = AVL_GET_BALANCE_FACTOR(unbal);
416 
417             if (cmp < 0)
418                 unbal_bf--;
419             else  /* cmp > 0 */
420                 unbal_bf++;
421 
422             hh = cmp < 0 ? AVL_GET_LESS(unbal, 1) : AVL_GET_GREATER(unbal, 1);
423             L_CHECK_READ_ERROR(AVL_NULL)
424 
425             if ((unbal_bf != -2) && (unbal_bf != 2))
426             {
427                 /* No rebalancing of tree is necessary. */
428                 AVL_SET_BALANCE_FACTOR(unbal, unbal_bf)
429                 unbal = AVL_NULL;
430             }
431         }
432 
433         if (hh != AVL_NULL)
434             while (h != hh)
435             {
436                 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
437                 depth++;
438 
439                 if (cmp < 0)
440                 {
441                     AVL_SET_BALANCE_FACTOR(hh, -1)
442                     hh = AVL_GET_LESS(hh, 1);
443                 }
444                 else /* cmp > 0 */
445                 {
446                     AVL_SET_BALANCE_FACTOR(hh, 1)
447                     hh = AVL_GET_GREATER(hh, 1);
448                 }
449 
450                 L_CHECK_READ_ERROR(AVL_NULL)
451             }
452 
453         if (unbal != AVL_NULL)
454         {
455             unbal = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX unbal);
456             L_CHECK_READ_ERROR(AVL_NULL)
457 
458             if (parent_unbal == AVL_NULL)
459                 l_tree->root = unbal;
460             else
461             {
462                 depth = unbal_depth - 1;
463                 cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
464 
465                 if (cmp < 0)
466                     AVL_SET_LESS(parent_unbal, unbal)
467                     else  /* cmp > 0 */
468                         AVL_SET_GREATER(parent_unbal, unbal)
469                     }
470         }
471 
472     }
473 
474     return(h);
475 }
476 
477 #endif
478 
479 #if (L_IMPL_MASK & AVL_IMPL_SEARCH)
480 
L_(search)481 L_SC AVL_HANDLE L_(search)(L_(avl) *l_tree, AVL_KEY k, avl_search_type st)
482 {
483     int cmp, target_cmp;
484     AVL_HANDLE match_h = AVL_NULL;
485     AVL_HANDLE h = l_tree->root;
486 
487     if (st & AVL_LESS)
488         target_cmp = 1;
489     else if (st & AVL_GREATER)
490         target_cmp = -1;
491     else
492         target_cmp = 0;
493 
494     while (h != AVL_NULL)
495     {
496         cmp = AVL_COMPARE_KEY_NODE(k, h);
497 
498         if (cmp == 0)
499         {
500             if (st & AVL_EQUAL)
501             {
502                 match_h = h;
503                 break;
504             }
505 
506             cmp = -target_cmp;
507         }
508         else if (target_cmp != 0)
509             if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
510                 /* cmp and target_cmp are both positive or both negative. */
511                 match_h = h;
512 
513         h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
514         L_CHECK_READ_ERROR(AVL_NULL)
515     }
516 
517     return(match_h);
518 }
519 
520 #endif
521 
522 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_LEAST)
523 
L_(search_least)524 L_SC AVL_HANDLE L_(search_least)(L_(avl) *l_tree)
525 {
526     AVL_HANDLE h = l_tree->root;
527     AVL_HANDLE parent = AVL_NULL;
528 
529     while (h != AVL_NULL)
530     {
531         parent = h;
532         h = AVL_GET_LESS(h, 1);
533         L_CHECK_READ_ERROR(AVL_NULL)
534     }
535 
536     return(parent);
537 }
538 
539 #endif
540 
541 #if (L_IMPL_MASK & AVL_IMPL_SEARCH_GREATEST)
542 
L_(search_greatest)543 L_SC AVL_HANDLE L_(search_greatest)(L_(avl) *l_tree)
544 {
545     AVL_HANDLE h = l_tree->root;
546     AVL_HANDLE parent = AVL_NULL;
547 
548     while (h != AVL_NULL)
549     {
550         parent = h;
551         h = AVL_GET_GREATER(h, 1);
552         L_CHECK_READ_ERROR(AVL_NULL)
553     }
554 
555     return(parent);
556 }
557 
558 #endif
559 
560 #if (L_IMPL_MASK & AVL_IMPL_REMOVE)
561 
562 /* Prototype of balance function (called by remove) in case not in
563 ** same compilation unit.
564 */
565 L_SC AVL_HANDLE L_(balance)(L_BALANCE_PARAM_DECL_PREFIX AVL_HANDLE bal_h);
566 
L_(remove)567 L_SC AVL_HANDLE L_(remove)(L_(avl) *l_tree, AVL_KEY k)
568 {
569     /* Zero-based depth in tree. */
570     unsigned depth = 0, rm_depth;
571 
572     /* Records a path into the tree.  If bit n is true, indicates
573     ** take greater branch from the nth node in the path, otherwise
574     ** take the less branch.  bit 0 gives branch from root, and
575     ** so on. */
576     L_BIT_ARR_DEFN(branch)
577 
578     AVL_HANDLE h = l_tree->root;
579     AVL_HANDLE parent = AVL_NULL;
580     AVL_HANDLE child;
581     AVL_HANDLE path;
582     int cmp, cmp_shortened_sub_with_path;
583     int reduced_depth;
584     int bf;
585     AVL_HANDLE rm;
586     AVL_HANDLE parent_rm;
587 
588     for (; ;)
589     {
590         if (h == AVL_NULL)
591             /* No node in tree with given key. */
592             return(AVL_NULL);
593 
594         cmp = AVL_COMPARE_KEY_NODE(k, h);
595 
596         if (cmp == 0)
597             /* Found node to remove. */
598             break;
599 
600         parent = h;
601 
602         if (cmp > 0)
603         {
604             h = AVL_GET_GREATER(h, 1);
605             L_BIT_ARR_1(branch, depth)
606         }
607         else
608         {
609             h = AVL_GET_LESS(h, 1);
610             L_BIT_ARR_0(branch, depth)
611         }
612 
613         L_CHECK_READ_ERROR(AVL_NULL)
614         depth++;
615         cmp_shortened_sub_with_path = cmp;
616     }
617 
618     rm = h;
619     parent_rm = parent;
620     rm_depth = depth;
621 
622     /* If the node to remove is not a leaf node, we need to get a
623     ** leaf node, or a node with a single leaf as its child, to put
624     ** in the place of the node to remove.  We will get the greatest
625     ** node in the less subtree (of the node to remove), or the least
626     ** node in the greater subtree.  We take the leaf node from the
627     ** deeper subtree, if there is one. */
628 
629     if (AVL_GET_BALANCE_FACTOR(h) < 0)
630     {
631         child = AVL_GET_LESS(h, 1);
632         L_BIT_ARR_0(branch, depth)
633         cmp = -1;
634     }
635     else
636     {
637         child = AVL_GET_GREATER(h, 1);
638         L_BIT_ARR_1(branch, depth)
639         cmp = 1;
640     }
641 
642     L_CHECK_READ_ERROR(AVL_NULL)
643     depth++;
644 
645     if (child != AVL_NULL)
646     {
647         cmp = -cmp;
648 
649         do
650         {
651             parent = h;
652             h = child;
653 
654             if (cmp < 0)
655             {
656                 child = AVL_GET_LESS(h, 1);
657                 L_BIT_ARR_0(branch, depth)
658             }
659             else
660             {
661                 child = AVL_GET_GREATER(h, 1);
662                 L_BIT_ARR_1(branch, depth)
663             }
664 
665             L_CHECK_READ_ERROR(AVL_NULL)
666             depth++;
667         }
668         while (child != AVL_NULL);
669 
670         if (parent == rm)
671             /* Only went through do loop once.  Deleted node will be replaced
672             ** in the tree structure by one of its immediate children. */
673             cmp_shortened_sub_with_path = -cmp;
674         else
675             cmp_shortened_sub_with_path = cmp;
676 
677         /* Get the handle of the opposite child, which may not be null. */
678         child = cmp > 0 ? AVL_GET_LESS(h, 0) : AVL_GET_GREATER(h, 0);
679     }
680 
681     if (parent == AVL_NULL)
682         /* There were only 1 or 2 nodes in this tree. */
683         l_tree->root = child;
684     else if (cmp_shortened_sub_with_path < 0)
685         AVL_SET_LESS(parent, child)
686         else
687             AVL_SET_GREATER(parent, child)
688 
689             /* "path" is the parent of the subtree being eliminated or reduced
690             ** from a depth of 2 to 1.  If "path" is the node to be removed, we
691             ** set path to the node we're about to poke into the position of the
692             ** node to be removed. */
693             path = parent == rm ? h : parent;
694 
695     if (h != rm)
696     {
697         /* Poke in the replacement for the node to be removed. */
698         AVL_SET_LESS(h, AVL_GET_LESS(rm, 0))
699         AVL_SET_GREATER(h, AVL_GET_GREATER(rm, 0))
700         AVL_SET_BALANCE_FACTOR(h, AVL_GET_BALANCE_FACTOR(rm))
701 
702         if (parent_rm == AVL_NULL)
703             l_tree->root = h;
704         else
705         {
706             depth = rm_depth - 1;
707 
708             if (L_BIT_ARR_VAL(branch, depth))
709                 AVL_SET_GREATER(parent_rm, h)
710                 else
711                     AVL_SET_LESS(parent_rm, h)
712                 }
713     }
714 
715     if (path != AVL_NULL)
716     {
717         /* Create a temporary linked list from the parent of the path node
718         ** to the root node. */
719         h = l_tree->root;
720         parent = AVL_NULL;
721         depth = 0;
722 
723         while (h != path)
724         {
725             if (L_BIT_ARR_VAL(branch, depth))
726             {
727                 child = AVL_GET_GREATER(h, 1);
728                 AVL_SET_GREATER(h, parent)
729             }
730             else
731             {
732                 child = AVL_GET_LESS(h, 1);
733                 AVL_SET_LESS(h, parent)
734             }
735 
736             L_CHECK_READ_ERROR(AVL_NULL)
737             depth++;
738             parent = h;
739             h = child;
740         }
741 
742         /* Climb from the path node to the root node using the linked
743         ** list, restoring the tree structure and rebalancing as necessary.
744         */
745         reduced_depth = 1;
746         cmp = cmp_shortened_sub_with_path;
747 
748         for (; ;)
749         {
750             if (reduced_depth)
751             {
752                 bf = AVL_GET_BALANCE_FACTOR(h);
753 
754                 if (cmp < 0)
755                     bf++;
756                 else  /* cmp > 0 */
757                     bf--;
758 
759                 if ((bf == -2) || (bf == 2))
760                 {
761                     h = L_(balance)(L_BALANCE_PARAM_CALL_PREFIX h);
762                     L_CHECK_READ_ERROR(AVL_NULL)
763                     bf = AVL_GET_BALANCE_FACTOR(h);
764                 }
765                 else
766                     AVL_SET_BALANCE_FACTOR(h, bf)
767                     reduced_depth = (bf == 0);
768             }
769 
770             if (parent == AVL_NULL)
771                 break;
772 
773             child = h;
774             h = parent;
775             depth--;
776             cmp = L_BIT_ARR_VAL(branch, depth) ? 1 : -1;
777 
778             if (cmp < 0)
779             {
780                 parent = AVL_GET_LESS(h, 1);
781                 AVL_SET_LESS(h, child)
782             }
783             else
784             {
785                 parent = AVL_GET_GREATER(h, 1);
786                 AVL_SET_GREATER(h, child)
787             }
788 
789             L_CHECK_READ_ERROR(AVL_NULL)
790         }
791 
792         l_tree->root = h;
793     }
794 
795     return(rm);
796 }
797 
798 #endif
799 
800 #if (L_IMPL_MASK & AVL_IMPL_SUBST)
801 
L_(subst)802 L_SC AVL_HANDLE L_(subst)(L_(avl) *l_tree, AVL_HANDLE new_node)
803 {
804     AVL_HANDLE h = l_tree->root;
805     AVL_HANDLE parent = AVL_NULL;
806     int cmp, last_cmp;
807 
808     /* Search for node already in tree with same key. */
809     for (; ;)
810     {
811         if (h == AVL_NULL)
812             /* No node in tree with same key as new node. */
813             return(AVL_NULL);
814 
815         cmp = AVL_COMPARE_NODE_NODE(new_node, h);
816 
817         if (cmp == 0)
818             /* Found the node to substitute new one for. */
819             break;
820 
821         last_cmp = cmp;
822         parent = h;
823         h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
824         L_CHECK_READ_ERROR(AVL_NULL)
825     }
826 
827     /* Copy tree housekeeping fields from node in tree to new node. */
828     AVL_SET_LESS(new_node, AVL_GET_LESS(h, 0))
829     AVL_SET_GREATER(new_node, AVL_GET_GREATER(h, 0))
830     AVL_SET_BALANCE_FACTOR(new_node, AVL_GET_BALANCE_FACTOR(h))
831 
832     if (parent == AVL_NULL)
833         /* New node is also new root. */
834         l_tree->root = new_node;
835     else
836     {
837         /* Make parent point to new node. */
838         if (last_cmp < 0)
839             AVL_SET_LESS(parent, new_node)
840             else
841                 AVL_SET_GREATER(parent, new_node)
842             }
843 
844     return(h);
845 }
846 
847 #endif
848 
849 #ifdef AVL_BUILD_ITER_TYPE
850 
851 #if (L_IMPL_MASK & AVL_IMPL_BUILD)
852 
L_(build)853 L_SC int L_(build)(
854     L_(avl) *l_tree, AVL_BUILD_ITER_TYPE p, L_SIZE num_nodes)
855 {
856     /* Gives path to subtree being built.  If bit n is false, branch
857     ** less from the node at depth n, if true branch greater. */
858     L_BIT_ARR_DEFN(branch)
859 
860     /* If bit n is true, then for the current subtree at depth n, its
861     ** greater subtree has one more node than its less subtree. */
862     L_BIT_ARR_DEFN(rem)
863 
864     /* Depth of root node of current subtree. */
865     unsigned depth = 0;
866 
867     /* Number of nodes in current subtree. */
868     L_SIZE num_sub = num_nodes;
869 
870     /* The algorithm relies on a stack of nodes whose less subtree has
871     ** been built, but whose greater subtree has not yet been built.
872     ** The stack is implemented as linked list.  The nodes are linked
873     ** together by having the "greater" handle of a node set to the
874     ** next node in the list.  "less_parent" is the handle of the first
875     ** node in the list. */
876     AVL_HANDLE less_parent = AVL_NULL;
877 
878     /* h is root of current subtree, child is one of its children. */
879     AVL_HANDLE h;
880     AVL_HANDLE child;
881 
882     if (num_nodes == 0)
883     {
884         l_tree->root = AVL_NULL;
885         return(1);
886     }
887 
888     for (; ;)
889     {
890         while (num_sub > 2)
891         {
892             /* Subtract one for root of subtree. */
893             num_sub--;
894 
895             if (num_sub & 1)
896                 L_BIT_ARR_1(rem, depth)
897                 else
898                     L_BIT_ARR_0(rem, depth)
899                     L_BIT_ARR_0(branch, depth)
900                     depth++;
901 
902             num_sub >>= 1;
903         }
904 
905         if (num_sub == 2)
906         {
907             /* Build a subtree with two nodes, slanting to greater.
908             ** I arbitrarily chose to always have the extra node in the
909             ** greater subtree when there is an odd number of nodes to
910             ** split between the two subtrees. */
911 
912             h = AVL_BUILD_ITER_VAL(p);
913             L_CHECK_READ_ERROR(0)
914             AVL_BUILD_ITER_INCR(p)
915             child = AVL_BUILD_ITER_VAL(p);
916             L_CHECK_READ_ERROR(0)
917             AVL_BUILD_ITER_INCR(p)
918             AVL_SET_LESS(child, AVL_NULL)
919             AVL_SET_GREATER(child, AVL_NULL)
920             AVL_SET_BALANCE_FACTOR(child, 0)
921             AVL_SET_GREATER(h, child)
922             AVL_SET_LESS(h, AVL_NULL)
923             AVL_SET_BALANCE_FACTOR(h, 1)
924         }
925         else  /* num_sub == 1 */
926         {
927             /* Build a subtree with one node. */
928 
929             h = AVL_BUILD_ITER_VAL(p);
930             L_CHECK_READ_ERROR(0)
931             AVL_BUILD_ITER_INCR(p)
932             AVL_SET_LESS(h, AVL_NULL)
933             AVL_SET_GREATER(h, AVL_NULL)
934             AVL_SET_BALANCE_FACTOR(h, 0)
935         }
936 
937         while (depth)
938         {
939             depth--;
940 
941             if (!L_BIT_ARR_VAL(branch, depth))
942                 /* We've completed a less subtree. */
943                 break;
944 
945             /* We've completed a greater subtree, so attach it to
946             ** its parent (that is less than it).  We pop the parent
947             ** off the stack of less parents. */
948             child = h;
949             h = less_parent;
950             less_parent = AVL_GET_GREATER(h, 1);
951             L_CHECK_READ_ERROR(0)
952             AVL_SET_GREATER(h, child)
953             /* num_sub = 2 * (num_sub - rem[depth]) + rem[depth] + 1 */
954             num_sub <<= 1;
955             num_sub += L_BIT_ARR_VAL(rem, depth) ? 0 : 1;
956 
957             if (num_sub & (num_sub - 1))
958                 /* num_sub is not a power of 2. */
959                 AVL_SET_BALANCE_FACTOR(h, 0)
960                 else
961                     /* num_sub is a power of 2. */
962                     AVL_SET_BALANCE_FACTOR(h, 1)
963                 }
964 
965         if (num_sub == num_nodes)
966             /* We've completed the full tree. */
967             break;
968 
969         /* The subtree we've completed is the less subtree of the
970         ** next node in the sequence. */
971 
972         child = h;
973         h = AVL_BUILD_ITER_VAL(p);
974         L_CHECK_READ_ERROR(0)
975         AVL_BUILD_ITER_INCR(p)
976         AVL_SET_LESS(h, child)
977 
978         /* Put h into stack of less parents. */
979         AVL_SET_GREATER(h, less_parent)
980         less_parent = h;
981 
982         /* Proceed to creating greater than subtree of h. */
983         L_BIT_ARR_1(branch, depth)
984         num_sub += L_BIT_ARR_VAL(rem, depth) ? 1 : 0;
985         depth++;
986 
987     } /* end for ( ; ; ) */
988 
989     l_tree->root = h;
990 
991     return(1);
992 }
993 
994 #endif
995 
996 #endif
997 
998 #if (L_IMPL_MASK & AVL_IMPL_INIT_ITER)
999 
1000 /* Initialize depth to invalid value, to indicate iterator is
1001 ** invalid.   (Depth is zero-base.)  It's not necessary to initialize
1002 ** iterators prior to passing them to the "start" function.
1003 */
L_(init_iter)1004 L_SC void L_(init_iter)(L_(iter) *iter)
1005 {
1006     iter->depth = ~0;
1007 }
1008 
1009 #endif
1010 
1011 #ifdef AVL_READ_ERRORS_HAPPEN
1012 
1013 #define L_CHECK_READ_ERROR_INV_DEPTH \
1014     { if (AVL_READ_ERROR) { iter->depth = ~0; return; } }
1015 
1016 #else
1017 
1018 #define L_CHECK_READ_ERROR_INV_DEPTH
1019 
1020 #endif
1021 
1022 #if (L_IMPL_MASK & AVL_IMPL_START_ITER)
1023 
L_(start_iter)1024 L_SC void L_(start_iter)(
1025     L_(avl) *l_tree, L_(iter) *iter, AVL_KEY k, avl_search_type st)
1026 {
1027     AVL_HANDLE h = l_tree->root;
1028     unsigned d = 0;
1029     int cmp, target_cmp;
1030 
1031     /* Save the tree that we're going to iterate through in a
1032     ** member variable. */
1033     iter->tree_ = l_tree;
1034 
1035     iter->depth = ~0;
1036 
1037     if (h == AVL_NULL)
1038         /* Tree is empty. */
1039         return;
1040 
1041     if (st & AVL_LESS)
1042         /* Key can be greater than key of starting node. */
1043         target_cmp = 1;
1044     else if (st & AVL_GREATER)
1045         /* Key can be less than key of starting node. */
1046         target_cmp = -1;
1047     else
1048         /* Key must be same as key of starting node. */
1049         target_cmp = 0;
1050 
1051     for (; ;)
1052     {
1053         cmp = AVL_COMPARE_KEY_NODE(k, h);
1054 
1055         if (cmp == 0)
1056         {
1057             if (st & AVL_EQUAL)
1058             {
1059                 /* Equal node was sought and found as starting node. */
1060                 iter->depth = d;
1061                 break;
1062             }
1063 
1064             cmp = -target_cmp;
1065         }
1066         else if (target_cmp != 0)
1067             if (!((cmp ^ target_cmp) & L_MASK_HIGH_BIT))
1068                 /* cmp and target_cmp are both negative or both positive. */
1069                 iter->depth = d;
1070 
1071         h = cmp < 0 ? AVL_GET_LESS(h, 1) : AVL_GET_GREATER(h, 1);
1072         L_CHECK_READ_ERROR_INV_DEPTH
1073 
1074         if (h == AVL_NULL)
1075             break;
1076 
1077         if (cmp > 0)
1078             L_BIT_ARR_1(iter->branch, d)
1079             else
1080                 L_BIT_ARR_0(iter->branch, d)
1081                 iter->path_h[d++] = h;
1082     }
1083 }
1084 
1085 #endif
1086 
1087 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_LEAST)
1088 
L_(start_iter_least)1089 L_SC void L_(start_iter_least)(L_(avl) *l_tree, L_(iter) *iter)
1090 {
1091     AVL_HANDLE h = l_tree->root;
1092 
1093     iter->tree_ = l_tree;
1094 
1095     iter->depth = ~0;
1096 
1097     L_BIT_ARR_ALL(iter->branch, 0)
1098 
1099     while (h != AVL_NULL)
1100     {
1101         if (iter->depth != ~0)
1102             iter->path_h[iter->depth] = h;
1103 
1104         iter->depth++;
1105         h = AVL_GET_LESS(h, 1);
1106         L_CHECK_READ_ERROR_INV_DEPTH
1107     }
1108 }
1109 
1110 #endif
1111 
1112 #if (L_IMPL_MASK & AVL_IMPL_START_ITER_GREATEST)
1113 
L_(start_iter_greatest)1114 L_SC void L_(start_iter_greatest)(L_(avl) *l_tree, L_(iter) *iter)
1115 {
1116     AVL_HANDLE h = l_tree->root;
1117 
1118     iter->tree_ = l_tree;
1119 
1120     iter->depth = ~0;
1121 
1122     L_BIT_ARR_ALL(iter->branch, 1)
1123 
1124     while (h != AVL_NULL)
1125     {
1126         if (iter->depth != ~0)
1127             iter->path_h[iter->depth] = h;
1128 
1129         iter->depth++;
1130         h = AVL_GET_GREATER(h, 1);
1131         L_CHECK_READ_ERROR_INV_DEPTH
1132     }
1133 }
1134 
1135 #endif
1136 
1137 #if (L_IMPL_MASK & AVL_IMPL_GET_ITER)
1138 
L_(get_iter)1139 L_SC AVL_HANDLE L_(get_iter)(L_(iter) *iter)
1140 {
1141     if (iter->depth == ~0)
1142         return(AVL_NULL);
1143 
1144     return(iter->depth == 0 ?
1145            iter->tree_->root : iter->path_h[iter->depth - 1]);
1146 }
1147 
1148 #endif
1149 
1150 #if (L_IMPL_MASK & AVL_IMPL_INCR_ITER)
1151 
L_(incr_iter)1152 L_SC void L_(incr_iter)(L_(iter) *iter)
1153 {
1154 #define l_tree (iter->tree_)
1155 
1156     if (iter->depth != ~0)
1157     {
1158         AVL_HANDLE h =
1159             AVL_GET_GREATER((iter->depth == 0 ?
1160                              iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
1161         L_CHECK_READ_ERROR_INV_DEPTH
1162 
1163         if (h == AVL_NULL)
1164             do
1165             {
1166                 if (iter->depth == 0)
1167                 {
1168                     iter->depth = ~0;
1169                     break;
1170                 }
1171 
1172                 iter->depth--;
1173             }
1174             while (L_BIT_ARR_VAL(iter->branch, iter->depth));
1175         else
1176         {
1177             L_BIT_ARR_1(iter->branch, iter->depth)
1178             iter->path_h[iter->depth++] = h;
1179 
1180             for (; ;)
1181             {
1182                 h = AVL_GET_LESS(h, 1);
1183                 L_CHECK_READ_ERROR_INV_DEPTH
1184 
1185                 if (h == AVL_NULL)
1186                     break;
1187 
1188                 L_BIT_ARR_0(iter->branch, iter->depth)
1189                 iter->path_h[iter->depth++] = h;
1190             }
1191         }
1192     }
1193 
1194 #undef l_tree
1195 }
1196 
1197 #endif
1198 
1199 #if (L_IMPL_MASK & AVL_IMPL_DECR_ITER)
1200 
L_(decr_iter)1201 L_SC void L_(decr_iter)(L_(iter) *iter)
1202 {
1203 #define l_tree (iter->tree_)
1204 
1205     if (iter->depth != ~0)
1206     {
1207         AVL_HANDLE h =
1208             AVL_GET_LESS((iter->depth == 0 ?
1209                           iter->tree_->root : iter->path_h[iter->depth - 1]), 1);
1210         L_CHECK_READ_ERROR_INV_DEPTH
1211 
1212         if (h == AVL_NULL)
1213             do
1214             {
1215                 if (iter->depth == 0)
1216                 {
1217                     iter->depth = ~0;
1218                     break;
1219                 }
1220 
1221                 iter->depth--;
1222             }
1223             while (!L_BIT_ARR_VAL(iter->branch, iter->depth));
1224         else
1225         {
1226             L_BIT_ARR_0(iter->branch, iter->depth)
1227             iter->path_h[iter->depth++] = h;
1228 
1229             for (; ;)
1230             {
1231                 h = AVL_GET_GREATER(h, 1);
1232                 L_CHECK_READ_ERROR_INV_DEPTH
1233 
1234                 if (h == AVL_NULL)
1235                     break;
1236 
1237                 L_BIT_ARR_1(iter->branch, iter->depth)
1238                 iter->path_h[iter->depth++] = h;
1239             }
1240         }
1241     }
1242 
1243 #undef l_tree
1244 }
1245 
1246 #endif
1247 
1248 /* Tidy up the preprocessor symbol name space. */
1249 #undef L_
1250 #undef L_EST_LONG_BIT
1251 #undef L_SIZE
1252 #undef L_MASK_HIGH_BIT
1253 #undef L_LONG_BIT
1254 #undef L_BIT_ARR_DEFN
1255 #undef L_BIT_ARR_VAL
1256 #undef L_BIT_ARR_0
1257 #undef L_BIT_ARR_1
1258 #undef L_BIT_ARR_ALL
1259 #undef L_CHECK_READ_ERROR
1260 #undef L_CHECK_READ_ERROR_INV_DEPTH
1261 #undef L_BIT_ARR_LONGS
1262 #undef L_IMPL_MASK
1263 #undef L_CHECK_READ_ERROR
1264 #undef L_CHECK_READ_ERROR_INV_DEPTH
1265 #undef L_SC
1266 #undef L_BALANCE_PARAM_CALL_PREFIX
1267 #undef L_BALANCE_PARAM_DECL_PREFIX
1268