Пример #1
0
Файл: rsh.c Проект: Gunga/urbit
/* functions
*/
  u3_noun
  u3qc_rsh(u3_atom a,
           u3_atom b,
           u3_atom c)
  {
    if ( !_(u3a_is_cat(a)) || (a >= 32) ) {
      return u3m_bail(c3__fail);
    }
    else if ( !_(u3a_is_cat(b)) ) {
      return 0;
    }
    else {
      c3_g a_g   = a;
      c3_w b_w   = b;
      c3_w len_w = u3r_met(a_g, c);

      if ( b_w >= len_w ) {
        return 0;
      }
      else {
        c3_w* sal_w = u3a_slaq(a_g, (len_w - b_w));

        if ( 0 == sal_w ) {
          return u3m_bail(c3__fail);
        }
        u3r_chop(a_g, b_w, (len_w - b_w), 0, sal_w, c);

        // return u3a_moot(sal_w);
        return u3a_malt(sal_w);
      }
    }
  }
Пример #2
0
  u3_noun u3qdb_dif(u3_noun a, u3_noun b)
  {
    if ( u3_nul == b ) {
      return u3k(a);
    } else {
      u3_noun n_b, l_b, r_b;
      u3_noun c, l_c, r_c;

      if ( c3n == u3r_trel(b, &n_b, &l_b, &r_b) ) {
        return u3m_bail(c3__exit);
      } else {

        c = u3qdb_bif(a, n_b);

        if ( c3n == u3r_cell(c, &l_c, &r_c) ) {
          return u3m_bail(c3__exit);
        } else {
          u3_noun d;
          u3_noun e;

          d = u3qdb_dif(l_c, l_b);
          e = u3qdb_dif(r_c, r_b);
          u3z(c);

          return _b_dif_join(d, e);
        }
      }
    }
  }
Пример #3
0
/* functions
*/
  u3_noun
  u3qdi_gas(u3_noun a,
            u3_noun b)
  {
    if ( u3_nul == b ) {
      return u3k(a);
    }
    else {
      if ( c3n == u3du(b) ) {
        return u3m_bail(c3__exit);
      } else {
        u3_noun i_b = u3h(b);
        u3_noun t_b = u3t(b);
        u3_noun c;

        if ( u3_none == (c = u3qdi_put(a, i_b)) ) {
          return u3m_bail(c3__exit);
        } else {
          u3_noun d = u3qdi_gas(c, t_b);

          u3z(c);
          return d;
        }
      }
    }
  }
Пример #4
0
/* functions
*/
  u3_noun
  u3qb_roll(u3_noun a,
            u3_noun b)
  {
    if ( 0 == a ) {
      return u3k(u3r_at(u3x_sam_3, b));
    }
    else if ( c3n == u3du(a) ) {
      return u3m_bail(c3__exit);
    }
    else {
      u3_noun gim = u3k(u3h(a));
      u3_noun zor = u3k(u3r_at(u3x_sam_3, b));
      u3_noun daz = u3n_slam_on(u3k(b), u3nc(gim, zor));
      u3_noun vel = u3i_molt(u3k(b), u3x_sam_3, daz, 0);

      if ( u3_none == vel ) {
        return u3m_bail(c3__exit);
      } else {
        u3_noun hox = u3qb_roll(u3t(a), vel);

        u3z(vel);
        return hox;
      }
    }
  }
