Example #1
0
static u2_bean
_rest_hit_fan(u2_wire wir_r,
              u2_noun fan,                                      //  retain
              u2_noun leg)                                      //  retain
{
    if ( u2_nul == leg ) {
        return u2_no;
    } else {
        return u2_or(j2_mcc(Pt4, in, has)(wir_r, fan, u2_h(leg)),
                     _rest_hit_fan(wir_r, fan, u2_t(leg)));
    }
}
Example #2
0
  static u2_flag
  _nest_dext_in(u2_wire wir_r,
                u2_noun van,
                u2_noun sut,
                u2_noun ref,
                u2_noun gil)
  {
    u2_noun p_sut, q_sut, r_sut, p_ref, q_ref, r_ref;

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

      case c3__noun: {
        return u2_yes;
      }
      case c3__void: {
        return _nest_sint(wir_r, van, sut, ref, gil);
      }
    }
    else switch ( u2_h(sut) ) {
      default: return u2_bl_bail(wir_r, c3__fail);

      case c3__atom: {
        if ( (u2_yes == u2_dust(ref)) && (c3__atom == u2_h(ref)) ) {
          return u2_yes;
        }
        else return _nest_sint(wir_r, van, sut, ref, gil);
      }
      case c3__cell: {
        if ( (u2_no == u2_as_trel(sut, 0, &p_sut, &q_sut)) ) {
          return u2_bl_bail(wir_r, c3__fail);
        } else {
          if ( u2_yes == u2_as_pq(ref, c3__cell, &p_ref, &q_ref) ) {
            return u2_and(_nest_dext(wir_r, van, p_sut, p_ref, gil),
                          _nest_dext(wir_r, van, q_sut, q_ref, gil));
          }
          else return _nest_sint(wir_r, van, sut, ref, gil);
        }
      }
      case c3__core: {
        if ( u2_no == u2_as_trel(sut, 0, &p_sut, &q_sut) ) {
          return u2_bl_bail(wir_r, c3__fail);
        } else {
          if ( (u2_yes == u2_as_pq(ref, c3__core, &p_ref, &q_ref)) ) {
            return _nest_cong(wir_r, van, sut, ref, gil);
          }
          else return _nest_sint(wir_r, van, sut, ref, gil);
        }
      }
      case c3__cube: {
        if ( u2_no == u2_as_trel(sut, 0, &p_sut, &q_sut) ) {
          return u2_bl_bail(wir_r, c3__fail);
        } else {
          if ( u2_yes == u2_as_pq(ref, c3__cube, &p_ref, &q_ref) ) {
            return u2_sing(p_sut, p_ref);
          }
          else return _nest_sint(wir_r, van, sut, ref, gil);
        }
      }
      case c3__face: {
        if ( (u2_no == u2_as_trel(sut, 0, &p_sut, &q_sut)) ) {
          return u2_bl_bail(wir_r, c3__fail);
        } else { 
          return _nest_dext(wir_r, van, q_sut, ref, gil);
        }
      }
      case c3__fine: {
        if ( (u2_no == u2_as_qual(sut, 0, &p_sut, &q_sut, &r_sut)) ) {
          return u2_bl_bail(wir_r, c3__fail);
        } else { 
          if ( (u2_yes == u2_as_pqr(ref, c3__fine, &p_ref, &q_ref, &r_ref)) ) {
            return u2_and
              (u2_sing(p_sut, p_ref),
               u2_and(u2_sing(q_sut, q_ref),
                      _nest_dext(wir_r, van, r_sut, r_ref, gil)));
          }
          else return _nest_sint(wir_r, van, sut, ref, gil);
        }
      }
      case c3__fork: {
        if ( (u2_no == u2_as_trel(sut, 0, &p_sut, &q_sut)) ) {
          return u2_bl_bail(wir_r, c3__fail);
        }
        else {
          if ( u2_no == u2_dust(ref) ) switch ( ref ) {
            default: return _nest_sint(wir_r, van, sut, ref, gil);

            case c3__noun:
              break;
          }
          else switch ( u2_h(ref) ) {
            default: return _nest_sint(wir_r, van, sut, ref, gil);
            
            case c3__atom:
            case c3__cell: 
            case c3__cube:
            case c3__core:
            case c3__fine:
              break;
          }

          return u2_or(_nest_dext(wir_r, van, p_sut, ref, gil),
                       _nest_dext(wir_r, van, q_sut, ref, gil));
        }
      } 
      case c3__hold: p_sut = u2_t(sut);
      {
        u2_noun hud = u2_bc(wir_r, u2_rx(wir_r, sut), 
                                   u2_rx(wir_r, ref));

        if ( (u2_yes == j2_mcc(Pt4, in, has)(wir_r, gil, hud)) ) {
          u2_rl_lose(wir_r, hud);

          return u2_yes;
        } else {
          u2_noun zoc = j2_mcc(Pt4, in, put)(wir_r, gil, hud);
          u2_type fop = j2_mcy(Pt6, ut, rest)(wir_r, van, sut, p_sut);
          u2_flag hiv = _nest_dext(wir_r, van, fop, ref, zoc);

          u2_rl_lose(wir_r, hud);
          u2_rl_lose(wir_r, fop);
          u2_rl_lose(wir_r, zoc);

          return hiv;
        }
      }
    }
  }
