u3: optimizes +lent jet, avoiding u3i_vint() while possible
*/
#include "all.h"
-
-/* functions
-*/
u3_noun
u3qb_lent(u3_noun a)
{
- u3_noun len = 0;
+ if ( u3_nul == a ) {
+ return 0;
+ }
+
+ // loop until we overflow [len_w]
+ //
+ {
+ c3_w len_w = 1;
+
+ do {
+ a = u3t(a);
+
+ if ( u3_nul == a ) {
+ return u3i_words(1, &len_w);
+ }
+ }
+ while ( ++len_w );
+ }
+
+ // continue with arbitrary precision
+ //
+ {
+ u3_noun len = u3qc_bex(32);
while ( 1 ) {
- if ( 0 == a ) {
+ a = u3t(a);
+
+ if ( u3_nul == a ) {
return len;
}
- else if ( c3n == u3du(a) ) {
- u3z(len);
- return u3m_bail(c3__exit);
- }
else {
len = u3i_vint(len);
- a = u3t(a);
}
}
}
+}
+
u3_noun
u3wb_lent(u3_noun cor)
{
- u3_noun a;
-
- if ( u3_none == (a = u3r_at(u3x_sam, cor)) ) {
- return u3m_bail(c3__exit);
- } else {
- return u3qb_lent(a);
- }
+ return u3qb_lent(u3x_at(u3x_sam, cor));
}
+
u3_noun
u3kb_lent(u3_noun a)
{
u3_noun b = u3qb_lent(a);
-
u3z(a);
return b;
}
-