Пример #5
0
/* _ca_box_make_hat(): in u3R, allocate directly on the hat.
*/
static u3a_box*
_ca_box_make_hat(c3_w len_w, c3_w ald_w, c3_w alp_w, c3_w use_w)
{
  c3_w    pad_w;
  u3_post all_p;
     
  if ( c3y == u3a_is_north(u3R) ) {
    all_p = u3R->hat_p;
    pad_w = _me_align_pad(all_p, ald_w, alp_w);

    u3R->hat_p += (len_w + pad_w);

    if ( u3R->hat_p >= u3R->cap_p ) {
      u3m_bail(c3__meme); return 0;
    }
  }  
  else {
    all_p = (u3R->hat_p - len_w);
    pad_w = _me_align_dap(all_p, ald_w, alp_w);
    all_p -= pad_w;
    u3R->hat_p = all_p;

    if ( u3R->hat_p <= u3R->cap_p ) {
      u3m_bail(c3__meme); return 0;
    }
  }
  return _box_make(u3a_into(all_p), (len_w + pad_w), use_w);
}
Пример #6
0
/* functions
*/
  u3_noun
  u3qdi_int(u3_noun a,
            u3_noun b)
  {
    if ( u3_nul == a ) {
      return u3k(u3_nul);
    }
    else if ( u3_nul == b ) {
      return u3k(u3_nul);
    }
    else {
      u3_noun l_a, n_a, r_a, lr_a;
      u3_noun l_b, n_b, r_b, lr_b;
      u3_noun c;

      if ( (c3n == u3r_cell(a, &n_a, &lr_a)) ) {
        return u3m_bail(c3__exit);
      }
      else if ( (c3n == u3r_cell(b, &n_b, &lr_b)) ) {
        return u3m_bail(c3__exit);
      }
      else {
        if ( c3y == u3qc_mor(n_b, n_a) ) {
          c = a;    a = b;       b = c;
          c = n_a;  n_a = n_b;   n_b = c;
          c = lr_a; lr_a = lr_b; lr_b = c;
        }
        if ( c3n == u3r_cell(lr_a, &l_a, &r_a) ) {
          return u3m_bail(c3__exit);
        }
        else if ( c3n == u3r_cell(lr_b, &l_b, &r_b) ) {
          return u3m_bail(c3__exit);
        }
        else if ( c3y == u3r_sing(n_a, n_b) ) {
          return u3nt(u3k(n_a),
                      u3qdi_int(l_a, l_b),
                      u3qdi_int(r_a, r_b));
        }
        else if ( c3y == u3qc_gor(n_b, n_a) ) {
          return u3qdi_uni(u3qdi_int(l_a,
                                     u3nt(n_b,
                                          l_b,
                                          u3_nul)),
                           u3qdi_int(a,
                                     r_b));
        }
        else {
          return u3qdi_uni(u3qdi_int(r_a,
                                     u3nt(n_b,
                                          u3_nul,
                                          r_b)),
                           u3qdi_int(a,
                                     l_b));
        }
      }
    }
  }
Пример #7
0
/* logic
*/
  u3_noun
  u3qfu_repo(
                        u3_noun van,
                        u3_noun sut)
  {
    u3_noun p_sut, q_sut;

    if ( c3n == u3du(sut) ) switch ( sut ) {
      default: return u3k(sut);

      case c3__noun:
        return u3nt(c3__fork,
                            u3nc(c3__atom, u3_blip),
                            u3nt(c3__cell, c3__noun, c3__noun));
    }
    else switch ( u3h(sut) ) {
      default: {
        return u3m_error("repo-flat");
      }

      case c3__bull: {
        if ( c3n == u3r_cell(u3t(sut), &p_sut, &q_sut)) {
          return u3m_bail(c3__fail);
        } else {
          return u3k(q_sut);
        }
      }
      case c3__core: {
        if ( c3n == u3r_cell(u3t(sut), &p_sut, &q_sut) ) {
          return u3m_bail(c3__fail);
        } else {
          return u3nt(c3__cell, c3__noun, u3k(p_sut));
        }
      }
      case c3__cube: {
        if ( c3n == u3r_cell(u3t(sut), &p_sut, &q_sut)) {
          return u3m_bail(c3__fail);
        } else {
          return u3k(q_sut);
        }
      }
      case c3__face: {
        if ( c3n == u3r_cell(u3t(sut), &p_sut, &q_sut)) {
          return u3m_bail(c3__fail);
        } else {
          return u3k(q_sut);
        }
      }
      case c3__hold: {
        p_sut = u3t(sut);
        return u3qfu_rest(van, sut, p_sut);
      }
    }
  }
