Bug Summary

File:src/usr.bin/tmux/hyperlinks.c
Warning:line 89, column 23
The left operand of '-' is a garbage value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.4 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name hyperlinks.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.bin/tmux/obj -resource-dir /usr/local/llvm16/lib/clang/16 -I /usr/src/usr.bin/tmux -internal-isystem /usr/local/llvm16/lib/clang/16/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.bin/tmux/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fcf-protection=branch -fno-jump-tables -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/scan/2024-01-11-140451-98009-1 -x c /usr/src/usr.bin/tmux/hyperlinks.c
1/* $OpenBSD: hyperlinks.c,v 1.3 2023/06/30 13:19:32 nicm Exp $ */
2
3/*
4 * Copyright (c) 2021 Will <author@will.party>
5 * Copyright (c) 2022 Jeff Chiang <pobomp@gmail.com>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
16 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
17 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include <sys/types.h>
21
22#include <stdlib.h>
23#include <string.h>
24#include <vis.h>
25
26#include "tmux.h"
27
28/*
29 * OSC 8 hyperlinks, described at:
30 *
31 * https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
32 *
33 * Each hyperlink and ID combination is assigned a number ("inner" in this
34 * file) which is stored in an extended grid cell and maps into a tree here.
35 *
36 * Each URI has one inner number and one external ID (which tmux uses to send
37 * the hyperlink to the terminal) and one internal ID (which is received from
38 * the sending application inside tmux).
39 *
40 * Anonymous hyperlinks are each unique and are not reused even if they have
41 * the same URI (terminals will not want to tie them together).
42 */
43
44#define MAX_HYPERLINKS5000 5000
45
46static long long hyperlinks_next_external_id = 1;
47static u_int global_hyperlinks_count;
48
49struct hyperlinks_uri {
50 struct hyperlinks *tree;
51
52 u_int inner;
53 const char *internal_id;
54 const char *external_id;
55 const char *uri;
56
57 TAILQ_ENTRY(hyperlinks_uri)struct { struct hyperlinks_uri *tqe_next; struct hyperlinks_uri
**tqe_prev; }
list_entry;
58 RB_ENTRY(hyperlinks_uri)struct { struct hyperlinks_uri *rbe_left; struct hyperlinks_uri
*rbe_right; struct hyperlinks_uri *rbe_parent; int rbe_color
; }
by_inner_entry;
59 RB_ENTRY(hyperlinks_uri)struct { struct hyperlinks_uri *rbe_left; struct hyperlinks_uri
*rbe_right; struct hyperlinks_uri *rbe_parent; int rbe_color
; }
by_uri_entry; /* by internal ID and URI */
60};
61RB_HEAD(hyperlinks_by_uri_tree, hyperlinks_uri)struct hyperlinks_by_uri_tree { struct hyperlinks_uri *rbh_root
; }
;
62RB_HEAD(hyperlinks_by_inner_tree, hyperlinks_uri)struct hyperlinks_by_inner_tree { struct hyperlinks_uri *rbh_root
; }
;
63
64TAILQ_HEAD(hyperlinks_list, hyperlinks_uri)struct hyperlinks_list { struct hyperlinks_uri *tqh_first; struct
hyperlinks_uri **tqh_last; }
;
65static struct hyperlinks_list global_hyperlinks =
66 TAILQ_HEAD_INITIALIZER(global_hyperlinks){ ((void *)0), &(global_hyperlinks).tqh_first };
67
68struct hyperlinks {
69 u_int next_inner;
70 struct hyperlinks_by_inner_tree by_inner;
71 struct hyperlinks_by_uri_tree by_uri;
72};
73
74static int
75hyperlinks_by_uri_cmp(struct hyperlinks_uri *left, struct hyperlinks_uri *right)
76{
77 int r;
78
79 if (*left->internal_id == '\0' || *right->internal_id == '\0') {
8
Assuming the condition is true
80 /*
81 * If both URIs are anonymous, use the inner for comparison so
82 * that they do not match even if the URI is the same - each
83 * anonymous URI should be unique.
84 */
85 if (*left->internal_id != '\0')
9
Taking false branch
86 return (-1);
87 if (*right->internal_id != '\0')
10
Assuming the condition is false
11
Taking false branch
88 return (1);
89 return (left->inner - right->inner);
12
The left operand of '-' is a garbage value
90 }
91
92 r = strcmp(left->internal_id, right->internal_id);
93 if (r != 0)
94 return (r);
95 return (strcmp(left->uri, right->uri));
96}
97RB_PROTOTYPE_STATIC(hyperlinks_by_uri_tree, hyperlinks_uri, by_uri_entry,__attribute__((__unused__)) static void hyperlinks_by_uri_tree_RB_INSERT_COLOR
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static void hyperlinks_by_uri_tree_RB_REMOVE_COLOR
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *, struct
hyperlinks_uri *);__attribute__((__unused__)) static struct hyperlinks_uri
*hyperlinks_by_uri_tree_RB_REMOVE(struct hyperlinks_by_uri_tree
*, struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_INSERT(struct
hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_FIND
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_NFIND
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_NEXT
(struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_PREV(struct
hyperlinks_uri *); __attribute__((__unused__)) static struct
hyperlinks_uri *hyperlinks_by_uri_tree_RB_MINMAX(struct hyperlinks_by_uri_tree
*, int);
98 hyperlinks_by_uri_cmp)__attribute__((__unused__)) static void hyperlinks_by_uri_tree_RB_INSERT_COLOR
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static void hyperlinks_by_uri_tree_RB_REMOVE_COLOR
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *, struct
hyperlinks_uri *);__attribute__((__unused__)) static struct hyperlinks_uri
*hyperlinks_by_uri_tree_RB_REMOVE(struct hyperlinks_by_uri_tree
*, struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_INSERT(struct
hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_FIND
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_NFIND
(struct hyperlinks_by_uri_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_NEXT
(struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_uri_tree_RB_PREV(struct
hyperlinks_uri *); __attribute__((__unused__)) static struct
hyperlinks_uri *hyperlinks_by_uri_tree_RB_MINMAX(struct hyperlinks_by_uri_tree
*, int);
;
99RB_GENERATE_STATIC(hyperlinks_by_uri_tree, hyperlinks_uri, by_uri_entry,__attribute__((__unused__)) static void hyperlinks_by_uri_tree_RB_INSERT_COLOR
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *parent, *gparent, *tmp; while (
(parent = (elm)->by_uri_entry.rbe_parent) && (parent
)->by_uri_entry.rbe_color == 1) { gparent = (parent)->by_uri_entry
.rbe_parent; if (parent == (gparent)->by_uri_entry.rbe_left
) { tmp = (gparent)->by_uri_entry.rbe_right; if (tmp &&
(tmp)->by_uri_entry.rbe_color == 1) { (tmp)->by_uri_entry
.rbe_color = 0; do { (parent)->by_uri_entry.rbe_color = 0;
(gparent)->by_uri_entry.rbe_color = 1; } while (0); elm =
gparent; continue; } if ((parent)->by_uri_entry.rbe_right
== elm) { do { (tmp) = (parent)->by_uri_entry.rbe_right; if
(((parent)->by_uri_entry.rbe_right = (tmp)->by_uri_entry
.rbe_left)) { ((tmp)->by_uri_entry.rbe_left)->by_uri_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (parent)->by_uri_entry.rbe_parent)) { if ((parent
) == ((parent)->by_uri_entry.rbe_parent)->by_uri_entry.
rbe_left) ((parent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_left = (parent); (parent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_uri_entry.rbe_color = 0; (gparent)->by_uri_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_uri_entry.rbe_left
; if (((gparent)->by_uri_entry.rbe_left = (tmp)->by_uri_entry
.rbe_right)) { ((tmp)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_parent = (gparent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (gparent)->by_uri_entry.rbe_parent)) { if ((
gparent) == ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left) ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((gparent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_right = (gparent); (gparent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); } else { tmp = (gparent)->by_uri_entry.rbe_left; if (tmp
&& (tmp)->by_uri_entry.rbe_color == 1) { (tmp)->
by_uri_entry.rbe_color = 0; do { (parent)->by_uri_entry.rbe_color
= 0; (gparent)->by_uri_entry.rbe_color = 1; } while (0); elm
= gparent; continue; } if ((parent)->by_uri_entry.rbe_left
== elm) { do { (tmp) = (parent)->by_uri_entry.rbe_left; if
(((parent)->by_uri_entry.rbe_left = (tmp)->by_uri_entry
.rbe_right)) { ((tmp)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (parent)->by_uri_entry.rbe_parent)) { if ((parent
) == ((parent)->by_uri_entry.rbe_parent)->by_uri_entry.
rbe_left) ((parent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_right = (parent); (parent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_uri_entry.rbe_color = 0; (gparent)->by_uri_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_uri_entry.rbe_right
; if (((gparent)->by_uri_entry.rbe_right = (tmp)->by_uri_entry
.rbe_left)) { ((tmp)->by_uri_entry.rbe_left)->by_uri_entry
.rbe_parent = (gparent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (gparent)->by_uri_entry.rbe_parent)) { if ((
gparent) == ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left) ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((gparent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_left = (gparent); (gparent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); } } (head->rbh_root)->by_uri_entry.rbe_color = 0; }
__attribute__((__unused__)) static void hyperlinks_by_uri_tree_RB_REMOVE_COLOR
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
parent, struct hyperlinks_uri *elm) { struct hyperlinks_uri *
tmp; while ((elm == ((void *)0) || (elm)->by_uri_entry.rbe_color
== 0) && elm != (head)->rbh_root) { if ((parent)->
by_uri_entry.rbe_left == elm) { tmp = (parent)->by_uri_entry
.rbe_right; if ((tmp)->by_uri_entry.rbe_color == 1) { do {
(tmp)->by_uri_entry.rbe_color = 0; (parent)->by_uri_entry
.rbe_color = 1; } while (0); do { (tmp) = (parent)->by_uri_entry
.rbe_right; if (((parent)->by_uri_entry.rbe_right = (tmp)->
by_uri_entry.rbe_left)) { ((tmp)->by_uri_entry.rbe_left)->
by_uri_entry.rbe_parent = (parent); } do {} while (0); if (((
tmp)->by_uri_entry.rbe_parent = (parent)->by_uri_entry.
rbe_parent)) { if ((parent) == ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (tmp); else ((parent)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (tmp); } else (head
)->rbh_root = (tmp); (tmp)->by_uri_entry.rbe_left = (parent
); (parent)->by_uri_entry.rbe_parent = (tmp); do {} while (
0); if (((tmp)->by_uri_entry.rbe_parent)) do {} while (0);
} while (0); tmp = (parent)->by_uri_entry.rbe_right; } if
(((tmp)->by_uri_entry.rbe_left == ((void *)0) || ((tmp)->
by_uri_entry.rbe_left)->by_uri_entry.rbe_color == 0) &&
((tmp)->by_uri_entry.rbe_right == ((void *)0) || ((tmp)->
by_uri_entry.rbe_right)->by_uri_entry.rbe_color == 0)) { (
tmp)->by_uri_entry.rbe_color = 1; elm = parent; parent = (
elm)->by_uri_entry.rbe_parent; } else { if ((tmp)->by_uri_entry
.rbe_right == ((void *)0) || ((tmp)->by_uri_entry.rbe_right
)->by_uri_entry.rbe_color == 0) { struct hyperlinks_uri *oleft
; if ((oleft = (tmp)->by_uri_entry.rbe_left)) (oleft)->
by_uri_entry.rbe_color = 0; (tmp)->by_uri_entry.rbe_color =
1; do { (oleft) = (tmp)->by_uri_entry.rbe_left; if (((tmp
)->by_uri_entry.rbe_left = (oleft)->by_uri_entry.rbe_right
)) { ((oleft)->by_uri_entry.rbe_right)->by_uri_entry.rbe_parent
= (tmp); } do {} while (0); if (((oleft)->by_uri_entry.rbe_parent
= (tmp)->by_uri_entry.rbe_parent)) { if ((tmp) == ((tmp)->
by_uri_entry.rbe_parent)->by_uri_entry.rbe_left) ((tmp)->
by_uri_entry.rbe_parent)->by_uri_entry.rbe_left = (oleft);
else ((tmp)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_right
= (oleft); } else (head)->rbh_root = (oleft); (oleft)->
by_uri_entry.rbe_right = (tmp); (tmp)->by_uri_entry.rbe_parent
= (oleft); do {} while (0); if (((oleft)->by_uri_entry.rbe_parent
)) do {} while (0); } while (0); tmp = (parent)->by_uri_entry
.rbe_right; } (tmp)->by_uri_entry.rbe_color = (parent)->
by_uri_entry.rbe_color; (parent)->by_uri_entry.rbe_color =
0; if ((tmp)->by_uri_entry.rbe_right) ((tmp)->by_uri_entry
.rbe_right)->by_uri_entry.rbe_color = 0; do { (tmp) = (parent
)->by_uri_entry.rbe_right; if (((parent)->by_uri_entry.
rbe_right = (tmp)->by_uri_entry.rbe_left)) { ((tmp)->by_uri_entry
.rbe_left)->by_uri_entry.rbe_parent = (parent); } do {} while
(0); if (((tmp)->by_uri_entry.rbe_parent = (parent)->by_uri_entry
.rbe_parent)) { if ((parent) == ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (tmp); else ((parent)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (tmp); } else (head
)->rbh_root = (tmp); (tmp)->by_uri_entry.rbe_left = (parent
); (parent)->by_uri_entry.rbe_parent = (tmp); do {} while (
0); if (((tmp)->by_uri_entry.rbe_parent)) do {} while (0);
} while (0); elm = (head)->rbh_root; break; } } else { tmp
= (parent)->by_uri_entry.rbe_left; if ((tmp)->by_uri_entry
.rbe_color == 1) { do { (tmp)->by_uri_entry.rbe_color = 0;
(parent)->by_uri_entry.rbe_color = 1; } while (0); do { (
tmp) = (parent)->by_uri_entry.rbe_left; if (((parent)->
by_uri_entry.rbe_left = (tmp)->by_uri_entry.rbe_right)) { (
(tmp)->by_uri_entry.rbe_right)->by_uri_entry.rbe_parent
= (parent); } do {} while (0); if (((tmp)->by_uri_entry.rbe_parent
= (parent)->by_uri_entry.rbe_parent)) { if ((parent) == (
(parent)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
) ((parent)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
= (tmp); else ((parent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_right = (tmp); } else (head)->rbh_root = (tmp); (tmp)
->by_uri_entry.rbe_right = (parent); (parent)->by_uri_entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent)) do {} while (0); } while (0); tmp = (parent)->
by_uri_entry.rbe_left; } if (((tmp)->by_uri_entry.rbe_left
== ((void *)0) || ((tmp)->by_uri_entry.rbe_left)->by_uri_entry
.rbe_color == 0) && ((tmp)->by_uri_entry.rbe_right
== ((void *)0) || ((tmp)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_color == 0)) { (tmp)->by_uri_entry.rbe_color = 1; elm
= parent; parent = (elm)->by_uri_entry.rbe_parent; } else
{ if ((tmp)->by_uri_entry.rbe_left == ((void *)0) || ((tmp
)->by_uri_entry.rbe_left)->by_uri_entry.rbe_color == 0)
{ struct hyperlinks_uri *oright; if ((oright = (tmp)->by_uri_entry
.rbe_right)) (oright)->by_uri_entry.rbe_color = 0; (tmp)->
by_uri_entry.rbe_color = 1; do { (oright) = (tmp)->by_uri_entry
.rbe_right; if (((tmp)->by_uri_entry.rbe_right = (oright)->
by_uri_entry.rbe_left)) { ((oright)->by_uri_entry.rbe_left
)->by_uri_entry.rbe_parent = (tmp); } do {} while (0); if (
((oright)->by_uri_entry.rbe_parent = (tmp)->by_uri_entry
.rbe_parent)) { if ((tmp) == ((tmp)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((tmp)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (oright); else ((tmp)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (oright); } else (head
)->rbh_root = (oright); (oright)->by_uri_entry.rbe_left
= (tmp); (tmp)->by_uri_entry.rbe_parent = (oright); do {}
while (0); if (((oright)->by_uri_entry.rbe_parent)) do {}
while (0); } while (0); tmp = (parent)->by_uri_entry.rbe_left
; } (tmp)->by_uri_entry.rbe_color = (parent)->by_uri_entry
.rbe_color; (parent)->by_uri_entry.rbe_color = 0; if ((tmp
)->by_uri_entry.rbe_left) ((tmp)->by_uri_entry.rbe_left
)->by_uri_entry.rbe_color = 0; do { (tmp) = (parent)->by_uri_entry
.rbe_left; if (((parent)->by_uri_entry.rbe_left = (tmp)->
by_uri_entry.rbe_right)) { ((tmp)->by_uri_entry.rbe_right)
->by_uri_entry.rbe_parent = (parent); } do {} while (0); if
(((tmp)->by_uri_entry.rbe_parent = (parent)->by_uri_entry
.rbe_parent)) { if ((parent) == ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (tmp); else ((parent)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (tmp); } else (head
)->rbh_root = (tmp); (tmp)->by_uri_entry.rbe_right = (parent
); (parent)->by_uri_entry.rbe_parent = (tmp); do {} while (
0); if (((tmp)->by_uri_entry.rbe_parent)) do {} while (0);
} while (0); elm = (head)->rbh_root; break; } } } if (elm
) (elm)->by_uri_entry.rbe_color = 0; } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_REMOVE
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *child, *parent, *old = elm; int
color; if ((elm)->by_uri_entry.rbe_left == ((void *)0)) child
= (elm)->by_uri_entry.rbe_right; else if ((elm)->by_uri_entry
.rbe_right == ((void *)0)) child = (elm)->by_uri_entry.rbe_left
; else { struct hyperlinks_uri *left; elm = (elm)->by_uri_entry
.rbe_right; while ((left = (elm)->by_uri_entry.rbe_left)) elm
= left; child = (elm)->by_uri_entry.rbe_right; parent = (
elm)->by_uri_entry.rbe_parent; color = (elm)->by_uri_entry
.rbe_color; if (child) (child)->by_uri_entry.rbe_parent = parent
; if (parent) { if ((parent)->by_uri_entry.rbe_left == elm
) (parent)->by_uri_entry.rbe_left = child; else (parent)->
by_uri_entry.rbe_right = child; do {} while (0); } else (head
)->rbh_root = child; if ((elm)->by_uri_entry.rbe_parent
== old) parent = elm; (elm)->by_uri_entry = (old)->by_uri_entry
; if ((old)->by_uri_entry.rbe_parent) { if (((old)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_left == old) ((old)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_left = elm; else ((old)->
by_uri_entry.rbe_parent)->by_uri_entry.rbe_right = elm; do
{} while (0); } else (head)->rbh_root = elm; ((old)->by_uri_entry
.rbe_left)->by_uri_entry.rbe_parent = elm; if ((old)->by_uri_entry
.rbe_right) ((old)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_parent = elm; if (parent) { left = parent; do { do {} while
(0); } while ((left = (left)->by_uri_entry.rbe_parent)); }
goto color; } parent = (elm)->by_uri_entry.rbe_parent; color
= (elm)->by_uri_entry.rbe_color; if (child) (child)->by_uri_entry
.rbe_parent = parent; if (parent) { if ((parent)->by_uri_entry
.rbe_left == elm) (parent)->by_uri_entry.rbe_left = child;
else (parent)->by_uri_entry.rbe_right = child; do {} while
(0); } else (head)->rbh_root = child; color: if (color ==
0) hyperlinks_by_uri_tree_RB_REMOVE_COLOR(head, parent, child
); return (old); } __attribute__((__unused__)) static struct hyperlinks_uri
* hyperlinks_by_uri_tree_RB_INSERT(struct hyperlinks_by_uri_tree
*head, struct hyperlinks_uri *elm) { struct hyperlinks_uri *
tmp; struct hyperlinks_uri *parent = ((void *)0); int comp = 0
; tmp = (head)->rbh_root; while (tmp) { parent = tmp; comp
= (hyperlinks_by_uri_cmp)(elm, parent); if (comp < 0) tmp
= (tmp)->by_uri_entry.rbe_left; else if (comp > 0) tmp
= (tmp)->by_uri_entry.rbe_right; else return (tmp); } do {
(elm)->by_uri_entry.rbe_parent = parent; (elm)->by_uri_entry
.rbe_left = (elm)->by_uri_entry.rbe_right = ((void *)0); (
elm)->by_uri_entry.rbe_color = 1; } while (0); if (parent !=
((void *)0)) { if (comp < 0) (parent)->by_uri_entry.rbe_left
= elm; else (parent)->by_uri_entry.rbe_right = elm; do {}
while (0); } else (head)->rbh_root = elm; hyperlinks_by_uri_tree_RB_INSERT_COLOR
(head, elm); return (((void *)0)); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_FIND
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *tmp = (head)->rbh_root; int comp
; while (tmp) { comp = hyperlinks_by_uri_cmp(elm, tmp); if (comp
< 0) tmp = (tmp)->by_uri_entry.rbe_left; else if (comp
> 0) tmp = (tmp)->by_uri_entry.rbe_right; else return (
tmp); } return (((void *)0)); } __attribute__((__unused__)) static
struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_NFIND(struct
hyperlinks_by_uri_tree *head, struct hyperlinks_uri *elm) { struct
hyperlinks_uri *tmp = (head)->rbh_root; struct hyperlinks_uri
*res = ((void *)0); int comp; while (tmp) { comp = hyperlinks_by_uri_cmp
(elm, tmp); if (comp < 0) { res = tmp; tmp = (tmp)->by_uri_entry
.rbe_left; } else if (comp > 0) tmp = (tmp)->by_uri_entry
.rbe_right; else return (tmp); } return (res); } __attribute__
((__unused__)) static struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_NEXT
(struct hyperlinks_uri *elm) { if ((elm)->by_uri_entry.rbe_right
) { elm = (elm)->by_uri_entry.rbe_right; while ((elm)->
by_uri_entry.rbe_left) elm = (elm)->by_uri_entry.rbe_left;
} else { if ((elm)->by_uri_entry.rbe_parent && (elm
== ((elm)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
)) elm = (elm)->by_uri_entry.rbe_parent; else { while ((elm
)->by_uri_entry.rbe_parent && (elm == ((elm)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right)) elm = (elm)->by_uri_entry
.rbe_parent; elm = (elm)->by_uri_entry.rbe_parent; } } return
(elm); } __attribute__((__unused__)) static struct hyperlinks_uri
* hyperlinks_by_uri_tree_RB_PREV(struct hyperlinks_uri *elm)
{ if ((elm)->by_uri_entry.rbe_left) { elm = (elm)->by_uri_entry
.rbe_left; while ((elm)->by_uri_entry.rbe_right) elm = (elm
)->by_uri_entry.rbe_right; } else { if ((elm)->by_uri_entry
.rbe_parent && (elm == ((elm)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right)) elm = (elm)->by_uri_entry.rbe_parent
; else { while ((elm)->by_uri_entry.rbe_parent && (
elm == ((elm)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
)) elm = (elm)->by_uri_entry.rbe_parent; elm = (elm)->by_uri_entry
.rbe_parent; } } return (elm); } __attribute__((__unused__)) static
struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_MINMAX(struct
hyperlinks_by_uri_tree *head, int val) { struct hyperlinks_uri
*tmp = (head)->rbh_root; struct hyperlinks_uri *parent = (
(void *)0); while (tmp) { parent = tmp; if (val < 0) tmp =
(tmp)->by_uri_entry.rbe_left; else tmp = (tmp)->by_uri_entry
.rbe_right; } return (parent); }
6
Loop condition is true. Entering loop body
7
Calling 'hyperlinks_by_uri_cmp'
100 hyperlinks_by_uri_cmp)__attribute__((__unused__)) static void hyperlinks_by_uri_tree_RB_INSERT_COLOR
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *parent, *gparent, *tmp; while (
(parent = (elm)->by_uri_entry.rbe_parent) && (parent
)->by_uri_entry.rbe_color == 1) { gparent = (parent)->by_uri_entry
.rbe_parent; if (parent == (gparent)->by_uri_entry.rbe_left
) { tmp = (gparent)->by_uri_entry.rbe_right; if (tmp &&
(tmp)->by_uri_entry.rbe_color == 1) { (tmp)->by_uri_entry
.rbe_color = 0; do { (parent)->by_uri_entry.rbe_color = 0;
(gparent)->by_uri_entry.rbe_color = 1; } while (0); elm =
gparent; continue; } if ((parent)->by_uri_entry.rbe_right
== elm) { do { (tmp) = (parent)->by_uri_entry.rbe_right; if
(((parent)->by_uri_entry.rbe_right = (tmp)->by_uri_entry
.rbe_left)) { ((tmp)->by_uri_entry.rbe_left)->by_uri_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (parent)->by_uri_entry.rbe_parent)) { if ((parent
) == ((parent)->by_uri_entry.rbe_parent)->by_uri_entry.
rbe_left) ((parent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_left = (parent); (parent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_uri_entry.rbe_color = 0; (gparent)->by_uri_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_uri_entry.rbe_left
; if (((gparent)->by_uri_entry.rbe_left = (tmp)->by_uri_entry
.rbe_right)) { ((tmp)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_parent = (gparent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (gparent)->by_uri_entry.rbe_parent)) { if ((
gparent) == ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left) ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((gparent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_right = (gparent); (gparent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); } else { tmp = (gparent)->by_uri_entry.rbe_left; if (tmp
&& (tmp)->by_uri_entry.rbe_color == 1) { (tmp)->
by_uri_entry.rbe_color = 0; do { (parent)->by_uri_entry.rbe_color
= 0; (gparent)->by_uri_entry.rbe_color = 1; } while (0); elm
= gparent; continue; } if ((parent)->by_uri_entry.rbe_left
== elm) { do { (tmp) = (parent)->by_uri_entry.rbe_left; if
(((parent)->by_uri_entry.rbe_left = (tmp)->by_uri_entry
.rbe_right)) { ((tmp)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (parent)->by_uri_entry.rbe_parent)) { if ((parent
) == ((parent)->by_uri_entry.rbe_parent)->by_uri_entry.
rbe_left) ((parent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_right = (parent); (parent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_uri_entry.rbe_color = 0; (gparent)->by_uri_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_uri_entry.rbe_right
; if (((gparent)->by_uri_entry.rbe_right = (tmp)->by_uri_entry
.rbe_left)) { ((tmp)->by_uri_entry.rbe_left)->by_uri_entry
.rbe_parent = (gparent); } do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent = (gparent)->by_uri_entry.rbe_parent)) { if ((
gparent) == ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left) ((gparent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_left = (tmp); else ((gparent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_uri_entry.rbe_left = (gparent); (gparent
)->by_uri_entry.rbe_parent = (tmp); do {} while (0); if ((
(tmp)->by_uri_entry.rbe_parent)) do {} while (0); } while (
0); } } (head->rbh_root)->by_uri_entry.rbe_color = 0; }
__attribute__((__unused__)) static void hyperlinks_by_uri_tree_RB_REMOVE_COLOR
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
parent, struct hyperlinks_uri *elm) { struct hyperlinks_uri *
tmp; while ((elm == ((void *)0) || (elm)->by_uri_entry.rbe_color
== 0) && elm != (head)->rbh_root) { if ((parent)->
by_uri_entry.rbe_left == elm) { tmp = (parent)->by_uri_entry
.rbe_right; if ((tmp)->by_uri_entry.rbe_color == 1) { do {
(tmp)->by_uri_entry.rbe_color = 0; (parent)->by_uri_entry
.rbe_color = 1; } while (0); do { (tmp) = (parent)->by_uri_entry
.rbe_right; if (((parent)->by_uri_entry.rbe_right = (tmp)->
by_uri_entry.rbe_left)) { ((tmp)->by_uri_entry.rbe_left)->
by_uri_entry.rbe_parent = (parent); } do {} while (0); if (((
tmp)->by_uri_entry.rbe_parent = (parent)->by_uri_entry.
rbe_parent)) { if ((parent) == ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (tmp); else ((parent)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (tmp); } else (head
)->rbh_root = (tmp); (tmp)->by_uri_entry.rbe_left = (parent
); (parent)->by_uri_entry.rbe_parent = (tmp); do {} while (
0); if (((tmp)->by_uri_entry.rbe_parent)) do {} while (0);
} while (0); tmp = (parent)->by_uri_entry.rbe_right; } if
(((tmp)->by_uri_entry.rbe_left == ((void *)0) || ((tmp)->
by_uri_entry.rbe_left)->by_uri_entry.rbe_color == 0) &&
((tmp)->by_uri_entry.rbe_right == ((void *)0) || ((tmp)->
by_uri_entry.rbe_right)->by_uri_entry.rbe_color == 0)) { (
tmp)->by_uri_entry.rbe_color = 1; elm = parent; parent = (
elm)->by_uri_entry.rbe_parent; } else { if ((tmp)->by_uri_entry
.rbe_right == ((void *)0) || ((tmp)->by_uri_entry.rbe_right
)->by_uri_entry.rbe_color == 0) { struct hyperlinks_uri *oleft
; if ((oleft = (tmp)->by_uri_entry.rbe_left)) (oleft)->
by_uri_entry.rbe_color = 0; (tmp)->by_uri_entry.rbe_color =
1; do { (oleft) = (tmp)->by_uri_entry.rbe_left; if (((tmp
)->by_uri_entry.rbe_left = (oleft)->by_uri_entry.rbe_right
)) { ((oleft)->by_uri_entry.rbe_right)->by_uri_entry.rbe_parent
= (tmp); } do {} while (0); if (((oleft)->by_uri_entry.rbe_parent
= (tmp)->by_uri_entry.rbe_parent)) { if ((tmp) == ((tmp)->
by_uri_entry.rbe_parent)->by_uri_entry.rbe_left) ((tmp)->
by_uri_entry.rbe_parent)->by_uri_entry.rbe_left = (oleft);
else ((tmp)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_right
= (oleft); } else (head)->rbh_root = (oleft); (oleft)->
by_uri_entry.rbe_right = (tmp); (tmp)->by_uri_entry.rbe_parent
= (oleft); do {} while (0); if (((oleft)->by_uri_entry.rbe_parent
)) do {} while (0); } while (0); tmp = (parent)->by_uri_entry
.rbe_right; } (tmp)->by_uri_entry.rbe_color = (parent)->
by_uri_entry.rbe_color; (parent)->by_uri_entry.rbe_color =
0; if ((tmp)->by_uri_entry.rbe_right) ((tmp)->by_uri_entry
.rbe_right)->by_uri_entry.rbe_color = 0; do { (tmp) = (parent
)->by_uri_entry.rbe_right; if (((parent)->by_uri_entry.
rbe_right = (tmp)->by_uri_entry.rbe_left)) { ((tmp)->by_uri_entry
.rbe_left)->by_uri_entry.rbe_parent = (parent); } do {} while
(0); if (((tmp)->by_uri_entry.rbe_parent = (parent)->by_uri_entry
.rbe_parent)) { if ((parent) == ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (tmp); else ((parent)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (tmp); } else (head
)->rbh_root = (tmp); (tmp)->by_uri_entry.rbe_left = (parent
); (parent)->by_uri_entry.rbe_parent = (tmp); do {} while (
0); if (((tmp)->by_uri_entry.rbe_parent)) do {} while (0);
} while (0); elm = (head)->rbh_root; break; } } else { tmp
= (parent)->by_uri_entry.rbe_left; if ((tmp)->by_uri_entry
.rbe_color == 1) { do { (tmp)->by_uri_entry.rbe_color = 0;
(parent)->by_uri_entry.rbe_color = 1; } while (0); do { (
tmp) = (parent)->by_uri_entry.rbe_left; if (((parent)->
by_uri_entry.rbe_left = (tmp)->by_uri_entry.rbe_right)) { (
(tmp)->by_uri_entry.rbe_right)->by_uri_entry.rbe_parent
= (parent); } do {} while (0); if (((tmp)->by_uri_entry.rbe_parent
= (parent)->by_uri_entry.rbe_parent)) { if ((parent) == (
(parent)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
) ((parent)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
= (tmp); else ((parent)->by_uri_entry.rbe_parent)->by_uri_entry
.rbe_right = (tmp); } else (head)->rbh_root = (tmp); (tmp)
->by_uri_entry.rbe_right = (parent); (parent)->by_uri_entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->by_uri_entry
.rbe_parent)) do {} while (0); } while (0); tmp = (parent)->
by_uri_entry.rbe_left; } if (((tmp)->by_uri_entry.rbe_left
== ((void *)0) || ((tmp)->by_uri_entry.rbe_left)->by_uri_entry
.rbe_color == 0) && ((tmp)->by_uri_entry.rbe_right
== ((void *)0) || ((tmp)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_color == 0)) { (tmp)->by_uri_entry.rbe_color = 1; elm
= parent; parent = (elm)->by_uri_entry.rbe_parent; } else
{ if ((tmp)->by_uri_entry.rbe_left == ((void *)0) || ((tmp
)->by_uri_entry.rbe_left)->by_uri_entry.rbe_color == 0)
{ struct hyperlinks_uri *oright; if ((oright = (tmp)->by_uri_entry
.rbe_right)) (oright)->by_uri_entry.rbe_color = 0; (tmp)->
by_uri_entry.rbe_color = 1; do { (oright) = (tmp)->by_uri_entry
.rbe_right; if (((tmp)->by_uri_entry.rbe_right = (oright)->
by_uri_entry.rbe_left)) { ((oright)->by_uri_entry.rbe_left
)->by_uri_entry.rbe_parent = (tmp); } do {} while (0); if (
((oright)->by_uri_entry.rbe_parent = (tmp)->by_uri_entry
.rbe_parent)) { if ((tmp) == ((tmp)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((tmp)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (oright); else ((tmp)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (oright); } else (head
)->rbh_root = (oright); (oright)->by_uri_entry.rbe_left
= (tmp); (tmp)->by_uri_entry.rbe_parent = (oright); do {}
while (0); if (((oright)->by_uri_entry.rbe_parent)) do {}
while (0); } while (0); tmp = (parent)->by_uri_entry.rbe_left
; } (tmp)->by_uri_entry.rbe_color = (parent)->by_uri_entry
.rbe_color; (parent)->by_uri_entry.rbe_color = 0; if ((tmp
)->by_uri_entry.rbe_left) ((tmp)->by_uri_entry.rbe_left
)->by_uri_entry.rbe_color = 0; do { (tmp) = (parent)->by_uri_entry
.rbe_left; if (((parent)->by_uri_entry.rbe_left = (tmp)->
by_uri_entry.rbe_right)) { ((tmp)->by_uri_entry.rbe_right)
->by_uri_entry.rbe_parent = (parent); } do {} while (0); if
(((tmp)->by_uri_entry.rbe_parent = (parent)->by_uri_entry
.rbe_parent)) { if ((parent) == ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left) ((parent)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_left = (tmp); else ((parent)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right = (tmp); } else (head
)->rbh_root = (tmp); (tmp)->by_uri_entry.rbe_right = (parent
); (parent)->by_uri_entry.rbe_parent = (tmp); do {} while (
0); if (((tmp)->by_uri_entry.rbe_parent)) do {} while (0);
} while (0); elm = (head)->rbh_root; break; } } } if (elm
) (elm)->by_uri_entry.rbe_color = 0; } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_REMOVE
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *child, *parent, *old = elm; int
color; if ((elm)->by_uri_entry.rbe_left == ((void *)0)) child
= (elm)->by_uri_entry.rbe_right; else if ((elm)->by_uri_entry
.rbe_right == ((void *)0)) child = (elm)->by_uri_entry.rbe_left
; else { struct hyperlinks_uri *left; elm = (elm)->by_uri_entry
.rbe_right; while ((left = (elm)->by_uri_entry.rbe_left)) elm
= left; child = (elm)->by_uri_entry.rbe_right; parent = (
elm)->by_uri_entry.rbe_parent; color = (elm)->by_uri_entry
.rbe_color; if (child) (child)->by_uri_entry.rbe_parent = parent
; if (parent) { if ((parent)->by_uri_entry.rbe_left == elm
) (parent)->by_uri_entry.rbe_left = child; else (parent)->
by_uri_entry.rbe_right = child; do {} while (0); } else (head
)->rbh_root = child; if ((elm)->by_uri_entry.rbe_parent
== old) parent = elm; (elm)->by_uri_entry = (old)->by_uri_entry
; if ((old)->by_uri_entry.rbe_parent) { if (((old)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_left == old) ((old)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_left = elm; else ((old)->
by_uri_entry.rbe_parent)->by_uri_entry.rbe_right = elm; do
{} while (0); } else (head)->rbh_root = elm; ((old)->by_uri_entry
.rbe_left)->by_uri_entry.rbe_parent = elm; if ((old)->by_uri_entry
.rbe_right) ((old)->by_uri_entry.rbe_right)->by_uri_entry
.rbe_parent = elm; if (parent) { left = parent; do { do {} while
(0); } while ((left = (left)->by_uri_entry.rbe_parent)); }
goto color; } parent = (elm)->by_uri_entry.rbe_parent; color
= (elm)->by_uri_entry.rbe_color; if (child) (child)->by_uri_entry
.rbe_parent = parent; if (parent) { if ((parent)->by_uri_entry
.rbe_left == elm) (parent)->by_uri_entry.rbe_left = child;
else (parent)->by_uri_entry.rbe_right = child; do {} while
(0); } else (head)->rbh_root = child; color: if (color ==
0) hyperlinks_by_uri_tree_RB_REMOVE_COLOR(head, parent, child
); return (old); } __attribute__((__unused__)) static struct hyperlinks_uri
* hyperlinks_by_uri_tree_RB_INSERT(struct hyperlinks_by_uri_tree
*head, struct hyperlinks_uri *elm) { struct hyperlinks_uri *
tmp; struct hyperlinks_uri *parent = ((void *)0); int comp = 0
; tmp = (head)->rbh_root; while (tmp) { parent = tmp; comp
= (hyperlinks_by_uri_cmp)(elm, parent); if (comp < 0) tmp
= (tmp)->by_uri_entry.rbe_left; else if (comp > 0) tmp
= (tmp)->by_uri_entry.rbe_right; else return (tmp); } do {
(elm)->by_uri_entry.rbe_parent = parent; (elm)->by_uri_entry
.rbe_left = (elm)->by_uri_entry.rbe_right = ((void *)0); (
elm)->by_uri_entry.rbe_color = 1; } while (0); if (parent !=
((void *)0)) { if (comp < 0) (parent)->by_uri_entry.rbe_left
= elm; else (parent)->by_uri_entry.rbe_right = elm; do {}
while (0); } else (head)->rbh_root = elm; hyperlinks_by_uri_tree_RB_INSERT_COLOR
(head, elm); return (((void *)0)); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_FIND
(struct hyperlinks_by_uri_tree *head, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *tmp = (head)->rbh_root; int comp
; while (tmp) { comp = hyperlinks_by_uri_cmp(elm, tmp); if (comp
< 0) tmp = (tmp)->by_uri_entry.rbe_left; else if (comp
> 0) tmp = (tmp)->by_uri_entry.rbe_right; else return (
tmp); } return (((void *)0)); } __attribute__((__unused__)) static
struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_NFIND(struct
hyperlinks_by_uri_tree *head, struct hyperlinks_uri *elm) { struct
hyperlinks_uri *tmp = (head)->rbh_root; struct hyperlinks_uri
*res = ((void *)0); int comp; while (tmp) { comp = hyperlinks_by_uri_cmp
(elm, tmp); if (comp < 0) { res = tmp; tmp = (tmp)->by_uri_entry
.rbe_left; } else if (comp > 0) tmp = (tmp)->by_uri_entry
.rbe_right; else return (tmp); } return (res); } __attribute__
((__unused__)) static struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_NEXT
(struct hyperlinks_uri *elm) { if ((elm)->by_uri_entry.rbe_right
) { elm = (elm)->by_uri_entry.rbe_right; while ((elm)->
by_uri_entry.rbe_left) elm = (elm)->by_uri_entry.rbe_left;
} else { if ((elm)->by_uri_entry.rbe_parent && (elm
== ((elm)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
)) elm = (elm)->by_uri_entry.rbe_parent; else { while ((elm
)->by_uri_entry.rbe_parent && (elm == ((elm)->by_uri_entry
.rbe_parent)->by_uri_entry.rbe_right)) elm = (elm)->by_uri_entry
.rbe_parent; elm = (elm)->by_uri_entry.rbe_parent; } } return
(elm); } __attribute__((__unused__)) static struct hyperlinks_uri
* hyperlinks_by_uri_tree_RB_PREV(struct hyperlinks_uri *elm)
{ if ((elm)->by_uri_entry.rbe_left) { elm = (elm)->by_uri_entry
.rbe_left; while ((elm)->by_uri_entry.rbe_right) elm = (elm
)->by_uri_entry.rbe_right; } else { if ((elm)->by_uri_entry
.rbe_parent && (elm == ((elm)->by_uri_entry.rbe_parent
)->by_uri_entry.rbe_right)) elm = (elm)->by_uri_entry.rbe_parent
; else { while ((elm)->by_uri_entry.rbe_parent && (
elm == ((elm)->by_uri_entry.rbe_parent)->by_uri_entry.rbe_left
)) elm = (elm)->by_uri_entry.rbe_parent; elm = (elm)->by_uri_entry
.rbe_parent; } } return (elm); } __attribute__((__unused__)) static
struct hyperlinks_uri * hyperlinks_by_uri_tree_RB_MINMAX(struct
hyperlinks_by_uri_tree *head, int val) { struct hyperlinks_uri
*tmp = (head)->rbh_root; struct hyperlinks_uri *parent = (
(void *)0); while (tmp) { parent = tmp; if (val < 0) tmp =
(tmp)->by_uri_entry.rbe_left; else tmp = (tmp)->by_uri_entry
.rbe_right; } return (parent); }
;
101
102static int
103hyperlinks_by_inner_cmp(struct hyperlinks_uri *left,
104 struct hyperlinks_uri *right)
105{
106 return (left->inner - right->inner);
107}
108RB_PROTOTYPE_STATIC(hyperlinks_by_inner_tree, hyperlinks_uri, by_inner_entry,__attribute__((__unused__)) static void hyperlinks_by_inner_tree_RB_INSERT_COLOR
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *);
__attribute__((__unused__)) static void hyperlinks_by_inner_tree_RB_REMOVE_COLOR
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *, struct
hyperlinks_uri *);__attribute__((__unused__)) static struct hyperlinks_uri
*hyperlinks_by_inner_tree_RB_REMOVE(struct hyperlinks_by_inner_tree
*, struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_INSERT(struct
hyperlinks_by_inner_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_FIND
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *);
__attribute__((__unused__)) static struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_NFIND
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *);
__attribute__((__unused__)) static struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_NEXT
(struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_PREV(struct
hyperlinks_uri *); __attribute__((__unused__)) static struct
hyperlinks_uri *hyperlinks_by_inner_tree_RB_MINMAX(struct hyperlinks_by_inner_tree
*, int);
109 hyperlinks_by_inner_cmp)__attribute__((__unused__)) static void hyperlinks_by_inner_tree_RB_INSERT_COLOR
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *);
__attribute__((__unused__)) static void hyperlinks_by_inner_tree_RB_REMOVE_COLOR
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *, struct
hyperlinks_uri *);__attribute__((__unused__)) static struct hyperlinks_uri
*hyperlinks_by_inner_tree_RB_REMOVE(struct hyperlinks_by_inner_tree
*, struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_INSERT(struct
hyperlinks_by_inner_tree *, struct hyperlinks_uri *); __attribute__
((__unused__)) static struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_FIND
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *);
__attribute__((__unused__)) static struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_NFIND
(struct hyperlinks_by_inner_tree *, struct hyperlinks_uri *);
__attribute__((__unused__)) static struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_NEXT
(struct hyperlinks_uri *); __attribute__((__unused__)) static
struct hyperlinks_uri *hyperlinks_by_inner_tree_RB_PREV(struct
hyperlinks_uri *); __attribute__((__unused__)) static struct
hyperlinks_uri *hyperlinks_by_inner_tree_RB_MINMAX(struct hyperlinks_by_inner_tree
*, int);
;
110RB_GENERATE_STATIC(hyperlinks_by_inner_tree, hyperlinks_uri, by_inner_entry,__attribute__((__unused__)) static void hyperlinks_by_inner_tree_RB_INSERT_COLOR
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *parent, *gparent, *tmp; while
((parent = (elm)->by_inner_entry.rbe_parent) && (
parent)->by_inner_entry.rbe_color == 1) { gparent = (parent
)->by_inner_entry.rbe_parent; if (parent == (gparent)->
by_inner_entry.rbe_left) { tmp = (gparent)->by_inner_entry
.rbe_right; if (tmp && (tmp)->by_inner_entry.rbe_color
== 1) { (tmp)->by_inner_entry.rbe_color = 0; do { (parent
)->by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry
.rbe_color = 1; } while (0); elm = gparent; continue; } if ((
parent)->by_inner_entry.rbe_right == elm) { do { (tmp) = (
parent)->by_inner_entry.rbe_right; if (((parent)->by_inner_entry
.rbe_right = (tmp)->by_inner_entry.rbe_left)) { ((tmp)->
by_inner_entry.rbe_left)->by_inner_entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
= (parent)->by_inner_entry.rbe_parent)) { if ((parent) ==
((parent)->by_inner_entry.rbe_parent)->by_inner_entry.
rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_left = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_inner_entry.
rbe_left; if (((gparent)->by_inner_entry.rbe_left = (tmp)->
by_inner_entry.rbe_right)) { ((tmp)->by_inner_entry.rbe_right
)->by_inner_entry.rbe_parent = (gparent); } do {} while (0
); if (((tmp)->by_inner_entry.rbe_parent = (gparent)->by_inner_entry
.rbe_parent)) { if ((gparent) == ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left) ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left = (tmp); else ((gparent
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->by_inner_entry
.rbe_right = (gparent); (gparent)->by_inner_entry.rbe_parent
= (tmp); do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
)) do {} while (0); } while (0); } else { tmp = (gparent)->
by_inner_entry.rbe_left; if (tmp && (tmp)->by_inner_entry
.rbe_color == 1) { (tmp)->by_inner_entry.rbe_color = 0; do
{ (parent)->by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry
.rbe_color = 1; } while (0); elm = gparent; continue; } if ((
parent)->by_inner_entry.rbe_left == elm) { do { (tmp) = (parent
)->by_inner_entry.rbe_left; if (((parent)->by_inner_entry
.rbe_left = (tmp)->by_inner_entry.rbe_right)) { ((tmp)->
by_inner_entry.rbe_right)->by_inner_entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
= (parent)->by_inner_entry.rbe_parent)) { if ((parent) ==
((parent)->by_inner_entry.rbe_parent)->by_inner_entry.
rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_right = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_inner_entry.
rbe_right; if (((gparent)->by_inner_entry.rbe_right = (tmp
)->by_inner_entry.rbe_left)) { ((tmp)->by_inner_entry.rbe_left
)->by_inner_entry.rbe_parent = (gparent); } do {} while (0
); if (((tmp)->by_inner_entry.rbe_parent = (gparent)->by_inner_entry
.rbe_parent)) { if ((gparent) == ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left) ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left = (tmp); else ((gparent
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->by_inner_entry
.rbe_left = (gparent); (gparent)->by_inner_entry.rbe_parent
= (tmp); do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
)) do {} while (0); } while (0); } } (head->rbh_root)->
by_inner_entry.rbe_color = 0; } __attribute__((__unused__)) static
void hyperlinks_by_inner_tree_RB_REMOVE_COLOR(struct hyperlinks_by_inner_tree
*head, struct hyperlinks_uri *parent, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *tmp; while ((elm == ((void *)0)
|| (elm)->by_inner_entry.rbe_color == 0) && elm !=
(head)->rbh_root) { if ((parent)->by_inner_entry.rbe_left
== elm) { tmp = (parent)->by_inner_entry.rbe_right; if ((
tmp)->by_inner_entry.rbe_color == 1) { do { (tmp)->by_inner_entry
.rbe_color = 0; (parent)->by_inner_entry.rbe_color = 1; } while
(0); do { (tmp) = (parent)->by_inner_entry.rbe_right; if (
((parent)->by_inner_entry.rbe_right = (tmp)->by_inner_entry
.rbe_left)) { ((tmp)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_inner_entry
.rbe_parent = (parent)->by_inner_entry.rbe_parent)) { if (
(parent) == ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_left = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = (parent)->by_inner_entry.rbe_right; } if (((tmp
)->by_inner_entry.rbe_left == ((void *)0) || ((tmp)->by_inner_entry
.rbe_left)->by_inner_entry.rbe_color == 0) && ((tmp
)->by_inner_entry.rbe_right == ((void *)0) || ((tmp)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_color == 0)) { (tmp)->by_inner_entry
.rbe_color = 1; elm = parent; parent = (elm)->by_inner_entry
.rbe_parent; } else { if ((tmp)->by_inner_entry.rbe_right ==
((void *)0) || ((tmp)->by_inner_entry.rbe_right)->by_inner_entry
.rbe_color == 0) { struct hyperlinks_uri *oleft; if ((oleft =
(tmp)->by_inner_entry.rbe_left)) (oleft)->by_inner_entry
.rbe_color = 0; (tmp)->by_inner_entry.rbe_color = 1; do { (
oleft) = (tmp)->by_inner_entry.rbe_left; if (((tmp)->by_inner_entry
.rbe_left = (oleft)->by_inner_entry.rbe_right)) { ((oleft)
->by_inner_entry.rbe_right)->by_inner_entry.rbe_parent =
(tmp); } do {} while (0); if (((oleft)->by_inner_entry.rbe_parent
= (tmp)->by_inner_entry.rbe_parent)) { if ((tmp) == ((tmp
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left)
((tmp)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left
= (oleft); else ((tmp)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_right = (oleft); } else (head)->rbh_root = (oleft); (
oleft)->by_inner_entry.rbe_right = (tmp); (tmp)->by_inner_entry
.rbe_parent = (oleft); do {} while (0); if (((oleft)->by_inner_entry
.rbe_parent)) do {} while (0); } while (0); tmp = (parent)->
by_inner_entry.rbe_right; } (tmp)->by_inner_entry.rbe_color
= (parent)->by_inner_entry.rbe_color; (parent)->by_inner_entry
.rbe_color = 0; if ((tmp)->by_inner_entry.rbe_right) ((tmp
)->by_inner_entry.rbe_right)->by_inner_entry.rbe_color =
0; do { (tmp) = (parent)->by_inner_entry.rbe_right; if ((
(parent)->by_inner_entry.rbe_right = (tmp)->by_inner_entry
.rbe_left)) { ((tmp)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_inner_entry
.rbe_parent = (parent)->by_inner_entry.rbe_parent)) { if (
(parent) == ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_left = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); elm = (head)->rbh_root; break; } } else { tmp = (parent
)->by_inner_entry.rbe_left; if ((tmp)->by_inner_entry.rbe_color
== 1) { do { (tmp)->by_inner_entry.rbe_color = 0; (parent
)->by_inner_entry.rbe_color = 1; } while (0); do { (tmp) =
(parent)->by_inner_entry.rbe_left; if (((parent)->by_inner_entry
.rbe_left = (tmp)->by_inner_entry.rbe_right)) { ((tmp)->
by_inner_entry.rbe_right)->by_inner_entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
= (parent)->by_inner_entry.rbe_parent)) { if ((parent) ==
((parent)->by_inner_entry.rbe_parent)->by_inner_entry.
rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_right = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = (parent)->by_inner_entry.rbe_left; } if (((tmp
)->by_inner_entry.rbe_left == ((void *)0) || ((tmp)->by_inner_entry
.rbe_left)->by_inner_entry.rbe_color == 0) && ((tmp
)->by_inner_entry.rbe_right == ((void *)0) || ((tmp)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_color == 0)) { (tmp)->by_inner_entry
.rbe_color = 1; elm = parent; parent = (elm)->by_inner_entry
.rbe_parent; } else { if ((tmp)->by_inner_entry.rbe_left ==
((void *)0) || ((tmp)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_color == 0) { struct hyperlinks_uri *oright; if ((oright
= (tmp)->by_inner_entry.rbe_right)) (oright)->by_inner_entry
.rbe_color = 0; (tmp)->by_inner_entry.rbe_color = 1; do { (
oright) = (tmp)->by_inner_entry.rbe_right; if (((tmp)->
by_inner_entry.rbe_right = (oright)->by_inner_entry.rbe_left
)) { ((oright)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_parent = (tmp); } do {} while (0); if (((oright)->by_inner_entry
.rbe_parent = (tmp)->by_inner_entry.rbe_parent)) { if ((tmp
) == ((tmp)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left) ((tmp)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (oright); else ((tmp)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (oright); } else (head)->
rbh_root = (oright); (oright)->by_inner_entry.rbe_left = (
tmp); (tmp)->by_inner_entry.rbe_parent = (oright); do {} while
(0); if (((oright)->by_inner_entry.rbe_parent)) do {} while
(0); } while (0); tmp = (parent)->by_inner_entry.rbe_left
; } (tmp)->by_inner_entry.rbe_color = (parent)->by_inner_entry
.rbe_color; (parent)->by_inner_entry.rbe_color = 0; if ((tmp
)->by_inner_entry.rbe_left) ((tmp)->by_inner_entry.rbe_left
)->by_inner_entry.rbe_color = 0; do { (tmp) = (parent)->
by_inner_entry.rbe_left; if (((parent)->by_inner_entry.rbe_left
= (tmp)->by_inner_entry.rbe_right)) { ((tmp)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_parent = (parent); } do {}
while (0); if (((tmp)->by_inner_entry.rbe_parent = (parent
)->by_inner_entry.rbe_parent)) { if ((parent) == ((parent)
->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left) (
(parent)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left
= (tmp); else ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_right = (tmp); } else (head)->rbh_root = (tmp); (tmp)
->by_inner_entry.rbe_right = (parent); (parent)->by_inner_entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->by_inner_entry
.rbe_parent)) do {} while (0); } while (0); elm = (head)->
rbh_root; break; } } } if (elm) (elm)->by_inner_entry.rbe_color
= 0; } __attribute__((__unused__)) static struct hyperlinks_uri
* hyperlinks_by_inner_tree_RB_REMOVE(struct hyperlinks_by_inner_tree
*head, struct hyperlinks_uri *elm) { struct hyperlinks_uri *
child, *parent, *old = elm; int color; if ((elm)->by_inner_entry
.rbe_left == ((void *)0)) child = (elm)->by_inner_entry.rbe_right
; else if ((elm)->by_inner_entry.rbe_right == ((void *)0))
child = (elm)->by_inner_entry.rbe_left; else { struct hyperlinks_uri
*left; elm = (elm)->by_inner_entry.rbe_right; while ((left
= (elm)->by_inner_entry.rbe_left)) elm = left; child = (elm
)->by_inner_entry.rbe_right; parent = (elm)->by_inner_entry
.rbe_parent; color = (elm)->by_inner_entry.rbe_color; if (
child) (child)->by_inner_entry.rbe_parent = parent; if (parent
) { if ((parent)->by_inner_entry.rbe_left == elm) (parent)
->by_inner_entry.rbe_left = child; else (parent)->by_inner_entry
.rbe_right = child; do {} while (0); } else (head)->rbh_root
= child; if ((elm)->by_inner_entry.rbe_parent == old) parent
= elm; (elm)->by_inner_entry = (old)->by_inner_entry; if
((old)->by_inner_entry.rbe_parent) { if (((old)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left == old) ((old)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left = elm; else ((old)->
by_inner_entry.rbe_parent)->by_inner_entry.rbe_right = elm
; do {} while (0); } else (head)->rbh_root = elm; ((old)->
by_inner_entry.rbe_left)->by_inner_entry.rbe_parent = elm;
if ((old)->by_inner_entry.rbe_right) ((old)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_parent = elm; if (parent) {
left = parent; do { do {} while (0); } while ((left = (left)
->by_inner_entry.rbe_parent)); } goto color; } parent = (elm
)->by_inner_entry.rbe_parent; color = (elm)->by_inner_entry
.rbe_color; if (child) (child)->by_inner_entry.rbe_parent =
parent; if (parent) { if ((parent)->by_inner_entry.rbe_left
== elm) (parent)->by_inner_entry.rbe_left = child; else (
parent)->by_inner_entry.rbe_right = child; do {} while (0)
; } else (head)->rbh_root = child; color: if (color == 0) hyperlinks_by_inner_tree_RB_REMOVE_COLOR
(head, parent, child); return (old); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_INSERT
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *tmp; struct hyperlinks_uri *parent
= ((void *)0); int comp = 0; tmp = (head)->rbh_root; while
(tmp) { parent = tmp; comp = (hyperlinks_by_inner_cmp)(elm, parent
); if (comp < 0) tmp = (tmp)->by_inner_entry.rbe_left; else
if (comp > 0) tmp = (tmp)->by_inner_entry.rbe_right; else
return (tmp); } do { (elm)->by_inner_entry.rbe_parent = parent
; (elm)->by_inner_entry.rbe_left = (elm)->by_inner_entry
.rbe_right = ((void *)0); (elm)->by_inner_entry.rbe_color =
1; } while (0); if (parent != ((void *)0)) { if (comp < 0
) (parent)->by_inner_entry.rbe_left = elm; else (parent)->
by_inner_entry.rbe_right = elm; do {} while (0); } else (head
)->rbh_root = elm; hyperlinks_by_inner_tree_RB_INSERT_COLOR
(head, elm); return (((void *)0)); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_FIND
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *tmp = (head)->rbh_root; int
comp; while (tmp) { comp = hyperlinks_by_inner_cmp(elm, tmp)
; if (comp < 0) tmp = (tmp)->by_inner_entry.rbe_left; else
if (comp > 0) tmp = (tmp)->by_inner_entry.rbe_right; else
return (tmp); } return (((void *)0)); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_NFIND
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *tmp = (head)->rbh_root; struct
hyperlinks_uri *res = ((void *)0); int comp; while (tmp) { comp
= hyperlinks_by_inner_cmp(elm, tmp); if (comp < 0) { res =
tmp; tmp = (tmp)->by_inner_entry.rbe_left; } else if (comp
> 0) tmp = (tmp)->by_inner_entry.rbe_right; else return
(tmp); } return (res); } __attribute__((__unused__)) static struct
hyperlinks_uri * hyperlinks_by_inner_tree_RB_NEXT(struct hyperlinks_uri
*elm) { if ((elm)->by_inner_entry.rbe_right) { elm = (elm
)->by_inner_entry.rbe_right; while ((elm)->by_inner_entry
.rbe_left) elm = (elm)->by_inner_entry.rbe_left; } else { if
((elm)->by_inner_entry.rbe_parent && (elm == ((elm
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left)
) elm = (elm)->by_inner_entry.rbe_parent; else { while ((elm
)->by_inner_entry.rbe_parent && (elm == ((elm)->
by_inner_entry.rbe_parent)->by_inner_entry.rbe_right)) elm
= (elm)->by_inner_entry.rbe_parent; elm = (elm)->by_inner_entry
.rbe_parent; } } return (elm); } __attribute__((__unused__)) static
struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_PREV(struct
hyperlinks_uri *elm) { if ((elm)->by_inner_entry.rbe_left
) { elm = (elm)->by_inner_entry.rbe_left; while ((elm)->
by_inner_entry.rbe_right) elm = (elm)->by_inner_entry.rbe_right
; } else { if ((elm)->by_inner_entry.rbe_parent &&
(elm == ((elm)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_right)) elm = (elm)->by_inner_entry.rbe_parent; else {
while ((elm)->by_inner_entry.rbe_parent && (elm ==
((elm)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left
)) elm = (elm)->by_inner_entry.rbe_parent; elm = (elm)->
by_inner_entry.rbe_parent; } } return (elm); } __attribute__(
(__unused__)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_MINMAX
(struct hyperlinks_by_inner_tree *head, int val) { struct hyperlinks_uri
*tmp = (head)->rbh_root; struct hyperlinks_uri *parent = (
(void *)0); while (tmp) { parent = tmp; if (val < 0) tmp =
(tmp)->by_inner_entry.rbe_left; else tmp = (tmp)->by_inner_entry
.rbe_right; } return (parent); }
111 hyperlinks_by_inner_cmp)__attribute__((__unused__)) static void hyperlinks_by_inner_tree_RB_INSERT_COLOR
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *parent, *gparent, *tmp; while
((parent = (elm)->by_inner_entry.rbe_parent) && (
parent)->by_inner_entry.rbe_color == 1) { gparent = (parent
)->by_inner_entry.rbe_parent; if (parent == (gparent)->
by_inner_entry.rbe_left) { tmp = (gparent)->by_inner_entry
.rbe_right; if (tmp && (tmp)->by_inner_entry.rbe_color
== 1) { (tmp)->by_inner_entry.rbe_color = 0; do { (parent
)->by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry
.rbe_color = 1; } while (0); elm = gparent; continue; } if ((
parent)->by_inner_entry.rbe_right == elm) { do { (tmp) = (
parent)->by_inner_entry.rbe_right; if (((parent)->by_inner_entry
.rbe_right = (tmp)->by_inner_entry.rbe_left)) { ((tmp)->
by_inner_entry.rbe_left)->by_inner_entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
= (parent)->by_inner_entry.rbe_parent)) { if ((parent) ==
((parent)->by_inner_entry.rbe_parent)->by_inner_entry.
rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_left = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_inner_entry.
rbe_left; if (((gparent)->by_inner_entry.rbe_left = (tmp)->
by_inner_entry.rbe_right)) { ((tmp)->by_inner_entry.rbe_right
)->by_inner_entry.rbe_parent = (gparent); } do {} while (0
); if (((tmp)->by_inner_entry.rbe_parent = (gparent)->by_inner_entry
.rbe_parent)) { if ((gparent) == ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left) ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left = (tmp); else ((gparent
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->by_inner_entry
.rbe_right = (gparent); (gparent)->by_inner_entry.rbe_parent
= (tmp); do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
)) do {} while (0); } while (0); } else { tmp = (gparent)->
by_inner_entry.rbe_left; if (tmp && (tmp)->by_inner_entry
.rbe_color == 1) { (tmp)->by_inner_entry.rbe_color = 0; do
{ (parent)->by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry
.rbe_color = 1; } while (0); elm = gparent; continue; } if ((
parent)->by_inner_entry.rbe_left == elm) { do { (tmp) = (parent
)->by_inner_entry.rbe_left; if (((parent)->by_inner_entry
.rbe_left = (tmp)->by_inner_entry.rbe_right)) { ((tmp)->
by_inner_entry.rbe_right)->by_inner_entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
= (parent)->by_inner_entry.rbe_parent)) { if ((parent) ==
((parent)->by_inner_entry.rbe_parent)->by_inner_entry.
rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_right = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = parent; parent = elm; elm = tmp; } do { (parent)->
by_inner_entry.rbe_color = 0; (gparent)->by_inner_entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->by_inner_entry.
rbe_right; if (((gparent)->by_inner_entry.rbe_right = (tmp
)->by_inner_entry.rbe_left)) { ((tmp)->by_inner_entry.rbe_left
)->by_inner_entry.rbe_parent = (gparent); } do {} while (0
); if (((tmp)->by_inner_entry.rbe_parent = (gparent)->by_inner_entry
.rbe_parent)) { if ((gparent) == ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left) ((gparent)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left = (tmp); else ((gparent
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->by_inner_entry
.rbe_left = (gparent); (gparent)->by_inner_entry.rbe_parent
= (tmp); do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
)) do {} while (0); } while (0); } } (head->rbh_root)->
by_inner_entry.rbe_color = 0; } __attribute__((__unused__)) static
void hyperlinks_by_inner_tree_RB_REMOVE_COLOR(struct hyperlinks_by_inner_tree
*head, struct hyperlinks_uri *parent, struct hyperlinks_uri *
elm) { struct hyperlinks_uri *tmp; while ((elm == ((void *)0)
|| (elm)->by_inner_entry.rbe_color == 0) && elm !=
(head)->rbh_root) { if ((parent)->by_inner_entry.rbe_left
== elm) { tmp = (parent)->by_inner_entry.rbe_right; if ((
tmp)->by_inner_entry.rbe_color == 1) { do { (tmp)->by_inner_entry
.rbe_color = 0; (parent)->by_inner_entry.rbe_color = 1; } while
(0); do { (tmp) = (parent)->by_inner_entry.rbe_right; if (
((parent)->by_inner_entry.rbe_right = (tmp)->by_inner_entry
.rbe_left)) { ((tmp)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_inner_entry
.rbe_parent = (parent)->by_inner_entry.rbe_parent)) { if (
(parent) == ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_left = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = (parent)->by_inner_entry.rbe_right; } if (((tmp
)->by_inner_entry.rbe_left == ((void *)0) || ((tmp)->by_inner_entry
.rbe_left)->by_inner_entry.rbe_color == 0) && ((tmp
)->by_inner_entry.rbe_right == ((void *)0) || ((tmp)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_color == 0)) { (tmp)->by_inner_entry
.rbe_color = 1; elm = parent; parent = (elm)->by_inner_entry
.rbe_parent; } else { if ((tmp)->by_inner_entry.rbe_right ==
((void *)0) || ((tmp)->by_inner_entry.rbe_right)->by_inner_entry
.rbe_color == 0) { struct hyperlinks_uri *oleft; if ((oleft =
(tmp)->by_inner_entry.rbe_left)) (oleft)->by_inner_entry
.rbe_color = 0; (tmp)->by_inner_entry.rbe_color = 1; do { (
oleft) = (tmp)->by_inner_entry.rbe_left; if (((tmp)->by_inner_entry
.rbe_left = (oleft)->by_inner_entry.rbe_right)) { ((oleft)
->by_inner_entry.rbe_right)->by_inner_entry.rbe_parent =
(tmp); } do {} while (0); if (((oleft)->by_inner_entry.rbe_parent
= (tmp)->by_inner_entry.rbe_parent)) { if ((tmp) == ((tmp
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left)
((tmp)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left
= (oleft); else ((tmp)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_right = (oleft); } else (head)->rbh_root = (oleft); (
oleft)->by_inner_entry.rbe_right = (tmp); (tmp)->by_inner_entry
.rbe_parent = (oleft); do {} while (0); if (((oleft)->by_inner_entry
.rbe_parent)) do {} while (0); } while (0); tmp = (parent)->
by_inner_entry.rbe_right; } (tmp)->by_inner_entry.rbe_color
= (parent)->by_inner_entry.rbe_color; (parent)->by_inner_entry
.rbe_color = 0; if ((tmp)->by_inner_entry.rbe_right) ((tmp
)->by_inner_entry.rbe_right)->by_inner_entry.rbe_color =
0; do { (tmp) = (parent)->by_inner_entry.rbe_right; if ((
(parent)->by_inner_entry.rbe_right = (tmp)->by_inner_entry
.rbe_left)) { ((tmp)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->by_inner_entry
.rbe_parent = (parent)->by_inner_entry.rbe_parent)) { if (
(parent) == ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_left = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); elm = (head)->rbh_root; break; } } else { tmp = (parent
)->by_inner_entry.rbe_left; if ((tmp)->by_inner_entry.rbe_color
== 1) { do { (tmp)->by_inner_entry.rbe_color = 0; (parent
)->by_inner_entry.rbe_color = 1; } while (0); do { (tmp) =
(parent)->by_inner_entry.rbe_left; if (((parent)->by_inner_entry
.rbe_left = (tmp)->by_inner_entry.rbe_right)) { ((tmp)->
by_inner_entry.rbe_right)->by_inner_entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->by_inner_entry.rbe_parent
= (parent)->by_inner_entry.rbe_parent)) { if ((parent) ==
((parent)->by_inner_entry.rbe_parent)->by_inner_entry.
rbe_left) ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (tmp); else ((parent)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->by_inner_entry.rbe_right = (parent); (parent
)->by_inner_entry.rbe_parent = (tmp); do {} while (0); if (
((tmp)->by_inner_entry.rbe_parent)) do {} while (0); } while
(0); tmp = (parent)->by_inner_entry.rbe_left; } if (((tmp
)->by_inner_entry.rbe_left == ((void *)0) || ((tmp)->by_inner_entry
.rbe_left)->by_inner_entry.rbe_color == 0) && ((tmp
)->by_inner_entry.rbe_right == ((void *)0) || ((tmp)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_color == 0)) { (tmp)->by_inner_entry
.rbe_color = 1; elm = parent; parent = (elm)->by_inner_entry
.rbe_parent; } else { if ((tmp)->by_inner_entry.rbe_left ==
((void *)0) || ((tmp)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_color == 0) { struct hyperlinks_uri *oright; if ((oright
= (tmp)->by_inner_entry.rbe_right)) (oright)->by_inner_entry
.rbe_color = 0; (tmp)->by_inner_entry.rbe_color = 1; do { (
oright) = (tmp)->by_inner_entry.rbe_right; if (((tmp)->
by_inner_entry.rbe_right = (oright)->by_inner_entry.rbe_left
)) { ((oright)->by_inner_entry.rbe_left)->by_inner_entry
.rbe_parent = (tmp); } do {} while (0); if (((oright)->by_inner_entry
.rbe_parent = (tmp)->by_inner_entry.rbe_parent)) { if ((tmp
) == ((tmp)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left) ((tmp)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_left = (oright); else ((tmp)->by_inner_entry.rbe_parent
)->by_inner_entry.rbe_right = (oright); } else (head)->
rbh_root = (oright); (oright)->by_inner_entry.rbe_left = (
tmp); (tmp)->by_inner_entry.rbe_parent = (oright); do {} while
(0); if (((oright)->by_inner_entry.rbe_parent)) do {} while
(0); } while (0); tmp = (parent)->by_inner_entry.rbe_left
; } (tmp)->by_inner_entry.rbe_color = (parent)->by_inner_entry
.rbe_color; (parent)->by_inner_entry.rbe_color = 0; if ((tmp
)->by_inner_entry.rbe_left) ((tmp)->by_inner_entry.rbe_left
)->by_inner_entry.rbe_color = 0; do { (tmp) = (parent)->
by_inner_entry.rbe_left; if (((parent)->by_inner_entry.rbe_left
= (tmp)->by_inner_entry.rbe_right)) { ((tmp)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_parent = (parent); } do {}
while (0); if (((tmp)->by_inner_entry.rbe_parent = (parent
)->by_inner_entry.rbe_parent)) { if ((parent) == ((parent)
->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left) (
(parent)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left
= (tmp); else ((parent)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_right = (tmp); } else (head)->rbh_root = (tmp); (tmp)
->by_inner_entry.rbe_right = (parent); (parent)->by_inner_entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->by_inner_entry
.rbe_parent)) do {} while (0); } while (0); elm = (head)->
rbh_root; break; } } } if (elm) (elm)->by_inner_entry.rbe_color
= 0; } __attribute__((__unused__)) static struct hyperlinks_uri
* hyperlinks_by_inner_tree_RB_REMOVE(struct hyperlinks_by_inner_tree
*head, struct hyperlinks_uri *elm) { struct hyperlinks_uri *
child, *parent, *old = elm; int color; if ((elm)->by_inner_entry
.rbe_left == ((void *)0)) child = (elm)->by_inner_entry.rbe_right
; else if ((elm)->by_inner_entry.rbe_right == ((void *)0))
child = (elm)->by_inner_entry.rbe_left; else { struct hyperlinks_uri
*left; elm = (elm)->by_inner_entry.rbe_right; while ((left
= (elm)->by_inner_entry.rbe_left)) elm = left; child = (elm
)->by_inner_entry.rbe_right; parent = (elm)->by_inner_entry
.rbe_parent; color = (elm)->by_inner_entry.rbe_color; if (
child) (child)->by_inner_entry.rbe_parent = parent; if (parent
) { if ((parent)->by_inner_entry.rbe_left == elm) (parent)
->by_inner_entry.rbe_left = child; else (parent)->by_inner_entry
.rbe_right = child; do {} while (0); } else (head)->rbh_root
= child; if ((elm)->by_inner_entry.rbe_parent == old) parent
= elm; (elm)->by_inner_entry = (old)->by_inner_entry; if
((old)->by_inner_entry.rbe_parent) { if (((old)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left == old) ((old)->by_inner_entry
.rbe_parent)->by_inner_entry.rbe_left = elm; else ((old)->
by_inner_entry.rbe_parent)->by_inner_entry.rbe_right = elm
; do {} while (0); } else (head)->rbh_root = elm; ((old)->
by_inner_entry.rbe_left)->by_inner_entry.rbe_parent = elm;
if ((old)->by_inner_entry.rbe_right) ((old)->by_inner_entry
.rbe_right)->by_inner_entry.rbe_parent = elm; if (parent) {
left = parent; do { do {} while (0); } while ((left = (left)
->by_inner_entry.rbe_parent)); } goto color; } parent = (elm
)->by_inner_entry.rbe_parent; color = (elm)->by_inner_entry
.rbe_color; if (child) (child)->by_inner_entry.rbe_parent =
parent; if (parent) { if ((parent)->by_inner_entry.rbe_left
== elm) (parent)->by_inner_entry.rbe_left = child; else (
parent)->by_inner_entry.rbe_right = child; do {} while (0)
; } else (head)->rbh_root = child; color: if (color == 0) hyperlinks_by_inner_tree_RB_REMOVE_COLOR
(head, parent, child); return (old); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_INSERT
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *tmp; struct hyperlinks_uri *parent
= ((void *)0); int comp = 0; tmp = (head)->rbh_root; while
(tmp) { parent = tmp; comp = (hyperlinks_by_inner_cmp)(elm, parent
); if (comp < 0) tmp = (tmp)->by_inner_entry.rbe_left; else
if (comp > 0) tmp = (tmp)->by_inner_entry.rbe_right; else
return (tmp); } do { (elm)->by_inner_entry.rbe_parent = parent
; (elm)->by_inner_entry.rbe_left = (elm)->by_inner_entry
.rbe_right = ((void *)0); (elm)->by_inner_entry.rbe_color =
1; } while (0); if (parent != ((void *)0)) { if (comp < 0
) (parent)->by_inner_entry.rbe_left = elm; else (parent)->
by_inner_entry.rbe_right = elm; do {} while (0); } else (head
)->rbh_root = elm; hyperlinks_by_inner_tree_RB_INSERT_COLOR
(head, elm); return (((void *)0)); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_FIND
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *tmp = (head)->rbh_root; int
comp; while (tmp) { comp = hyperlinks_by_inner_cmp(elm, tmp)
; if (comp < 0) tmp = (tmp)->by_inner_entry.rbe_left; else
if (comp > 0) tmp = (tmp)->by_inner_entry.rbe_right; else
return (tmp); } return (((void *)0)); } __attribute__((__unused__
)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_NFIND
(struct hyperlinks_by_inner_tree *head, struct hyperlinks_uri
*elm) { struct hyperlinks_uri *tmp = (head)->rbh_root; struct
hyperlinks_uri *res = ((void *)0); int comp; while (tmp) { comp
= hyperlinks_by_inner_cmp(elm, tmp); if (comp < 0) { res =
tmp; tmp = (tmp)->by_inner_entry.rbe_left; } else if (comp
> 0) tmp = (tmp)->by_inner_entry.rbe_right; else return
(tmp); } return (res); } __attribute__((__unused__)) static struct
hyperlinks_uri * hyperlinks_by_inner_tree_RB_NEXT(struct hyperlinks_uri
*elm) { if ((elm)->by_inner_entry.rbe_right) { elm = (elm
)->by_inner_entry.rbe_right; while ((elm)->by_inner_entry
.rbe_left) elm = (elm)->by_inner_entry.rbe_left; } else { if
((elm)->by_inner_entry.rbe_parent && (elm == ((elm
)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left)
) elm = (elm)->by_inner_entry.rbe_parent; else { while ((elm
)->by_inner_entry.rbe_parent && (elm == ((elm)->
by_inner_entry.rbe_parent)->by_inner_entry.rbe_right)) elm
= (elm)->by_inner_entry.rbe_parent; elm = (elm)->by_inner_entry
.rbe_parent; } } return (elm); } __attribute__((__unused__)) static
struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_PREV(struct
hyperlinks_uri *elm) { if ((elm)->by_inner_entry.rbe_left
) { elm = (elm)->by_inner_entry.rbe_left; while ((elm)->
by_inner_entry.rbe_right) elm = (elm)->by_inner_entry.rbe_right
; } else { if ((elm)->by_inner_entry.rbe_parent &&
(elm == ((elm)->by_inner_entry.rbe_parent)->by_inner_entry
.rbe_right)) elm = (elm)->by_inner_entry.rbe_parent; else {
while ((elm)->by_inner_entry.rbe_parent && (elm ==
((elm)->by_inner_entry.rbe_parent)->by_inner_entry.rbe_left
)) elm = (elm)->by_inner_entry.rbe_parent; elm = (elm)->
by_inner_entry.rbe_parent; } } return (elm); } __attribute__(
(__unused__)) static struct hyperlinks_uri * hyperlinks_by_inner_tree_RB_MINMAX
(struct hyperlinks_by_inner_tree *head, int val) { struct hyperlinks_uri
*tmp = (head)->rbh_root; struct hyperlinks_uri *parent = (
(void *)0); while (tmp) { parent = tmp; if (val < 0) tmp =
(tmp)->by_inner_entry.rbe_left; else tmp = (tmp)->by_inner_entry
.rbe_right; } return (parent); }
;
112
113/* Remove a hyperlink. */
114static void
115hyperlinks_remove(struct hyperlinks_uri *hlu)
116{
117 struct hyperlinks *hl = hlu->tree;
118
119 TAILQ_REMOVE(&global_hyperlinks, hlu, list_entry)do { if (((hlu)->list_entry.tqe_next) != ((void *)0)) (hlu
)->list_entry.tqe_next->list_entry.tqe_prev = (hlu)->
list_entry.tqe_prev; else (&global_hyperlinks)->tqh_last
= (hlu)->list_entry.tqe_prev; *(hlu)->list_entry.tqe_prev
= (hlu)->list_entry.tqe_next; ; ; } while (0)
;
120 global_hyperlinks_count--;
121
122 RB_REMOVE(hyperlinks_by_inner_tree, &hl->by_inner, hlu)hyperlinks_by_inner_tree_RB_REMOVE(&hl->by_inner, hlu);
123 RB_REMOVE(hyperlinks_by_uri_tree, &hl->by_uri, hlu)hyperlinks_by_uri_tree_RB_REMOVE(&hl->by_uri, hlu);
124
125 free((void *)hlu->internal_id);
126 free((void *)hlu->external_id);
127 free((void *)hlu->uri);
128 free(hlu);
129}
130
131/* Store a new hyperlink or return if it already exists. */
132u_int
133hyperlinks_put(struct hyperlinks *hl, const char *uri_in,
134 const char *internal_id_in)
135{
136 struct hyperlinks_uri find, *hlu;
137 char *uri, *internal_id, *external_id;
138
139 /*
140 * Anonymous URI are stored with an empty internal ID and the tree
141 * comparator will make sure they never match each other (so each
142 * anonymous URI is unique).
143 */
144 if (internal_id_in == NULL((void *)0))
1
Assuming 'internal_id_in' is not equal to NULL
2
Taking false branch
145 internal_id_in = "";
146
147 utf8_stravis(&uri, uri_in, VIS_OCTAL0x01|VIS_CSTYLE0x02);
148 utf8_stravis(&internal_id, internal_id_in, VIS_OCTAL0x01|VIS_CSTYLE0x02);
149
150 if (*internal_id_in != '\0') {
3
Assuming the condition is true
4
Taking true branch
151 find.uri = uri;
152 find.internal_id = internal_id;
153
154 hlu = RB_FIND(hyperlinks_by_uri_tree, &hl->by_uri, &find)hyperlinks_by_uri_tree_RB_FIND(&hl->by_uri, &find);
5
Calling 'hyperlinks_by_uri_tree_RB_FIND'
155 if (hlu != NULL((void *)0)) {
156 free (uri);
157 free (internal_id);
158 return (hlu->inner);
159 }
160 }
161 xasprintf(&external_id, "tmux%llX", hyperlinks_next_external_id++);
162
163 hlu = xcalloc(1, sizeof *hlu);
164 hlu->inner = hl->next_inner++;
165 hlu->internal_id = internal_id;
166 hlu->external_id = external_id;
167 hlu->uri = uri;
168 hlu->tree = hl;
169 RB_INSERT(hyperlinks_by_uri_tree, &hl->by_uri, hlu)hyperlinks_by_uri_tree_RB_INSERT(&hl->by_uri, hlu);
170 RB_INSERT(hyperlinks_by_inner_tree, &hl->by_inner, hlu)hyperlinks_by_inner_tree_RB_INSERT(&hl->by_inner, hlu);
171
172 TAILQ_INSERT_TAIL(&global_hyperlinks, hlu, list_entry)do { (hlu)->list_entry.tqe_next = ((void *)0); (hlu)->list_entry
.tqe_prev = (&global_hyperlinks)->tqh_last; *(&global_hyperlinks
)->tqh_last = (hlu); (&global_hyperlinks)->tqh_last
= &(hlu)->list_entry.tqe_next; } while (0)
;
173 if (++global_hyperlinks_count == MAX_HYPERLINKS5000)
174 hyperlinks_remove(TAILQ_FIRST(&global_hyperlinks)((&global_hyperlinks)->tqh_first));
175
176 return (hlu->inner);
177}
178
179/* Get hyperlink by inner number. */
180int
181hyperlinks_get(struct hyperlinks *hl, u_int inner, const char **uri_out,
182 const char **internal_id_out, const char **external_id_out)
183{
184 struct hyperlinks_uri find, *hlu;
185
186 find.inner = inner;
187
188 hlu = RB_FIND(hyperlinks_by_inner_tree, &hl->by_inner, &find)hyperlinks_by_inner_tree_RB_FIND(&hl->by_inner, &find
)
;
189 if (hlu == NULL((void *)0))
190 return (0);
191 if (internal_id_out != NULL((void *)0))
192 *internal_id_out = hlu->internal_id;
193 if (external_id_out != NULL((void *)0))
194 *external_id_out = hlu->external_id;
195 *uri_out = hlu->uri;
196 return (1);
197}
198
199/* Initialize hyperlink set. */
200struct hyperlinks *
201hyperlinks_init(void)
202{
203 struct hyperlinks *hl;
204
205 hl = xcalloc(1, sizeof *hl);
206 hl->next_inner = 1;
207 RB_INIT(&hl->by_uri)do { (&hl->by_uri)->rbh_root = ((void *)0); } while
(0)
;
208 RB_INIT(&hl->by_inner)do { (&hl->by_inner)->rbh_root = ((void *)0); } while
(0)
;
209 return (hl);
210}
211
212/* Free all hyperlinks but not the set itself. */
213void
214hyperlinks_reset(struct hyperlinks *hl)
215{
216 struct hyperlinks_uri *hlu, *hlu1;
217
218 RB_FOREACH_SAFE(hlu, hyperlinks_by_inner_tree, &hl->by_inner, hlu1)for ((hlu) = hyperlinks_by_inner_tree_RB_MINMAX(&hl->by_inner
, -1); ((hlu) != ((void *)0)) && ((hlu1) = hyperlinks_by_inner_tree_RB_NEXT
(hlu), 1); (hlu) = (hlu1))
219 hyperlinks_remove(hlu);
220}
221
222/* Free hyperlink set. */
223void
224hyperlinks_free(struct hyperlinks *hl)
225{
226 hyperlinks_reset(hl);
227 free(hl);
228}