コード例 #1
0
/* functions
*/
  u2_weak                                                         //  transfer
  j2_mbc(Pt3, cat)(u2_wire wir_r,
                   u2_atom a,                                     //  retain
                   u2_atom b,                                     //  retain
                   u2_atom c)                                     //  retain
  {
    if ( !u2_fly_is_cat(a) || (a >= 32) ) {
      return u2_bl_bail(wir_r, c3__fail);
    }
    else {
      c3_g   a_g = a;
      c3_w   lew_w = u2_met(a_g, b);
      c3_w   ler_w = u2_met(a_g, c);
      c3_w   all_w = (lew_w + ler_w);

      if ( 0 == all_w ) {
        return 0;
      } else {
        u2_ray sal_r = u2_rl_slaq(wir_r, a_g, all_w);

        if ( 0 == sal_r ) {
          return u2_bl_bail(wir_r, c3__fail);
        }
        else {
          u2_chop(a_g, 0, lew_w, 0, sal_r, b);
          u2_chop(a_g, 0, ler_w, lew_w, sal_r, c);
        }
        // return u2_rl_moot(wir_r, sal_r);
        return u2_rl_malt(wir_r, sal_r);
      }
    }
  }
コード例 #2
0
ファイル: parse.c プロジェクト: mnemnion/urbit
/* stew
*/
  static u2_flag
  _stew_wor(u2_wire wir_r,
            u2_noun ort,
            u2_noun wan)
  {
    if ( !u2_fly_is_cat(ort) ) {
      return u2_bl_bail(wir_r, c3__fail);
    }
    else {
      if ( u2_no == u2_dust(wan) ) {
        if ( !u2_fly_is_cat(wan) ) {
          return u2_bl_bail(wir_r, c3__fail);
        }
        else return (ort < wan) ? u2_yes : u2_no;
      }
      else {
        u2_noun h_wan = u2_h(wan);

        if ( !u2_fly_is_cat(h_wan) ) {
          return u2_bl_bail(wir_r, c3__fail);
        }
        else return (ort < h_wan) ? u2_yes : u2_no;
      }
    }
  }
コード例 #3
0
/* functions
*/
  u2_weak                                                         //  transfer
  j2_mbc(Pt3, rsh)(u2_wire wir_r,
                   u2_atom a,                                     //  retain
                   u2_atom b,                                     //  retain
                   u2_atom c)                                     //  retain
  {
    if ( !u2_fly_is_cat(a) || (a >= 32) ) {
      return u2_bl_bail(wir_r, c3__fail);
    }
    else if ( !u2_fly_is_cat(b) ) {
      return _0;
    }
    else {
      c3_g a_g   = a;
      c3_w b_w   = b;
      c3_w len_w = u2_met(a_g, c);

      if ( b_w >= len_w ) {
        return _0;
      }
      else {
        u2_ray sal_r = u2_rl_slaq(wir_r, a_g, (len_w - b_w));

        if ( 0 == sal_r ) {
          return u2_bl_bail(wir_r, c3__fail);
        }
        u2_chop(a_g, b_w, (len_w - b_w), 0, sal_r, c);

        // return u2_rl_moot(wir_r, sal_r);
        return u2_rl_malt(wir_r, sal_r);
      }
    }
  }
コード例 #4
0
ファイル: in_gas.c プロジェクト: Gruelty/urbit
/* functions
*/
  u2_weak                                                         //  transfer
  j2_mcc(Pt4, in, gas)(u2_wire wir_r, 
                       u2_noun a,                                 //  retain
                       u2_noun b)                                 //  retain
  {
    if ( u2_nul == b ) {
      return u2_rx(wir_r, a);
    }
    else {
      if ( u2_no == u2_dust(b) ) {
        return u2_bl_bail(wir_r, c3__exit);
      } else {
        u2_noun i_b = u2_h(b);
        u2_noun t_b = u2_t(b);
        u2_noun c;

        if ( u2_none == (c = j2_mcc(Pt4, in, put)(wir_r, a, i_b)) ) {
          return u2_bl_bail(wir_r, c3__exit);
        } else {
          u2_noun d = j2_mcc(Pt4, in, gas)(wir_r, c, t_b);

          u2_rl_lose(wir_r, c);
          return d;
        }
      }
    }
  }