Пример #8
0
/* logic
*/
  static u3_noun
  _cqfu_conk(u3_noun van,
             u3_noun sut,
             u3_noun got)
  {
    if ( c3y == u3ud(got) ) {
      u3_noun ret = u3qf_face(u3k(got), sut);

      return ret;
    }
    else switch ( u3h(got) ) {
      default: return u3m_bail(c3__fail);

      case 0: {
        return u3k(sut);
      }
      case 1: {
        u3_noun c*k = _cqfu_conk(van, sut, u3t(u3t(got)));
        u3_noun nux = u3k(u3h(u3t(got)));
        u3_noun ret = u3qf_face(nux, c*k);

        u3z(nux);
        u3z(c*k);
        return ret;
      }
      case 2: {
        u3_noun vet = u3r_at(u3qfu_van_vet, van);
        u3_noun hed, tal, deh, lat, ret;

        if ( c3y == vet ) {
          u3_noun cel = u3nt(c3__cell, c3__noun, c3__noun);

          if ( c3n == u3qfu_nest(van, cel, c3y, sut) ) {
            return u3m_bail(c3__fail);
          }
          u3z(cel);
        }
        hed = u3qfu_peek(van, sut, c3__both, 2);
        tal = u3qfu_peek(van, sut, c3__both, 3);
        deh = _cqfu_conk(van, hed, u3h(u3t(got)));
        lat = _cqfu_conk(van, tal, u3t(u3t(got)));

        ret = u3qf_cell(deh, lat);

        u3z(lat);
        u3z(deh);
        u3z(tal);
        u3z(hed);

        return ret;
      }
    }
  }
Пример #9
0
/* functions
*/
  static u3_noun
  _rebalance(u3_noun a)
  {
    u3_noun l_a, n_a, r_a;

    if ( c3n == u3r_trel(a, &n_a, &l_a, &r_a) ) {
      return u3m_bail(c3__exit);
    }
    else {
      if ( u3_nul == l_a) {
        return u3k(r_a);
      }
      else if ( u3_nul == r_a) {
        return u3k(l_a);
      }
      else {
        u3_noun n_l_a, l_l_a, r_l_a;
        u3_noun n_r_a, l_r_a, r_r_a;

        if ( (c3n == u3r_trel(l_a, &n_l_a, &l_l_a, &r_l_a) ) ||
             (c3n == u3r_trel(r_a, &n_r_a, &l_r_a, &r_r_a) ) ) {
          return u3m_bail(c3__exit);
        }
        else {
          if ( c3y == u3qc_mor(n_l_a, n_r_a) ) {
            u3_noun new_right = u3nt(u3k(n_a),
                                     u3k(r_l_a),
                                     u3k(r_a));

            u3_noun ret = u3nt(u3k(n_l_a),
                               u3k(l_l_a),
                               _rebalance(new_right));
            u3z(new_right);

            return ret;
          }
          else {
            u3_noun new_left = u3nt(u3k(n_a),
                                    u3k(l_a),
                                    u3k(l_r_a));

            u3_noun ret = u3nt(u3k(n_r_a),
                               _rebalance(new_left),
                               u3k(r_r_a));
            u3z(new_left);

            return ret;
          }
        }
      }
    }
  }