Example #3
0
/* _unix_dir_update(): update directory, true if changed.
*/
static u2_bean
_unix_dir_update(u2_udir* dir_u, DIR* rid_u)
{
  u2_bean cha = u2_no;

  // uL(fprintf(uH, "dir_update ON %s\n", dir_u->pax_c));
  /* use dry bits as markers
  */
  {
    u2_udir* dis_u;
    u2_ufil* fil_u;

    for ( dis_u = dir_u->dis_u; dis_u; dis_u = dis_u->nex_u ) {
      dis_u->dry = u2_yes;
    }
    for ( fil_u = dir_u->fil_u; fil_u; fil_u = fil_u->nex_u ) {
      fil_u->dry = u2_yes;
    }
  }

  /* iterate through directory, opening and updating
  */
  while ( 1 ) {
    struct dirent  ent_u;
    struct dirent* out_u;

    if ( readdir_r(rid_u, &ent_u, &out_u) != 0 ) {
      uL(fprintf(uH, "%s: %s\n", dir_u->pax_c, strerror(errno)));
      c3_assert(0);
    } 
    else if ( !out_u ) {
      break;
    }
    else if ( ('.' == out_u->d_name[0]) ) {    //  XX screws up some paths
      continue;
    }
    else {
      c3_c* pax_c = _unix_down(dir_u->pax_c, out_u->d_name);
      struct stat buf_u;
  
      // uL(fprintf(uH, "  in %s\n", pax_c));
      if ( 0 != stat(pax_c, &buf_u) ) {
        free(pax_c);
        continue;
      } 
      else {
        if ( !S_ISDIR(buf_u.st_mode) ) {
          mpz_t    mod_mp;
          u2_ufil* fil_u;

          {
            u2_noun mod = c3_stat_mtime(&buf_u);

            u2_cr_mp(mod_mp, mod);
            u2z(mod);
          }
          for ( fil_u = dir_u->fil_u; fil_u; fil_u = fil_u->nex_u ) {
            if ( !strcmp(pax_c, fil_u->pax_c) ) {
              fil_u->dry = u2_no;
              cha = u2_or(cha, _unix_file_update(fil_u, mod_mp));
              break;
            }
          }
          if ( !fil_u ) {
            fil_u = malloc(sizeof(u2_ufil));
            // uL(fprintf(uH, "found file %s\n", pax_c));
            _unix_file_watch(fil_u, dir_u, pax_c, mod_mp);

            fil_u->nex_u = dir_u->fil_u;
            dir_u->fil_u = fil_u;
            cha = u2_yes;
          }
          mpz_clear(mod_mp);
        }
        else {
          DIR* red_u = _unix_opendir(pax_c);
          u2_udir* dis_u;

          for ( dis_u = dir_u->dis_u; dis_u; dis_u = dis_u->nex_u ) {
            if ( !strcmp(pax_c, dis_u->pax_c) ) {
              dis_u->dry = u2_no;
              cha = u2_or(cha, _unix_dir_update(dis_u, red_u));
              break;
            }
          }
          if ( !dis_u ) {
            dis_u = malloc(sizeof(u2_udir));
            // uL(fprintf(uH, "found directory %s\n", pax_c));
            _unix_dir_watch(dis_u, dir_u, pax_c); 
            _unix_dir_update(dis_u, red_u);

            dis_u->nex_u = dir_u->dis_u;
            dir_u->dis_u = dis_u;
            cha = u2_yes;
          }
        }
      }
    }
  }

  /* use dry bits as markers
  */
  {
    u2_udir** dis_u;
    u2_ufil** fil_u;

    for ( dis_u = &(dir_u->dis_u); *dis_u; ) {
      if ( u2_no == (*dis_u)->dry ) {
        (*dis_u)->dry = u2_yes;
        dis_u = &(*dis_u)->nex_u;
      }
      else {
        u2_udir* ded_u = *dis_u;
        u2_udir* nex_u = ded_u->nex_u;

        // uL(fprintf(uH, "removed directory %s\n", ded_u->pax_c));
        _unix_dir_free(ded_u);
        free(ded_u);

        *dis_u = nex_u;
        cha = u2_yes;
      }
    }

    for ( fil_u = &(dir_u->fil_u); *fil_u; ) {
      if ( u2_no == (*fil_u)->dry ) {
        fil_u = &(*fil_u)->nex_u;
      }
      else {
        u2_ufil* ded_u = *fil_u;
        u2_ufil* nex_u = ded_u->nex_u;

        // uL(fprintf(uH, "removed file %s\n", ded_u->pax_c));
        _unix_file_free(ded_u);
        free(ded_u);

        *fil_u = nex_u;
        cha = u2_yes;
      }
    }
  }
  closedir(rid_u);
  // uL(fprintf(uH, "dir_update OFF %s\n", dir_u->pax_c));
  return cha;
}
Example #4
0
/* logic
*/
  u2_noun                                                         //  transfer
  j2_mcx(Pt6, ut, firm)(u2_wire wir_r, 
                        u2_noun van,                              //  retain
                        u2_noun sut,                              //  retain
                        u2_noun dib)                              //  retain
  {
    u2_noun p_sut, q_sut, r_sut;

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

      case c3__noun: 
      {
        return u2_yes;
      }
      case c3__void:
      {
        return u2_no;
      }
    }
    else switch ( u2_h(sut) ) {
      default: return u2_bl_bail(wir_r, c3__fail);

      case c3__atom: p_sut = u2_t(sut);
      {
        return u2_stud(dib);
      }
      case c3__cell: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return u2_and
          (u2_dust(dib),
           u2_and(j2_mcx(Pt6, ut, firm)(wir_r, van, p_sut, u2_h(dib)),
                  j2_mcx(Pt6, ut, firm)(wir_r, van, q_sut, u2_t(dib))));
      }
      case c3__core: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        u2_noun pq_sut, qq_sut, rq_sut, prq_sut, qrq_sut;

        u2_bi_trel(wir_r, q_sut, &pq_sut, &qq_sut, &rq_sut);
        u2_bi_cell(wir_r, rq_sut, &prq_sut, &qrq_sut);

        return u2_and
          (u2_dust(dib),
           u2_and
            (j2_mcx(Pt6, ut, firm)(wir_r, van, p_sut, u2_h(dib)),
             ((u2_nul == prq_sut) ? u2_bl_error(wir_r, "firm-core")
                                  : u2_sing(prq_sut, u2_t(dib)))));
      }
      case c3__cube: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return u2_sing(dib, p_sut);
      }
      case c3__face: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return j2_mcx(Pt6, ut, firm)(wir_r, van, q_sut, dib);
      }
      case c3__fine: u2_bi_trel(wir_r, u2_t(sut), &p_sut, &q_sut, &r_sut);
      {
        if ( u2_no == j2_mcx(Pt6, ut, firm)(wir_r, van, r_sut, dib) ) {
          return u2_no;
        } else {
          u2_noun feg = j2_mcy(Pt6, ut, bust)(wir_r, van, q_sut, dib);
          u2_flag ret;

          switch ( p_sut ) {
            default: return u2_bl_bail(wir_r, c3__fail); 
            case c3__pure: ret = u2_sing(dib, feg);
            case c3__very: ret = u2_sing(u2_yes, feg);
          }
          u2_rz(wir_r, feg);
          return ret;
        }
      }
      case c3__fork: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return u2_or(j2_mcx(Pt6, ut, firm)(wir_r, van, p_sut, dib),
                     j2_mcx(Pt6, ut, firm)(wir_r, van, q_sut, dib));
      }
      case c3__hold: 
      {
        u2_noun goy = j2_mcy(Pt6, ut, repo)(wir_r, van, sut);
        u2_noun ret = j2_mcx(Pt6, ut, firm)(wir_r, van, goy, dib);

        u2_rz(wir_r, goy);
        return ret;
      }
    }
  }