コード例 #5
0
ファイル: ut_repo.c プロジェクト: MacTop/urbit
/* logic
*/
  u2_noun                                                         //  transfer
  j2_mcy(Pt6, ut, repo)(u2_wire wir_r, 
                        u2_noun van,                              //  retain
                        u2_noun sut)                              //  retain
  {
    u2_noun p_sut, q_sut;

    if ( u2_no == u2_dust(sut) ) switch ( sut ) {
      default: return u2_rx(wir_r, sut);

      case c3__noun: 
        return u2_bt(wir_r, c3__fork, 
                            u2_bc(wir_r, c3__atom, u2_blip),
                            u2_bt(wir_r, c3__cell, c3__noun, c3__noun));
    }
    else switch ( u2_h(sut) ) {
      default: {
        return u2_bl_error(wir_r, "repo-flat");
      }

      case c3__bull: {
        if ( u2_no == u2_as_cell(u2_t(sut), &p_sut, &q_sut)) {
          return u2_bl_bail(wir_r, c3__fail);
        } else {
          return u2_rx(wir_r, q_sut);
        }
      }
      case c3__core: {
        if ( u2_no == u2_as_cell(u2_t(sut), &p_sut, &q_sut) ) {
          return u2_bl_bail(wir_r, c3__fail);
        } else {
          return u2_bt(wir_r, c3__cell, c3__noun, u2_rx(wir_r, p_sut));
        }
      }
      case c3__cube: {
        if ( u2_no == u2_as_cell(u2_t(sut), &p_sut, &q_sut)) {
          return u2_bl_bail(wir_r, c3__fail);
        } else {
          return u2_rx(wir_r, q_sut);
        }
      }
      case c3__face: {
        if ( u2_no == u2_as_cell(u2_t(sut), &p_sut, &q_sut)) {
          return u2_bl_bail(wir_r, c3__fail);
        } else {
          return u2_rx(wir_r, q_sut);
        }
      }
      case c3__hold: {
        p_sut = u2_t(sut);
        return j2_mcy(Pt6, ut, rest)(wir_r, van, sut, p_sut);
      }
    }
  }
コード例 #6
0
/* logic
*/
  u2_bean                                                         //  transfer
  j2_mcx(Pt6, ut, park)(u2_wire wir_r,
                        u2_noun van,                              //  retain
                        u2_noun sut,                              //  retain
                        u2_noun way,                              //  retain
                        u2_atom axe)                              //  retain
  {
    if ( u2_no == u2_dust(sut) || c3__core != u2_h(sut) ) {
      return u2_bl_bail(wir_r, c3__fail);
    }
    // else if ( u2_no == u2_bn_hook(wir_r, van, "vet") ) {
    else if ( u2_no == u2_frag(j2_ut_van_vet, van) ) {
      return u2_yes;
    }
    else {
      u2_noun p_sut, q_sut, pq_sut;

      u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      u2_bi_cell(wir_r, q_sut, &pq_sut, 0);

      if ( c3__both == way ) {
        if ( c3__gold == pq_sut ) {
          return u2_yes;
        } else return u2_no;
      }
      if ( c3__read == way ) {
        switch ( pq_sut ) {
          default: return u2_bl_bail(wir_r, c3__fail);

          case c3__gold: return u2_yes;
          case c3__lead: return u2_no;
          case c3__iron: return u2_no;
          case c3__zinc: return
                          u2_and(u2_not(u2_sing(_1, axe)),
                                 u2_sing(_2, j2_mbc(Pt3, cap)(wir_r, axe)));
        }
      }
      else if ( c3__rite == way ) {
        switch ( pq_sut ) {
          default: return u2_bl_bail(wir_r, c3__fail);

          case c3__gold: return u2_yes;
          case c3__lead: return u2_no;
          case c3__iron: return
                          u2_and(u2_not(u2_sing(_1, axe)),
                                 u2_sing(_2, j2_mbc(Pt3, cap)(wir_r, axe)));
          case c3__zinc: return u2_no;
        }
      }
      else if ( c3__free == way ) { return u2_yes; }
      else return u2_bl_bail(wir_r, c3__fail);
    }
  }