Пример #10
0
  static u3_noun
  _mint_bake(
             u3_noun van,
             u3_noun sut,
             u3_noun dab)
  {
    if ( (u3_nul == dab) ) {
      return 0;
    }
    else {
      u3_noun n_dab, l_dab, r_dab;

      u3r_trel(dab, &n_dab, &l_dab, &r_dab);
      if ( c3n == u3du(n_dab) ) {
        return u3m_bail(c3__fail);
      }
      else {
        u3_noun qn_dab = u3t(n_dab);
        u3_noun vad;

        switch ( u3h(qn_dab) ) {
          default: return u3m_bail(c3__exit);
          case c3__ash: {
            vad = _mint_brew(van, sut, c3y, u3t(qn_dab));
            break;
          }
          case c3__elm: {
            vad = _mint_brew(van, sut, c3n, u3t(qn_dab));
            break;
          }
        }

        if ( (u3_nul == l_dab) && (u3_nul == r_dab) ) {
          return vad;
        }
        else if ( (u3_nul == l_dab) ) {
          return u3nc
            (vad, _mint_bake(van, sut, r_dab));
        }
        else if ( (u3_nul == r_dab) ) {
          return u3nc
            (vad, _mint_bake(van, sut, l_dab));
        }
        else {
          return u3nt
            (vad,
                    _mint_bake(van, sut, l_dab),
                    _mint_bake(van, sut, r_dab));
        }
      }
    }
  }
Пример #11
0
Файл: skid.c Проект: bd/urbit
/* functions
*/
  u3_noun
  u3qb_skid(u3_noun a,
            u3_noun b)
  {
    if ( 0 == a ) {
      return u3nc(u3_nul, u3_nul);
    }
    else if ( c3n == u3du(a) ) {
      return u3m_bail(c3__exit);
    } else {
      u3_noun acc = u3qb_skid(u3t(a), b);
      u3_noun hoz = u3n_slam_on(u3k(b), u3k(u3h(a)));
      u3_noun nex;

      if ( c3y == hoz ) {
        nex = u3nc(u3nc(u3k(u3h(a)), u3k(u3h(acc))), u3k(u3t(acc)));
      } 
      else {
        nex = u3nc(u3k(u3h(acc)), u3nc(u3k(u3h(a)), u3k(u3t(acc))));
      }
      u3z(hoz);
      u3z(acc);

      return nex;
    }
  }
Пример #12
0
  static u3_noun
  _mint_brew(
             u3_noun van,
             u3_noun sut,
             u3_noun tov,
             u3_noun gen)
  {
    u3_noun von;

    switch ( tov ) {
      default: return u3m_bail(c3__fail);
      case c3y:
        von = u3k(van); break;
      case c3n:
        von = u3i_molt(u3k(van), u3qfu_van_vet, c3n, 0); break;
    }
    {
      u3_noun mil = u3qfu_mint(von, sut, c3__noun, gen);
      u3_noun fol = u3k(u3t(mil));

      u3z(mil);
      u3z(von);
      return fol;
    }
  }
Пример #13
0
/* internal functions
*/
  u3_noun _b_dif_join(u3_noun d, u3_noun e)
  {
    if ( u3_nul == d ) {
      return u3k(e);
    } else if (u3_nul == e) {
      return u3k(d);
    } else {
      u3_noun n_d, l_d, r_d;
      u3_noun n_e, l_e, r_e;
      u3_noun p_n_d, q_n_d;
      u3_noun p_n_e, q_n_e;

      if (    c3n == u3r_trel(d, &n_d, &l_d, &r_d)
           || c3n == u3r_trel(e, &n_e, &l_e, &r_e)
           || c3n == u3r_cell(n_d, &p_n_d, &q_n_d)
           || c3n == u3r_cell(n_e, &p_n_e, &q_n_e) ) {
        return u3m_bail(c3__exit);
      } else {
        if ( c3y == u3qc_vor(p_n_d, p_n_e) ) {
          return u3nt(u3k(n_d),
                      u3k(l_d),
                      _b_dif_join(u3k(r_d), u3k(e)));
        } else {
          return u3nt(u3k(n_e),
                      _b_dif_join(u3k(d), u3k(l_e)),
                      u3k(r_e));
        }
      }
    }
  }
Пример #14
0
/* functions
*/
  u3_noun
  u3qb_scag(
                    u3_atom a,
                    u3_noun b)
  {
    if ( !_(u3a_is_cat(a)) ) {
      return u3m_bail(c3__fail);
    }
    else {
      u3_noun acc;
      c3_w i_w = a;

      if ( !i_w )
	return u3_nul;

      while ( i_w ) {
        if ( c3n == u3du(b) ) {
          return u3_nul;
        }
	acc = u3i_cell( u3h(b), acc );
	b = u3t(b);
	i_w--;
      }

      return u3kb_flop(acc);
    }
  }
