/* u2_cm_bury(): store fresh or volatile noun `som` to freezer. */ u2_weak u2_cm_bury(u2_weak som) { if ( u2_none == som ) return som; if ( u2_no == u2_rl_junior(u2_wire_bas_r(u2_Wire), som) ) { return som; } else { u2_noun pro = u2_rl_take(u2_wire_bas_r(u2_Wire), som); u2_cz(som); return pro; } }
/* u2_sh_mine(): substitute active, annotated battery. */ u2_weak // transfer u2_sh_mine(u2_ray wir_r, u2_clue clu, // retain u2_noun cor) // transfer { u2_ray bas_r; u2_noun pay, bat; u2_noun sil, bud, nut; u2_chip xip; if ( 0 == (bas_r = u2_wire_bas_r(wir_r)) ) { return cor; } else if ( (u2_none == u2_as_cell(cor, &pay, &bat)) || (u2_no == u2_dust(bat)) ) { return cor; } else if ( u2_none != (xip = u2_ch_find(u2_bask_hag_r(bas_r), bat)) ) { u2_noun cyr; if ( u2_none == (cyr = u2_rc(wir_r, u2_rx(wir_r, pay), u2_h(u2_t(xip)))) ) { return cor; } else { u2_rl_lose(wir_r, cor); return cyr; } } else if ( (u2_no == u2_as_trel(clu, &bud, &sil, &nut)) || (u2_no == _sh_good_bud(bud)) || (u2_no == _sh_good_sil(sil)) || (u2_no == _sh_good_nut(nut)) ) { return cor; } else { u2_noun dac, bot, pet, xop, cyr; dac = bot = pet = xop = cyr = u2_none; while ( 1 ) { /* disc: dac */ { if ( u2_none == (dac = u2_rl_take(bas_r, u2_t(clu))) ) { break; } } /* battery: bot */ { if ( u2_no == u2_rl_junior(bas_r, bat) ) { /* We need the jet battery to be in the shed, so that we ** have a fast algorithm for distinguishing jet batteries ** by ray address. */ bot = u2_rc(bas_r, u2_h(bat), u2_t(bat)); #if 0 printf("battery: in basket: %d.%x\n", u2_ray_a(u2_dog_a(bot)), u2_ray_b(u2_dog_a(bot))); #endif } else { bot = u2_rl_take(bas_r, bat); #if 0 printf("battery: in shed! %d.%x\n", u2_ray_a(u2_dog_a(bot)), u2_ray_b(u2_dog_a(bot))); #endif } if ( u2_none == bot ) { break; } } /* trunk: pet */ { if ( _0 == bud ) { pet = u2_nul; } else { u2_atom p_bud = u2_t(bud); u2_noun car = u2_frag(p_bud, cor); if ( (u2_none == car) || (u2_no == u2_dust(car)) ) { break; } else { u2_noun but = u2_t(car); u2_noun xup, axe; if ( u2_none == (xup = u2_ch_find(u2_bask_hag_r(bas_r), but)) ) { printf("no base!\n"); u2_err(wir_r, "clu", clu); break; } else u2_rl_gain(bas_r, xup); if ( u2_none == (axe = u2_rl_take(bas_r, p_bud)) ) { u2_rl_lose(bas_r, xup); } if ( u2_none == (pet = u2_rc(bas_r, p_bud, xup)) ) { u2_rl_lose(bas_r, axe); u2_rl_lose(bas_r, xup); break; } } } } /* xop: new chip. */ { if ( u2_none == (xop = u2_rt(bas_r, dac, bot, pet)) ) { break; } if ( u2_none == (u2_ch_save(bas_r, u2_bask_hag_r(bas_r), bot, xop)) ) { break; } u2_rl_lose(bas_r, xop); } /* cyr: new core. */ { u2_noun cyr; if ( u2_none == (cyr = u2_rc(wir_r, u2_rx(wir_r, pay), bot)) ) { break; } else { u2_rl_lose(wir_r, cor); return cyr; } } } u2_ho_warn_here(); #if 0 // XXX: an unknown bug is triggered here; // but basket needs a minor rewrite. // if ( dac != u2_none ) u2_rl_lose(bas_r, dac); if ( bot != u2_none ) u2_rl_lose(bas_r, bot); if ( pet != u2_none ) u2_rl_lose(bas_r, pet); if ( xop != u2_none ) u2_rl_lose(bas_r, xop); #endif return cor; } }