コード例 #7
0
ファイル: ut_mint.c プロジェクト: mnemnion/urbit
  static u2_noun                                                  //  produce
  _mint_bake(u2_wire wir_r, 
             u2_noun van,                                         //  retain
             u2_noun sut,                                         //  retain
             u2_noun dab)                                         //  retain
  {
    if ( (u2_nul == dab) ) {
      return _0;
    }
    else {
      u2_noun n_dab, l_dab, r_dab; 
     
      u2_as_trel(dab, &n_dab, &l_dab, &r_dab);
      if ( u2_no == u2_dust(n_dab) ) {
        return u2_bl_bail(wir_r, c3__fail);
      } 
      else {
        u2_noun qn_dab = u2_t(n_dab);
        u2_noun vad;

        switch ( u2_h(qn_dab) ) {
          default: return u2_bl_bail(wir_r, c3__exit);
          case c3__ash: {
            vad = _mint_brew(wir_r, van, sut, u2_yes, u2_t(qn_dab));
            break;
          }
          case c3__elm: {
            vad = _mint_brew(wir_r, van, sut, u2_no, u2_t(qn_dab));
            break;
          }
        }

        if ( (u2_nul == l_dab) && (u2_nul == r_dab) ) {
          return vad;
        }
        else if ( (u2_nul == l_dab) ) {
          return u2_bc
            (wir_r, vad, _mint_bake(wir_r, van, sut, r_dab));
        }
        else if ( (u2_nul == r_dab) ) {
          return u2_bc
            (wir_r, vad, _mint_bake(wir_r, van, sut, l_dab));
        }
        else {
          return u2_bt
            (wir_r, vad,
                    _mint_bake(wir_r, van, sut, l_dab),
                    _mint_bake(wir_r, van, sut, r_dab));
        }
      }
    }
  }
コード例 #8
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bn_cook():
**
**   Reverse hook as molt.
*/
u2_noun                                                           //  transfer
u2_bn_cook(u2_wire     wir_r,
           u2_noun     cor,                                       //  retain
           const c3_c* tam_c,
           u2_noun     som)                                       //  transfer
{
  u2_weak vib = u2_ds_look(wir_r, cor, tam_c);
  u2_noun axe;

  if ( (u2_none == vib) ||
       (u2_no == u2_dust(vib)) ||
       (u2_nul != u2_h(vib)) ||
       (u2_no == u2_stud(axe = u2_t(vib)) ) )
  {
    u2_rz(wir_r, vib);

    return u2_bl_bail(wir_r, c3__fail);
  } else {
    u2_noun gon = u2_bn_molt(wir_r, cor, axe, som, 0);

    u2_rz(wir_r, vib);
    u2_rz(wir_r, som);
    return gon;
  }
}
コード例 #9
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bn_hook():
**
**   Execute hook from core.
*/
u2_noun
u2_bn_hook(u2_wire     wir_r,
           u2_noun     cor,
           const c3_c* tam_c)
{
  u2_weak vib = u2_ds_look(wir_r, cor, tam_c);

  if ( u2_none == vib ) {
    fprintf(stderr, "no hook: %s\n", tam_c);
    c3_assert(0);
    return u2_bl_bail(wir_r, c3__fail);
  } else {
    if ( u2_nul == u2_h(vib) ) {
      u2_noun rag = u2_frag(u2_t(vib), cor);

      // printf("%s %d\n", tam_c, u2_t(vib));
      u2_rz(wir_r, vib);

      return u2_rx(wir_r, rag);
    }
    else {
      u2_noun ret = u2_bn_nock(wir_r, cor, vib);

      u2_rz(wir_r, vib);
      return ret;
    }
  }
}
コード例 #10
0
ファイル: ut_tack.c プロジェクト: Gruelty/urbit
  u2_noun                                                         //  transfer
  j2_mcy(Pt6, ut, tack)(u2_wire wir_r,
                        u2_noun van,                              //  retain
                        u2_noun sut,                              //  retain
                        u2_noun peh,                              //  retain
                        u2_noun mur)                              //  retain
  {
    u2_ho_jet *jet_j = &j2_mcj(Pt6, ut, tack)[0];

    if ( jet_j->sat_s == u2_jet_live ) {
      return j2_mcx(Pt6, ut, tack)(wir_r, van, sut, peh, mur);
    }
    else {
      u2_noun cor, fol, pro;

      cor = j2_mci(Pt6, ut, tack)(wir_r, van, sut, peh, mur);
      fol = u2_h(cor);

      pro = u2_ho_use(wir_r, jet_j, cor, fol);
      if ( u2_none == pro ) return u2_bl_bail(wir_r, c3__fail);

      u2_rz(wir_r, cor);
      u2_rz(wir_r, fol);

      return pro;
    }
  }