Пример #15
0
/* functions
*/
  u3_noun
  u3qb_murn(u3_noun a, u3_noun b)
  {
    if ( 0 == a ) {
      return a;
    }
    else if ( c3n == u3du(a) ) {
      return u3m_bail(c3__exit);
    }
    else {
      u3_noun one = u3n_slam_on(u3k(b), u3k(u3h(a)));
      u3_noun two = u3qb_murn(u3t(a), b);
      u3_noun nex;

      switch ( u3ud(one) ) {
        case c3y:  u3z(one);
                   return two;
        case c3n:  nex = u3nc(u3k(u3t(one)), two);
                   u3z(one);
                   return nex;
        default:   u3z(one);
                   u3z(two);
                   return u3_none;
      }
    }
  }
Пример #16
0
/* shim
*/
  u3_noun
  _cqe_shim_fun(u3_noun zep,
                u3_noun tub)
  {
    u3_noun p_tub, q_tub;

    u3x_cell(tub, &p_tub, &q_tub);

    if ( c3n == u3du(q_tub) ) {
      return _fail(tub);
    }
    else {
      u3_noun p_zep, q_zep;
      u3_noun iq_tub = u3h(q_tub);

      u3x_cell(zep, &p_zep, &q_zep);
      if ( _(u3a_is_cat(p_zep)) &&
           _(u3a_is_cat(q_zep)) &&
           _(u3a_is_cat(iq_tub)) )
      {
        if ( (iq_tub >= p_zep) && (iq_tub <= q_zep) ) {
          return _next(tub);
        }
        else return _fail(tub);
      }
      else {
        return u3m_bail(c3__fail);
      }
    }
  }
Пример #17
0
/* functions
*/
  u3_noun
  u3qdb_has(
                       u3_noun a,
                       u3_noun b)
  {
    if ( u3_nul == a ) {
      return c3n;
    }
    else {
      u3_noun l_a, n_a, r_a;
      u3_noun pn_a, qn_a;

      if ( (c3n == u3r_trel(a, &n_a, &l_a, &r_a)) ||
           (c3n == u3r_cell(n_a, &pn_a, &qn_a)) )
      {
        return u3m_bail(c3__exit);
      }
      else {
        if ( (c3y == u3r_sing(b, pn_a)) ) {
          return c3y;
        }
        else {
          if ( c3y == u3qc_gor(b, pn_a) ) {
            return u3qdb_has(l_a, b);
          }
          else return u3qdb_has(r_a, b);
        }
      }
    }
  }
Пример #18
0
Файл: ed_shar.c Проект: bd/urbit
  u3_noun
  u3qee_shar(u3_atom pub, u3_atom sek)
  {
    c3_y pub_y[32], sek_y[32], self_y[32], exp_y[64], shr_y[32];
    c3_w met_pub_w, met_sek_w;

    met_pub_w = u3r_met(3, pub);
    met_sek_w = u3r_met(3, sek);

    if ( (met_pub_w > 32) || (met_sek_w > 32) ) {
      return u3m_bail(c3__exit);
    }

    u3r_bytes(0, 32, pub_y, pub);
    u3r_bytes(0, 32, sek_y, sek);

    memset(self_y, 0, 32);
    memset(exp_y, 0, 64);
    memset(shr_y, 0, 32);

    ed25519_create_keypair(self_y, exp_y, sek_y);
    ed25519_key_exchange(shr_y, pub_y, exp_y);

    return u3i_bytes(32, shr_y);
  }
