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))); } }
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; } } } }
/* _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; }
/* 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; } } }
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; } } } }