コード例 #11
0
ファイル: zuse.c プロジェクト: aaronlifton/urbit
/* _zuse_load_cold(): load engine from cold source.
*/
static void
_zuse_load_cold(struct zuse_state* fod_f,
                const c3_c*        src_c)
{
  u2_wire wir_r = fod_f->wir_r;
  u2_noun src   = u2_ux_read(wir_r, src_c, "watt");

  if ( u2_none == src ) {
    u2_bl_bail(wir_r);
  }
  else {
    u2_noun gen, mil, pyt, kol, pit;

    gen = u2_fj_watt(wir_r, src);
    gen = u2_ba_sole(wir_r, gen);
    mil = u2_fj_plow_mill(wir_r, u2_bc(wir_r, c3__cube, _0), gen);
    pyt = u2_bi_h(wir_r, mil);
    kol = u2_bi_t(wir_r, mil);
    {
      // XX: bad dag interaction in old plow code
      //
      u2_rl_gain(wir_r, kol);
    }
    kol = u2_ba_sole(wir_r, kol);
    pit = u2_bn_nock(wir_r, _0, kol);

    fod_f->kol = kol;
    fod_f->pyt = pyt;
    fod_f->pit = pit;
    fod_f->bot = u2_bc(wir_r, u2_rx(wir_r, fod_f->pyt), 
                              u2_rx(wir_r, fod_f->pit));

    _zuse_save_rock(fod_f, src_c);
  }
}
コード例 #12
0
ファイル: ut_nest.c プロジェクト: mnemnion/urbit
  u2_noun                                                         //  transfer
  j2_mcy(Pt6, ut, nest)(u2_wire wir_r,
                        u2_noun van,                              //  retain
                        u2_noun sut,                              //  retain
                        u2_noun ref)                              //  retain
  {
    u2_ho_jet *jet_j = &j2_mcj(Pt6, ut, nest)[0];

    if ( (jet_j->sat_s & u2_jet_live) && !(jet_j->sat_s & u2_jet_test) ) {
      return j2_mcx(Pt6, ut, nest)(wir_r, van, sut, ref);
    }
    else {
      u2_noun cor, fol, pro;

      cor = j2_mci(Pt6, ut, nest)(wir_r, van, sut, ref);
      fol = u2_t(cor);

      pro = u2_ho_use(wir_r, jet_j, cor, fol);
      if ( u2_none == pro ) return u2_bl_bail(wir_r, c3__fail);

      u2_rz(wir_r, cor);
      u2_rz(wir_r, fol);

      return pro;
    }
  }