Пример #19
0
  u3_noun
  u3qdi_del(u3_noun a,
            u3_noun b)
  {
    if ( u3_nul == a ) {
      return u3_nul;
    }
    else {
      u3_noun l_a, n_a, r_a;

      if ( (c3n == u3r_trel(a, &n_a, &l_a, &r_a)) ) {
        return u3m_bail(c3__exit);
      }
      else if ( c3n == u3r_sing(n_a, b) ) {
        if ( c3y == u3qc_gor(b, n_a) ) {
          return u3nt(u3k(n_a),
                      u3qdi_del(l_a, b),
                      u3k(r_a));
        }
        else {
          return u3nt(u3k(n_a),
                      u3k(l_a),
                      u3qdi_del(r_a, b));
        }
      }
      else {
        return _rebalance(a);
      }
    }
  }
Пример #20
0
/* functions
*/
  u3_noun
  u3qa_mod(u3_atom a,
           u3_atom b)
  {
#if 0
    if ( b == 3 && a == 2684227708 ) {
      printf("dword at 0x27ff84ff8 is %" PRIu64 "\r\n", *(c3_d *)0x27ff84ff8);
      *(c3_d *)0x27ff84ff8 = 25;
      printf("see, we modified it\r\n");
    }
#endif
    if ( 0 == b ) {
      return u3m_bail(c3__exit);
    } else {
      mpz_t a_mp, b_mp;

      u3r_mp(a_mp, a);
      u3r_mp(b_mp, b);

      mpz_tdiv_r(a_mp, a_mp, b_mp);
      mpz_clear(b_mp);

      return u3i_mp(a_mp);
    }
  }
Пример #21
0
/* functions
*/
  u3_noun
  u3qdi_has(u3_noun a,
            u3_noun b)
  {
    if ( u3_nul == a ) {
      return c3n;
    }
    else {
      u3_noun l_a, n_a, r_a;

      if ( (c3n == u3r_mean(a, 2, &n_a, 6, &l_a, 7, &r_a, 0)) ) {
        return u3m_bail(c3__exit);
      }
      else {
        if ( (c3y == u3r_sing(b, n_a)) ) {
          return c3y;
        }
        else {
          if ( c3y == u3qc_hor(b, n_a) ) {
            return u3qdi_has(l_a, b);
          }
          else return u3qdi_has(r_a, b);
        }
      }
    }
  }
