up_qor_rbal.c (4044B)
1 #include "all.h" 2 3 u3_noun 4 _rrdub(u3_noun n_a, u3_noun l_a, u3_noun m_a, u3_noun r_a) 5 { 6 if ( c3n == u3du(l_a) ) { 7 return u3m_bail(c3__exit); 8 } 9 10 u3_noun p_l_a = u3t(u3t(l_a)); 11 u3_noun hol = u3h(l_a); 12 13 if ( c3n == u3ud(hol) ) { 14 return u3m_bail(c3__exit); 15 } 16 else switch ( hol ) { 17 default: 18 return u3m_bail(c3__exit); 19 20 case c3__llos: { 21 u3_noun n_p_l_a, l_p_l_a, m_p_l_a, r_p_l_a; 22 u3x_qual(p_l_a, &n_p_l_a, &l_p_l_a, &m_p_l_a, &r_p_l_a); 23 24 u3_noun pre = u3qdu_qor_llsin(n_p_l_a, l_p_l_a, m_p_l_a, r_p_l_a); 25 u3_noun pro = u3qdu_qor_rrsin(n_a, pre, m_a, r_a); 26 27 u3z(pre); 28 29 return pro; 30 } 31 32 case c3__rlos: { 33 u3_noun n_p_l_a, l_p_l_a, m_p_l_a, r_p_l_a; 34 u3x_qual(p_l_a, &n_p_l_a, &l_p_l_a, &m_p_l_a, &r_p_l_a); 35 36 u3_noun pre = u3qdu_qor_rlsin(n_p_l_a, l_p_l_a, m_p_l_a, r_p_l_a); 37 u3_noun pro = u3qdu_qor_rrsin(n_a, pre, m_a, r_a); 38 39 u3z(pre); 40 41 return pro; 42 } 43 } 44 } 45 46 u3_noun 47 _rldub(u3_noun n_a, u3_noun l_a, u3_noun m_a, u3_noun r_a) 48 { 49 if ( c3n == u3du(r_a) ) { 50 return u3m_bail(c3__exit); 51 } 52 53 u3_noun p_r_a = u3t(u3t(r_a)); 54 u3_noun hor = u3h(r_a); 55 56 if ( c3n == u3ud(hor) ) { 57 return u3m_bail(c3__exit); 58 } 59 else switch ( hor ) { 60 default: 61 return u3m_bail(c3__exit); 62 63 case c3__llos: { 64 u3_noun n_p_r_a, l_p_r_a, m_p_r_a, r_p_r_a; 65 u3x_qual(p_r_a, &n_p_r_a, &l_p_r_a, &m_p_r_a, &r_p_r_a); 66 67 u3_noun pre = u3qdu_qor_lrsin(n_p_r_a, l_p_r_a, m_p_r_a, r_p_r_a); 68 u3_noun pro = u3qdu_qor_rlsin(n_a, l_a, m_a, pre); 69 70 u3z(pre); 71 72 return pro; 73 } 74 75 case c3__rlos: { 76 u3_noun n_p_r_a, l_p_r_a, m_p_r_a, r_p_r_a; 77 u3x_qual(p_r_a, &n_p_r_a, &l_p_r_a, &m_p_r_a, &r_p_r_a); 78 79 u3_noun pre = u3qdu_qor_rrsin(n_p_r_a, l_p_r_a, m_p_r_a, r_p_r_a); 80 u3_noun pro = u3qdu_qor_rlsin(n_a, l_a, m_a, pre); 81 82 u3z(pre); 83 84 return pro; 85 } 86 } 87 } 88 89 u3_noun 90 _rrbal(u3_noun n, u3_noun l, u3_noun m, u3_noun r) 91 { 92 if ( c3n == u3du(l) ) { 93 return u3m_bail(c3__exit); 94 } 95 96 u3_noun p_l = u3t(u3t(l)); 97 98 u3_noun n_p_l, l_p_l, m_p_l, r_p_l; 99 u3x_qual(p_l, &n_p_l, &l_p_l, &m_p_l, &r_p_l); 100 101 u3_atom sl = u3qdu_qor_size(l_p_l); 102 u3_atom sr = u3qdu_qor_size(r_p_l); 103 104 c3_o comp = u3qa_gth(sl, sr); 105 106 u3z(sl); 107 u3z(sr); 108 109 return ( c3y == comp ) ? u3qdu_qor_rrsin(n, l, m, r) : _rrdub(n, l, m, r); 110 } 111 112 u3_noun 113 _rlbal(u3_noun n, u3_noun l, u3_noun m, u3_noun r) 114 { 115 if ( c3n == u3du(r) ) { 116 return u3m_bail(c3__exit); 117 } 118 119 u3_noun p_r = u3t(u3t(r)); 120 121 u3_noun n_p_r, l_p_r, m_p_r, r_p_r; 122 u3x_qual(p_r, &n_p_r, &l_p_r, &m_p_r, &r_p_r); 123 124 u3_atom sl = u3qdu_qor_size(l_p_r); 125 u3_atom sr = u3qdu_qor_size(r_p_r); 126 127 c3_o comp = u3qa_lth(sl, sr); 128 129 u3z(sl); 130 u3z(sr); 131 132 return ( c3y == comp ) ? u3qdu_qor_rlsin(n, l, m, r) : _rldub(n, l, m, r); 133 } 134 135 u3_noun 136 u3qdu_qor_rbal(u3_noun n_a, u3_noun l_a, u3_noun m_a, u3_noun r_a) 137 { 138 u3_atom sl = u3qdu_qor_size(l_a); 139 u3_atom sr = u3qdu_qor_size(r_a); 140 u3_atom s = u3qa_add(sl, sr); 141 142 if ( c3y == u3qa_lth(s, 2) ) { 143 u3z(sl); 144 u3z(sr); 145 u3z(s); 146 147 return u3qdu_qor_rlos(n_a, l_a, m_a, r_a); 148 } 149 else { 150 u3z(s); 151 152 u3_atom sm_l = u3qa_mul(4, sl); 153 154 if ( c3y == u3qa_gth(sr, sm_l) ) { 155 u3z(sl); 156 u3z(sr); 157 u3z(sm_l); 158 159 return _rlbal(n_a, l_a, m_a, r_a); 160 } 161 else { 162 u3z(sr); 163 u3z(sm_l); 164 165 u3_atom sm_r = u3qa_mul(4, sr); 166 167 if ( c3y == u3qa_gth(sl, sm_r) ) { 168 u3z(sl); 169 u3z(sm_r); 170 171 return _rrbal(n_a, l_a, m_a, r_a); 172 } 173 else { 174 u3z(sl); 175 u3z(sm_r); 176 177 return u3qdu_qor_rlos(n_a, l_a, m_a, r_a); 178 } 179 } 180 } 181 } 182 183 u3_noun 184 u3wdu_qor_rbal(u3_noun cor) 185 { 186 u3_noun a; 187 188 if ( (c3n == u3r_mean(cor, u3x_sam, &a, 0 )) || 189 (c3n == u3du(a)) ) 190 { 191 return u3m_bail(c3__exit); 192 } else { 193 u3_noun n, l, m, r; 194 u3x_qual(a, &n, &l, &m, &r); 195 196 if ( (c3n == u3du(n)) || (c3n == u3ud(m)) ) { 197 return u3m_bail(c3__exit); 198 } 199 else { 200 return u3qdu_qor_rbal(n, l, m, r); 201 } 202 } 203 } 204 205