コード例 #13
0
ファイル: in_has.c プロジェクト: Gruelty/urbit
/* functions
*/
  u2_bean 
  j2_mcc(Pt4, in, has)(u2_wire wir_r, 
                       u2_noun a,                                 //  retain
                       u2_noun b)                                 //  retain
  {
    if ( u2_nul == a ) {
      return u2_no;
    }
    else {
      u2_noun l_a, n_a, r_a;

      if ( (u2_no == u2_mean(a, 2, &n_a, 6, &l_a, 7, &r_a, 0)) ) {
        return u2_bl_bail(wir_r, c3__exit);
      }
      else {
        if ( (u2_yes == u2_sing(b, n_a)) ) {
          return u2_yes;
        } 
        else {
          if ( u2_yes == j2_mbc(Pt3, hor)(wir_r, b, n_a) ) {
            return j2_mcc(Pt4, in, has)(wir_r, l_a, b);
          } 
          else return j2_mcc(Pt4, in, has)(wir_r, r_a, b);
        }
      }
    }
  }
コード例 #14
0
/* functions
*/
  u2_weak                                                         //  transfer
  j2_mbc(Pt2, scag)(u2_wire wir_r,
                    u2_atom a,                                    //  retain
                    u2_noun b)                                    //  retain
  {
    if ( !u2_fly_is_cat(a) ) {
      return u2_bl_bail(wir_r, c3__fail);
    }
    else {
      u2_noun acc;
      c3_w i_w = a;

      if ( !i_w )
	return u2_nul;

      while ( i_w ) {
        if ( u2_no == u2_dust(b) ) {
          return u2_nul;
        }
	acc = u2_cn_cell( u2_h(b), acc );
	b = u2_t(b);
	i_w--;
      }

      return u2_ckb_flop(acc);
    }
  }
コード例 #15
0
ファイル: ut_mint.c プロジェクト: mnemnion/urbit
  static u2_noun
  _mint_brew(u2_wire wir_r,
             u2_noun van,
             u2_noun sut,
             u2_flag tov,
             u2_noun gen)
  {
    u2_noun von;
    
    switch ( tov ) {
      default: return u2_bl_bail(wir_r, c3__fail);
      case u2_yes: 
        von = u2_rx(wir_r, van); break;
      case u2_no: 
        von = u2_bn_molt(wir_r, van, j2_ut_van_vet, u2_no, 0); break;
    }
    {
      u2_noun mil = j2_mcy(Pt6, ut, mint)(wir_r, von, sut, c3__noun, gen);
      u2_noun fol = u2_rx(wir_r, u2_t(mil));

      u2_rl_lose(wir_r, mil);
      u2_rl_lose(wir_r, von);
      return fol;
    }
  }
コード例 #16
0
ファイル: parse.c プロジェクト: mnemnion/urbit
/* shim
*/
  u2_noun                                                         //  produce
  j2_mcx(Pt5, shim, fun)(u2_wire wir_r,
                         u2_noun zep,                             //  retain
                         u2_noun tub)                             //  retain
  {
    u2_noun p_tub, q_tub;

    u2_bi_cell(wir_r, tub, &p_tub, &q_tub);

    if ( u2_no == u2_dust(q_tub) ) {
      return _fail(wir_r, tub);
    }
    else {
      u2_noun p_zep, q_zep;
      u2_noun iq_tub = u2_h(q_tub);

      u2_bi_cell(wir_r, zep, &p_zep, &q_zep);
      if ( u2_fly_is_cat(p_zep) && 
           u2_fly_is_cat(q_zep) &&
           u2_fly_is_cat(iq_tub) )
      {
        if ( (iq_tub >= p_zep) && (iq_tub <= q_zep) ) {
          return _next(wir_r, tub);
        }
        else return _fail(wir_r, tub);
      }
      else {
        return u2_bl_bail(wir_r, c3__fail);
      }
    }
  }