Пример #22
0
Файл: slot.c Проект: Gunga/urbit
/* functions
*/
  u3_noun
  u3qf_slot(u3_atom axe,
            u3_noun vax)
  {
    u3_noun f*g = u3r_at(axe, u3t(vax));

    fprintf(stderr, "slot axe %d\r\n", axe);

    if ( u3_none == f*g ) {
      return u3m_bail(c3__exit);
    }
    else {
      u3_noun typ = u3qfu_peek(
    }
    c3_w i_w, met_w = c3_min(u3r_met(3, axe), u3r_met(3, vax));

    if ( c3n == _slot_fiz(axe, vax) ) {
      return c3n;
    }
    for ( i_w = 0; i_w < met_w; i_w++ ) {
      c3_y axe_y = u3r_byte(i_w, axe);
      c3_y vax_y = u3r_byte(i_w, vax);

      if ( (axe_y >= 'A') && (axe_y <= 'Z') ) axe_y = 0;
      if ( (vax_y >= 'A') && (vax_y <= 'Z') ) vax_y = 0;

      if ( axe_y && vax_y && (axe_y != vax_y) ) {
        return c3n;
      }
    }
    return c3y;
  }
Пример #23
0
Файл: mix.c Проект: urbit/urbit
/* functions
*/
  u3_noun
  u3qc_mix(u3_atom a,
           u3_atom b)
  {
    c3_w lna_w = u3r_met(5, a);
    c3_w lnb_w = u3r_met(5, b);

    if ( (lna_w == 0) && (lnb_w == 0) ) {
      return 0;
    } else {
      c3_w  len_w = c3_max(lna_w, lnb_w);
      c3_w* sal_w = u3a_slab(len_w);

      if ( 0 == sal_w ) {
        return u3m_bail(c3__fail);
      }
      else {
        c3_w i_w;

        u3r_chop(5, 0, lna_w, 0, sal_w, a);

        for ( i_w = 0; i_w < lnb_w; i_w++ ) {
          sal_w[i_w] ^= u3r_word(i_w, b);
        }
        return u3a_malt(sal_w);
      }
    }
  }
Пример #24
0
Файл: skid.c Проект: urbit/urbit
  static u3_noun
  _skid_in(u3j_site* sit_u, u3_noun a)
  {
    if ( 0 == a ) {
      return u3nc(u3_nul, u3_nul);
    }
    else if ( c3n == u3du(a) ) {
      return u3m_bail(c3__exit);
    } else {
      u3_noun acc = _skid_in(sit_u, u3t(a));
      u3_noun hoz = u3j_gate_slam(sit_u, u3k(u3h(a)));
      u3_noun nex;

      if ( c3y == hoz ) {
        nex = u3nc(u3nc(u3k(u3h(a)), u3k(u3h(acc))), u3k(u3t(acc)));
      } 
      else {
        nex = u3nc(u3k(u3h(acc)), u3nc(u3k(u3h(a)), u3k(u3t(acc))));
      }
      u3z(hoz);
      u3z(acc);

      return nex;
    }
  }
Пример #25
0
Файл: shax.c Проект: urbit/urbit
  static u3_noun
  _og_list(u3_noun a,
           u3_noun b,
           u3_noun c)
  {
    u3_noun l = u3_nul;

    if ( !_(u3a_is_cat(b)) ) {
      return u3m_bail(c3__fail);
    }
    while ( 0 != b ) {
      u3_noun x = u3qc_mix(a, c);
      u3_noun y = u3qc_mix(b, x);
      u3_noun d = u3qe_shas(c3_s4('o','g','-','b'), y);
      u3_noun m;

      u3z(x); u3z(y);

      if ( b < 256 ) {
        u3_noun e = u3qc_end(0, b, d);

        u3z(d);
        m = u3nc(b, e);
        b = 0;
      } else {
        m = u3nc(256, d);
        c = d;

        b -= 256;
      }
      l = u3nc(m, l);
    }
    return u3kb_flop(l);
  }
Пример #26
0
static u3_noun
_in_uni(u3_noun a, u3_noun b)
{
  u3_noun n_a, l_a, r_a,
          n_b, l_b, r_b,
          neb, sub, naw, pro;
  if ( u3_nul == a ) {
    return u3k(b);
  }
  else if ( u3_nul == b ) {
    return u3k(a);
  }
  else if ( (c3n == u3r_trel(a, &n_a, &l_a, &r_a))
         || (c3n == u3r_trel(b, &n_b, &l_b, &r_b)) )
  {
    return u3m_bail(c3__exit);
  }
  else if ( c3n == u3qc_mor(n_a, n_b) ) {
    if ( c3y == u3r_sing(n_a, n_b) ) {
      return u3nt(u3k(n_b), _in_uni(l_a, l_b), _in_uni(r_a, r_b));
    }
    else if ( c3y == u3qc_gor(n_a, n_b) ) {
      naw = u3nt(u3k(n_a), u3k(l_a), u3_nul);
      sub = _in_uni(naw, l_b);
      neb = u3nt(u3k(n_b), sub, u3k(r_b));
      pro = _in_uni(r_a, neb);
      u3z(naw); u3z(neb);
      return pro;
    }
    else {
      naw = u3nt(u3k(n_a), u3_nul, u3k(r_a));
      sub = _in_uni(naw, r_b);
      neb = u3nt(u3k(n_b), u3k(l_b),  sub);
      pro = _in_uni(l_a, neb);
      u3z(naw); u3z(neb);
      return pro;
    }
  }
  else if ( c3y == u3r_sing(n_b, n_a) ) {
    return u3nt(u3k(n_b), _in_uni(l_a, l_b), _in_uni(r_a, r_b));
  }
  else if ( c3y == u3qc_gor(n_b, n_a) ) {
    neb = u3nt(u3k(n_b), u3k(l_b), u3_nul);
    sub = _in_uni(l_a, neb);
    naw = u3nt(u3k(n_a), sub, u3k(r_a));
    pro = _in_uni(naw, r_b);
    u3z(neb); u3z(naw);
    return pro;
  }
  else {
    neb = u3nt(u3k(n_b), u3_nul, u3k(r_b));
    sub = _in_uni(r_a, neb);
    naw = u3nt(u3k(n_a), u3k(l_a), sub);
    pro = _in_uni(naw, l_b);
    u3z(neb); u3z(naw);
    return pro;
  }
}
Пример #27
0
/* functions
*/
  u3_noun u3wdb_bif(u3_noun cor)
  {
    u3_noun a, b;
    if ( c3n == u3r_mean(cor, u3x_sam, &b, u3x_con_sam, &a, 0) ) {
      return u3m_bail(c3__exit);
    } else {
      return u3qdb_bif(a, b);
    }
  }
Пример #28
0
Файл: cut.c Проект: Gunga/urbit
/* functions
*/
  u3_noun
  u3qc_cut(u3_atom a,
           u3_atom b,
           u3_atom c,
           u3_atom d)
  {
    if ( !_(u3a_is_cat(a)) || (a >= 32) ) {
      return u3m_bail(c3__fail);
    }
    if ( !_(u3a_is_cat(b)) ) {
      return 0;
    }
    if ( !_(u3a_is_cat(c)) ) {
      c = 0x7fffffff;
    }

    {
      c3_g a_g   = a;
      c3_w b_w   = b;
      c3_w c_w   = c;
      c3_w len_w = u3r_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 u3k(d);
      }
      else {
        c3_w* sal_w = u3a_slaq(a_g, c_w);

        if ( 0 == sal_w ) {
          return u3m_bail(c3__fail);
        }
        u3r_chop(a_g, b_w, c_w, 0, sal_w, d);

        return u3a_malt(sal_w);
      }
    }
  }