Example #5
0
  static u2_bean
  _moot_in(u2_wire wir_r,
           u2_noun van,
           u2_noun sut,
           u2_noun gil)
  {
    u2_noun p_sut, q_sut;

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

      case c3__noun: {
        return u2_no;
      }
      case c3__void: {
        return u2_yes;
      }
    } else switch ( u2_h(sut) ) {
      default: return u2_bl_bail(wir_r, c3__fail);

      case c3__atom: p_sut = u2_t(sut);
      {
        return u2_no;
      }
      case c3__bull: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return _moot_to(wir_r, van, q_sut, gil);
      }
      case c3__cell: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return u2_or(_moot_to(wir_r, van, p_sut, gil),
                     _moot_to(wir_r, van, q_sut, gil));
      }
      case c3__core: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return _moot_to(wir_r, van, p_sut, gil);
      }
      case c3__cube: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return u2_no;
      }
      case c3__face: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return _moot_to(wir_r, van, q_sut, gil);
      }
      case c3__fork: u2_bi_cell(wir_r, u2_t(sut), &p_sut, &q_sut);
      {
        return u2_and(_moot_to(wir_r, van, p_sut, gil),
                      _moot_to(wir_r, van, q_sut, gil));
      }
      case c3__hold: p_sut = u2_t(sut);
      {
        if ( (u2_yes == j2_mcc(Pt4, in, has)(wir_r, gil, sut)) ) {
          return u2_yes;
        } 
        else {
          u2_noun zoc = j2_mcc(Pt4, in, put)(wir_r, gil, sut);
          u2_type fop = j2_mcy(Pt6, ut, rest)(wir_r, van, sut, p_sut);
          u2_noun ret = _moot_to(wir_r, van, fop, zoc);

          u2_rl_lose(wir_r, fop);
          u2_rl_lose(wir_r, zoc);

          return ret;
        }
      }
    }
  }