コード例 #17
0
ファイル: shax.c プロジェクト: aaronlifton/urbit
  static u2_noun                                                  //  produce
  _og_list(u2_wire wir_r,
           u2_noun a,                                             //  retain
           u2_noun b,                                             //  retain
           u2_noun c)                                             //  retain
  {
    u2_noun l = u2_nul;

    if ( !u2_fly_is_cat(b) ) {
      return u2_bl_bail(wir_r, c3__fail);
    }
    while ( 0 != b ) {
      u2_noun x = j2_mbc(Pt3, mix)(wir_r, a, c);
      u2_noun y = j2_mbc(Pt3, mix)(wir_r, b, x);
      u2_noun d = j2_mbc(Pt5, shas)(wir_r, c3_s4('o','g','-','b'), y);
      u2_noun m;

      u2z(x); u2z(y);

      if ( b < 256 ) {
        u2_noun e = j2_mbc(Pt3, end)(wir_r, 0, b, d);
        
        u2z(d);
        m = u2nc(b, e);
        b = 0;
      } else {
        m = u2nc(256, d);
        c = d;

        b -= 256;
      }
      l = u2nc(m, l);
    }
    return u2_ckb_flop(l);
  }
コード例 #18
0
ファイル: con.c プロジェクト: mnemnion/urbit
/* functions
*/
  u2_weak                                                         //  transfer
  j2_mbc(Pt3, con)(u2_wire wir_r, 
                   u2_atom a,                                     //  retain
                   u2_atom b)                                     //  retain
  {
    c3_w lna_w = u2_met(5, a);
    c3_w lnb_w = u2_met(5, b);

    if ( (lna_w == 0) && (lnb_w == 0) ) {
      return _0;
    } else {
      c3_w   len_w = c3_max(lna_w, lnb_w);
      u2_ray sal_r = u2_rl_slab(wir_r, len_w);

      if ( 0 == sal_r ) {
        return u2_bl_bail(wir_r, c3__fail);
      }
      else {
        c3_w i_w;

        u2_chop(5, 0, lna_w, 0, sal_r, a);

        for ( i_w = 0; i_w < lnb_w; i_w++ ) {
          *u2_at_ray(sal_r + i_w) |= u2_atom_word(b, i_w);
        }
        // return u2_rl_moot(wir_r, sal_r);
        return u2_rl_malt(wir_r, sal_r);
      }
    }
  }
コード例 #19
0
ファイル: coal.c プロジェクト: dhaffey/urbit-archaeology
/* u2_cke_cue(): expand saved pill.
*/
  static u2_noun                                                  //  produce
  _cue_in(u2_wire wir_r,
          u2_atom a,                                              //  retain
          u2_atom b,                                              //  retain
          u2_ray  t_r)                                            //  retain
  {
    u2_noun p, q;

    if ( _0 == j2_mbc(Pt3, cut)(wir_r, 0, b, 1, a) ) {
      u2_noun x = j2_mbc(Pt1, inc)(wir_r, b);
      u2_noun c = j2_mby(Pt5, rub)(wir_r, x, a);

      p = j2_mbc(Pt1, inc)(wir_r, u2_h(c));
      q = u2_rx(wir_r, u2_t(c));
      q = u2_cs_save(wir_r, t_r, 0, b, q);

      u2_rz(wir_r, c);
      u2_rz(wir_r, x);
    }
    else {
      u2_noun c = j2_mbc(Pt1, add)(wir_r, _2, b);
      u2_noun l = j2_mbc(Pt1, inc)(wir_r, b);

      if ( _0 == j2_mbc(Pt3, cut)(wir_r, 0, l, 1, a) ) {
        u2_noun u, v, w;
        u2_noun x, y;

        u = _cue_in(wir_r, a, c, t_r);
        x = j2_mbc(Pt1, add)(wir_r, u2_h(u), c);
        v = _cue_in(wir_r, a, x, t_r);

        w = u2_bc(wir_r, u2_rx(wir_r, u2_t(u)),
                         u2_rx(wir_r, u2_t(v)));

        y = j2_mbc(Pt1, add)(wir_r, u2_h(u), u2_h(v));

        p = j2_mbc(Pt1, add)(wir_r, _2, y);
        q = u2_cs_save(wir_r, t_r, 0, b, w);

        u2_rz(wir_r, u); u2_rz(wir_r, v); u2_rz(wir_r, x); u2_rz(wir_r, y);
      }
      else {
        u2_noun d = j2_mby(Pt5, rub)(wir_r, c, a);
        u2_weak x = u2_cs_find(wir_r, t_r, 0, u2_t(d));

        p = j2_mbc(Pt1, add)(wir_r, _2, u2_h(d));

        if ( u2_none == x ) {
          return u2_bl_bail(wir_r, c3__fail);
        }
        q = u2_rx(wir_r, x);

        u2_rz(wir_r, d);
      }
      u2_rz(wir_r, l);
      u2_rz(wir_r, c);
    }
    return u2_bc(wir_r, p, q);
  }