Пример #29
0
  u3_noun
  _cqe_stew_fun(u3_noun hel,
                u3_noun tub)
  {
    u3_noun p_tub, q_tub;

    u3x_cell(tub, &p_tub, &q_tub);
    if ( c3n == u3du(q_tub) ) {
      return _fail(tub);
    }
    else {
      u3_noun iq_tub = u3h(q_tub);

      if ( !_(u3a_is_cat(iq_tub)) ) {
        return u3m_bail(c3__fail);
      }
      else while ( 1 ) {
        if ( c3n == u3du(hel) ) {
          return _fail(tub);
        }
        else {
          u3_noun n_hel, l_hel, r_hel;
          u3_noun pn_hel, qn_hel;
          c3_o    bit_o;

          u3x_trel(hel, &n_hel, &l_hel, &r_hel);
          u3x_cell(n_hel, &pn_hel, &qn_hel);

          if ( (c3n == u3du(pn_hel)) ) {
            bit_o = __((iq_tub == pn_hel));
          }
          else {
            u3_noun hpn_hel = u3h(pn_hel);
            u3_noun tpn_hel = u3t(pn_hel);

            if ( !_(u3a_is_cat(hpn_hel)) ||
                 !_(u3a_is_cat(tpn_hel)) ) {
              return _fail(tub);
            }
            else bit_o = __((iq_tub >= hpn_hel) && (iq_tub <= tpn_hel));
          }

          if ( c3y == bit_o ) {
            return u3x_good
              (u3n_slam_on(u3k(qn_hel), u3k(tub)));
          } else {
            if ( c3y == _stew_wor(iq_tub, pn_hel) ) {
              hel = l_hel;
            }
            else hel = r_hel;
          }
        }
      }
    }
  }
Пример #30
0
Файл: skid.c Проект: urbit/urbit
  u3_noun
  u3wb_skid(u3_noun cor)
  {
    u3_noun a, b;

    if ( c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &b, 0) ) {
      return u3m_bail(c3__exit);
    } else {
      return u3qb_skid(a, b);
    }
  }