コード例 #20
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bl_error(): simple string error.
*/
u2_noun
u2_bl_error(u2_wire     wir_r,
            const c3_c* err_c)                                    //  retain
{
  u2_bl_push(wir_r, u2_bc(wir_r, c3__lose, u2_bn_string(wir_r, err_c)));

  return u2_bl_bail(wir_r, c3__exit);
}
コード例 #21
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bi_t():
**
**   Return the tail of (a).
*/
u2_noun
u2_bi_t(u2_ray  wir_r,
        u2_noun a)
{
  if ( u2_no == u2_dust(a) ) return u2_bl_bail(wir_r, c3__exit);

  return u2_t(a);
}
コード例 #22
0
/* functions
*/
  u2_noun                                                         //  produce
  j2_mby(Pt5, rub)(u2_wire wir_r,
                   u2_atom a,                                     //  retain
                   u2_atom b)                                     //  retain
  {
    u2_atom c, d, e;
    u2_atom w, x, y, z;
    u2_atom p, q;

    u2_atom m = j2_mbc(Pt1, add)(wir_r, a, u2_met(0, b));

    //  Compute c and d.
    {
      x = u2_rx(wir_r, a);

      while ( _0 == j2_mbc(Pt3, cut)(wir_r, _0, x, _1, b) ) {
        u2_atom y = j2_mbc(Pt1, inc)(wir_r, x);

        //  Sanity check: crash if decoding more bits than available
        if ( u2_yes == j2_mbc(Pt1, gth)(wir_r, x, m)) {
          //  fprintf(stderr, "[%%rub-hard %d %d %d]\r\n", a, x, m);
          return u2_bl_bail(wir_r, c3__exit);
        }

        u2_rz(wir_r, x);
        x = y;
      }
      if ( u2_yes == u2_sing(x, a) ) {
        u2_rz(wir_r, x);
        return u2_bc(wir_r, _1, _0);
      }
      c = j2_mbc(Pt1, sub)(wir_r, x, a);
      d = j2_mbc(Pt1, inc)(wir_r, x);

      u2_rz(wir_r, x);
    }

    //  Compute e, p, q.
    {
      x = j2_mbc(Pt1, dec)(wir_r, c);
      y = j2_mbc(Pt3, bex)(wir_r, x);
      z = j2_mbc(Pt3, cut)(wir_r, _0, d, x, b);

      e = j2_mbc(Pt1, add)(wir_r, y, z);
      u2_rz(wir_r, y); u2_rz(wir_r, z);

      w = j2_mbc(Pt1, add)(wir_r, c, c);
      y = j2_mbc(Pt1, add)(wir_r, w, e);
      z = j2_mbc(Pt1, add)(wir_r, d, x);

      p = j2_mbc(Pt1, add)(wir_r, w, e);
      q = j2_mbc(Pt3, cut)(wir_r, _0, z, e, b);

      u2_rz(wir_r, w); u2_rz(wir_r, x); u2_rz(wir_r, y); u2_rz(wir_r, z);

      return u2_bc(wir_r, p, q);
    }
  }
コード例 #23
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bl_good(): test for u2_none.
*/
u2_noun
u2_bl_good(u2_ray  wir_r,
           u2_weak som)
{
  if ( u2_none == som ) {
    return u2_bl_bail(wir_r, c3__exit);
  }
  else return som;
}
コード例 #24
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bi_met():
**
**   Return the size of (b) in bits, rounded up to
**   (1 << a_y).
**
**   For example, (a_y == 3) returns the size in bytes.
*/
c3_w
u2_bi_met(u2_ray  wir_r,
          c3_y    a_y,
          u2_noun b)
{
  if ( u2_no == u2_stud(b) ) return u2_bl_bail(wir_r, c3__exit);

  return u2_met(a_y, b);
}
コード例 #25
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bi_byte():
**
**   Return byte (a_w) of (b).
*/
c3_y
u2_bi_byte(u2_ray  wir_r,
           c3_w    a_w,
           u2_noun b)
{
  if ( u2_no == u2_stud(b) ) return u2_bl_bail(wir_r, c3__exit);

  return u2_byte(a_w, b);
}
コード例 #26
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bi_mp():
**
**   Copy (b) into (a_mp).
*/
void
u2_bi_mp(u2_ray  wir_r,
         mpz_t   a_mp,
         u2_noun b)
{
  if ( u2_no == u2_stud(b) ) u2_bl_bail(wir_r, c3__exit);

  u2_mp(a_mp, b);
}
コード例 #27
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bi_word():
**
**   Return word (a_w) of (b).
*/
c3_w
u2_bi_word(u2_ray  wir_r,
           c3_w    a_w,
           u2_noun b)
{
  if ( u2_no == u2_stud(b) ) return u2_bl_bail(wir_r, c3__exit);

  return u2_word(a_w, b);
}
コード例 #28
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bl_some(): test for zero ray.
*/
u2_ray
u2_bl_some(u2_wire wir_r,
           u2_ray  ray_r)
{
  if ( 0 == ray_r ) {
    return u2_bl_bail(wir_r, c3__fail);
  }
  else return ray_r;
}
コード例 #29
0
ファイル: bail.c プロジェクト: MacTop/urbit
/* u2_bl_flat(): test for atom.
*/
u2_atom
u2_bl_flat(u2_ray  wir_r,
           u2_weak som)
{
  if ( u2_none == som ) {
    return u2_bl_bail(wir_r, c3__exit);
  }
  else return som;
}
コード例 #30
0
/* functions
*/
  u2_weak                                                         //  transfer
  j2_mbc(Pt3, cut)(u2_wire wir_r,
                   u2_atom a,                                     //  retain
                   u2_atom b,                                     //  retain
                   u2_atom c,                                     //  retain
                   u2_atom d)                                     //  retain
  {
    if ( !u2_fly_is_cat(a) || (a >= 32) ) {
      return u2_bl_bail(wir_r, c3__fail);
    }
    if ( !u2_fly_is_cat(b) ) {
      return _0;
    }
    if ( !u2_fly_is_cat(c) ) {
      c = 0x7fffffff;
    }

    {
      c3_g a_g   = a;
      c3_w b_w   = b;
      c3_w c_w   = c;
      c3_w len_w = u2_met(a_g, d);

      if ( (_0 == c_w) || (b_w >= len_w) ) {
        return _0;
      }
      if ( b_w + c_w > len_w ) {
        c_w = (len_w - b_w);
      }
      if ( (b_w == 0) && (c_w == len_w) ) {
        return u2_rx(wir_r, d);
      }
      else {
        u2_ray sal_r = u2_rl_slaq(wir_r, a_g, c_w);

        if ( 0 == sal_r ) {
          return u2_bl_bail(wir_r, c3__fail);
        }
        u2_chop(a_g, b_w, c_w, 0, sal_r, d);

        return u2_rl_malt(wir_r, sal_r);
      }
    }
  }