/* 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_none; } 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); } } }
/* 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); } } }
static u2_flag _nest_fitz(u2_wire wir_r, u2_atom p_sut, u2_atom p_ref) { c3_w i_w, met_w = c3_min(u2_met(3, p_sut), u2_met(3, p_ref)); for ( i_w = 0; i_w < met_w; i_w++ ) { if ( u2_byte(i_w, p_sut) != u2_byte(i_w, p_ref) ) { return u2_no; } } return u2_yes; }
/* _unix_dump(): dump noun to file. */ static void _unix_dump(FILE* fil, u2_noun som) { if ( u2_no == u2_dust(som) ) { mpz_t amp; if ( u2_yes == _unix_term(som) ) { c3_w met_w = u2_met(3, som); c3_y *buf_y = alloca(met_w + 1); u2_bytes(0, met_w, buf_y, som); buf_y[met_w] = 0; fprintf(fil, "%%%s", buf_y); } else { u2_mp(amp, som); gmp_fprintf(fil, "%Zd", amp); mpz_clear(amp); } } else { fputc('[', fil); _unix_dump(fil, u2_h(som)); fprintf(fil, " "); _unix_dump_in(fil, u2_t(som)); fputc(']', fil); } }
/* functions */ u2_weak // produce j2_mbc(Pt5, shax)(u2_wire wir_r, u2_atom a) // retain { c3_w met_w = u2_met(3, a); c3_y* fat_y = malloc(met_w + 1); u2_bytes(0, met_w, fat_y, a); { c3_y dig_y[32]; #if defined(U2_OS_linux) SHA256_CTX ctx_h; SHA256_Init(&ctx_h); SHA256_Update(&ctx_h, fat_y, met_w); SHA256_Final(dig_y, &ctx_h); #elif defined(U2_OS_osx) CC_SHA256_CTX ctx_h; CC_SHA256_Init(&ctx_h); CC_SHA256_Update(&ctx_h, fat_y, met_w); CC_SHA256_Final(dig_y, &ctx_h); #endif return u2_rl_bytes(wir_r, 32, dig_y); } }
/* unix_save(): save a file. */ static void _unix_save(c3_c* pax_c, u2_atom oat) { c3_i fid_i = open(pax_c, O_WRONLY | O_CREAT | O_TRUNC, 0666); c3_w fln_w, rit_w; c3_y* oat_y; if ( fid_i < 0 ) { uL(fprintf(uH, "%s: %s\n", pax_c, strerror(errno))); u2_cm_bail(c3__fail); } fln_w = u2_met(3, oat); oat_y = malloc(fln_w); u2_cr_bytes(0, fln_w, oat_y, oat); u2z(oat); rit_w = write(fid_i, oat_y, fln_w); close(fid_i); free(oat_y); if ( rit_w != fln_w ) { uL(fprintf(uH, "%s: %s\n", pax_c, strerror(errno))); c3_assert(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); } } }
/* u2_cf_flat_save(): save `som` as `mod` at `pas`. */ u2_bean u2_cf_flat_save(u2_noun mod, u2_noun pas, u2_noun som) { c3_assert(c3__atom == mod); { c3_c* pas_c = u2_cr_string(pas); c3_i fid_i; c3_w fln_w; c3_y* fil_y; fid_i = open(pas_c, O_WRONLY | O_CREAT, 0666); free(pas_c); u2_cz(pas); if ( fid_i < 0 ) { perror(pas_c); u2_cz(som); return u2_no; } fln_w = u2_met(3, som); fil_y = c3_malloc(fln_w); u2_cr_bytes(0, fln_w, fil_y, som); u2_cz(som); if ( fln_w != write(fid_i, fil_y, fln_w) ) { return u2_no; } close(fid_i); return u2_yes; } }
/* u2_walk_save(): save file or bail. */ void u2_walk_save(c3_c* pas_c, u2_noun tim, u2_atom pad) { c3_i fid_i = open(pas_c, O_WRONLY | O_CREAT | O_TRUNC, 0666); c3_w fln_w, rit_w; c3_y* pad_y; if ( fid_i < 0 ) { uL(fprintf(uH, "%s: %s\n", pas_c, strerror(errno))); u2_cm_bail(c3__fail); } fln_w = u2_met(3, pad); pad_y = malloc(fln_w); u2_cr_bytes(0, fln_w, pad_y, pad); u2z(pad); rit_w = write(fid_i, pad_y, fln_w); close(fid_i); free(pad_y); if ( rit_w != fln_w ) { uL(fprintf(uH, "%s: %s\n", pas_c, strerror(errno))); u2_cm_bail(c3__fail); } if ( 0 != tim ) { struct timeval tim_tv[2]; u2_time_out_tv(&tim_tv[0], u2k(tim)); u2_time_out_tv(&tim_tv[1], tim); utimes(pas_c, tim_tv); } }
/* 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); } }
/* 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); }
/* functions */ u2_weak // transfer j2_mbc(Pt3, met)(u2_wire wir_r, u2_atom a, // retain u2_atom b) // retain { if ( !u2_fly_is_cat(a) || (a >= 32) ) { if ( _0 == b ) { return _0; } else return _1; } else { c3_w met_w = u2_met(a, b); if ( !u2_fly_is_cat(met_w) ) { return u2_rl_words(wir_r, 1, &met_w); } else return u2_met(a, b); } }
/* u2_bx_bean_print(): print bean stack to FILE *. */ void u2_bx_bean_print(u2_ray wir_r, FILE * fil_F, u2_noun zof) // retain { while ( u2_yes == u2_dust(zof) ) { u2_noun i_zof = u2_h(zof); u2_noun t_zof = u2_t(zof); if ( u2_yes == u2_stud(i_zof) ) { _print_term(i_zof, fil_F); fprintf(fil_F, "\n"); } else { u2_noun hi_zof = u2_h(i_zof); u2_noun ti_zof = u2_t(i_zof); u2_weak gol; gol = u2_nk_kick(wir_r, ti_zof); if ( u2_none == gol ) { _print_term(hi_zof, fil_F); fprintf(fil_F, ":!\n"); } else { u2_noun gal = gol; if ( u2_nul == hi_zof ) { while ( u2_yes == u2_dust(gal) ) { _print_tape(u2_h(gal), fil_F); fprintf(fil_F, "\n"); gal = u2_t(gal); } } else { c3_w feq_w = u2_met(3, hi_zof); _print_term(hi_zof, fil_F); printf(": "); while ( u2_yes == u2_dust(gal) ) { if ( gal != gol ) { _print_space(feq_w + 2, fil_F); } _print_tape(u2_h(gal), fil_F); fprintf(fil_F, "\n"); gal = u2_t(gal); } } u2_rl_lose(wir_r, gol); } } zof = t_zof; } }
/* functions */ static u2_bean _fitz_fiz(u2_wire wir_r, u2_noun yaz, u2_noun wix) { c3_w yaz_w = u2_met(3, yaz); c3_w wix_w = u2_met(3, wix); c3_y yaz_y, wix_y; yaz_y = (0 == yaz_w) ? 0 : u2_byte((yaz_w - 1), yaz); if ( (yaz_y < 'A') || (yaz_y > 'Z') ) yaz_y = 0; wix_y = (0 == wix_w) ? 0 : u2_byte((wix_w - 1), wix); if ( (wix_y < 'A') || (wix_y > 'Z') ) wix_y = 0; if ( yaz_y && wix_y ) { if ( !wix_y || (wix_y > yaz_y) ) { return u2_no; } } return u2_yes; }
/* _print_term(): print a terminal. */ static void _print_term(u2_noun som, FILE* fil_F) { if ( u2_yes == u2_stud(som) ) { c3_w len_w = u2_met(3, som); c3_y *som_y = alloca(len_w) + 1; u2_bytes(0, len_w, som_y, som); som_y[len_w] = 0; fprintf(fil_F, "%s", (c3_c *)som_y); } }
u2_noun // transfer j2_mby(Pt6, fitz)(u2_wire wir_r, u2_noun yaz, // retain u2_noun wix) // retain { c3_w i_w, met_w = c3_min(u2_met(3, yaz), u2_met(3, wix)); if ( u2_no == _fitz_fiz(wir_r, yaz, wix) ) { return u2_no; } for ( i_w = 0; i_w < met_w; i_w++ ) { c3_y yaz_y = u2_byte(i_w, yaz); c3_y wix_y = u2_byte(i_w, wix); if ( (yaz_y >= 'A') && (yaz_y <= 'Z') ) yaz_y = 0; if ( (wix_y >= 'A') && (wix_y <= 'Z') ) wix_y = 0; if ( yaz_y && wix_y && (yaz_y != wix_y) ) { return u2_no; } } return u2_yes; }
/* 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); } } }
/* _unix_term(): u2_yes iff `tat` should be printed as a term. */ static u2_bean _unix_term(u2_atom tat) { c3_w met_w = u2_met(3, tat); if ( met_w >= 2 ) { c3_y *buf_y = alloca(met_w); c3_w i_w; u2_bytes(0, met_w, buf_y, tat); for ( i_w=0; i_w < met_w; i_w++ ) { if ( ((buf_y[i_w] < 'a') || (buf_y[i_w] > 'x')) && (buf_y[i_w] != '-') ) { return u2_no; } } return u2_yes; } else return u2_no; }
/* u2_ux_write(): write a path/extension as an atom. */ u2_bean u2_ux_write(u2_wire wir_r, u2_atom som, const c3_c* paf_c, const c3_c* ext_c) { c3_w len_w; c3_c* nam_c; if ( ext_c ) len_w = strlen(paf_c) + 1 + strlen(ext_c); else len_w = strlen(paf_c); nam_c = alloca(len_w + 1); if ( ext_c ) { sprintf(nam_c, "%s.%s", paf_c, ext_c); } else sprintf(nam_c, "%s", paf_c); { c3_i fid_i; c3_w fln_w; c3_y* fil_y; fid_i = open(nam_c, O_WRONLY | O_CREAT, 0666); if ( fid_i < 0 ) { return u2_no; } fln_w = u2_met(3, som); fil_y = malloc(fln_w); u2_bytes(0, fln_w, fil_y, som); if ( fln_w != write(fid_i, fil_y, fln_w) ) { return u2_no; } close(fid_i); return u2_yes; } }
/* functions */ u2_weak // transfer j2_mbc(Pt3, peg)(u2_wire wir_r, u2_atom a, // retain u2_atom b) // retain { u2_atom c, d, e, f, g, h; c = u2_met(0, b); d = j2_mbc(Pt1, dec)(wir_r, c); e = j2_mbc(Pt3, lsh)(wir_r, _0, d, 1); f = j2_mbc(Pt1, sub)(wir_r, b, e); g = j2_mbc(Pt3, lsh)(wir_r, _0, d, a); h = j2_mbc(Pt1, add)(wir_r, f, g); u2_rl_lose(wir_r, c); u2_rl_lose(wir_r, d); u2_rl_lose(wir_r, e); u2_rl_lose(wir_r, f); u2_rl_lose(wir_r, g); return h; }
/* functions */ u2_weak // transfer j2_mbc(Pt3, mas)(u2_wire wir_r, u2_atom a) // retain { c3_w b_w; u2_atom c, d, e, f; b_w = u2_met(0, a); if ( b_w < 2 ) { return u2_bl_bail(wir_r, c3__exit); } else { c = j2_mbc(Pt3, bex)(wir_r, (b_w - 1)); d = j2_mbc(Pt3, bex)(wir_r, (b_w - 2)); e = j2_mbc(Pt1, sub)(wir_r, a, c); f = j2_mbc(Pt3, con)(wir_r, e, d); u2_rl_lose(wir_r, c); u2_rl_lose(wir_r, d); u2_rl_lose(wir_r, e); return f; } }
/* functions */ u2_weak // transfer j2_mbc(Pt3, rap)(u2_wire wir_r, u2_atom a, // retain u2_noun b) // retain { if ( !u2_fly_is_cat(a) || (a >= 32) ) { return u2_bl_bail(wir_r, c3__exit); } else { c3_g a_g = a; c3_w tot_w = 0; u2_ray sal_r; /* Measure and validate the slab required. */ { u2_noun cab = b; while ( 1 ) { u2_noun h_cab; c3_w len_w; if ( _0 == cab ) { break; } else if ( u2_no == u2_dust(cab) ) { return u2_bl_bail(wir_r, c3__exit); } else if ( u2_no == u2_stud(h_cab = u2_h(cab)) ) { return u2_bl_bail(wir_r, c3__exit); } else if ( (tot_w + (len_w = u2_met(a_g, h_cab))) < tot_w ) { return u2_bl_bail(wir_r, c3__fail); } tot_w += len_w; cab = u2_t(cab); } if ( 0 == tot_w ) { return _0; } if ( 0 == (sal_r = u2_rl_slaq(wir_r, a_g, tot_w)) ) { return u2_bl_bail(wir_r, c3__fail); } } /* Chop the list atoms in. */ { u2_noun cab = b; c3_w pos_w = 0; while ( _0 != cab ) { u2_noun h_cab = u2_h(cab); c3_w len_w = u2_met(a_g, h_cab); u2_chop(a_g, 0, len_w, pos_w, sal_r, h_cab); pos_w += len_w; cab = u2_t(cab); } } // return u2_rl_moot(wir_r, sal_r); return u2_rl_malt(wir_r, sal_r); } }
/* hill_boot(): create the hill engine. */ struct hill_state* // produce hill_boot(void) { struct hill_state* hil_h = malloc(sizeof(struct hill_state)); u2_ray wir_r; u2_boot(); wir_r = u2_wr_init(c3__rock, u2_ray_of(0, 0), u2_ray_of(1, 0)); Hill = hil_h; Hill->wir_r = wir_r; Hill->soa = u2_none; Hill->sob = u2_none; Hill->soc = u2_none; /* Mint the shoes. Impeccable memory practices. */ { u2_noun soa = u2_none; u2_noun sob = u2_none; u2_noun soc = u2_none; do { /* Boot shoe A. */ if ( u2_no == u2_rl_leap(wir_r, c3__rock) ) { c3_assert(0); } u2_bx_boot(wir_r); { u2_ray kit_r = u2_bl_open(wir_r); if ( u2_bl_set(wir_r) ) { u2_bl_done(wir_r, kit_r); u2_rl_fall(wir_r); fprintf(stderr, "{no boot, a}\n"); break; } else { soa = _hill_z_boot(wir_r, FileA); u2_bl_done(wir_r, kit_r); u2_bx_spot(wir_r, u2_nul); u2_bx_show(wir_r); } } fprintf(stderr, "{cold boot: %s, with %s jets: %x}\n", FileA, FileZ, u2_mug(soa)); Hill->soa = u2_rl_take(u2_wire_bas_r(wir_r), soa); u2_rl_fall(wir_r); /* Boot shoe B. */ if ( u2_no == u2_rl_leap(wir_r, c3__rock) ) { c3_assert(0); } u2_bx_boot(wir_r); { u2_ray kit_r = u2_bl_open(wir_r); if ( u2_bl_set(wir_r) ) { u2_bl_done(wir_r, kit_r); u2_rl_fall(wir_r); fprintf(stderr, "{no boot, b}\n"); break; } else { sob = _hill_a_boot(wir_r, soa, FileB); u2_bl_done(wir_r, kit_r); u2_bx_spot(wir_r, u2_nul); u2_bx_show(wir_r); } } fprintf(stderr, "{warm boot: %s, with %s: %x}\n", FileB, FileA, u2_mug(sob)); Hill->sob = u2_rl_take(u2_wire_bas_r(wir_r), sob); u2_rl_fall(wir_r); /* Boot shoe C. */ if ( u2_no == u2_rl_leap(wir_r, c3__rock) ) { c3_assert(0); } u2_bx_boot(wir_r); { u2_ray kit_r = u2_bl_open(wir_r); if ( u2_bl_set(wir_r) ) { u2_bl_done(wir_r, kit_r); u2_rl_fall(wir_r); fprintf(stderr, "{no boot, c}\n"); u2_bx_show(wir_r); break; } else { soc = _hill_b_eyre(wir_r, soa, sob, FileC); u2_bl_done(wir_r, kit_r); u2_bx_spot(wir_r, u2_nul); u2_bx_show(wir_r); } } fprintf(stderr, "{last boot: %s, with %s: %x}\n", FileC, FileB, u2_mug(soc)); Hill->soc = u2_rl_take(u2_wire_bas_r(wir_r), soc); u2_rl_fall(wir_r); /* Testing basics of soc. */ printf("testing eyre...\n"); { u2_noun foo = u2_rl_string(wir_r, "|!(a=@ (dec a))"); u2_noun bar = u2_nk_nock(wir_r, foo, Hill->soc); if ( u2_none == bar ) { printf("no bar\n"); } else { u2_noun moo = u2_nk_nock(wir_r, _0, bar); if ( u2_none == moo ) { printf("no moo\n"); } else { u2_noun zor = u2_nk_mung(wir_r, moo, 13); u2_err(wir_r, "zor", zor); } } } printf("tested.\n"); #if 1 { u2_noun soa = Hill->soa; u2_noun sob = Hill->sob; u2_noun dat = Hill->soc; u2_noun pak, bag; fprintf(stderr, "jam test: jam\n"); u2_bx_boot(wir_r); pak = _hill_b_jam(wir_r, soa, sob, dat); u2_bx_show(wir_r); fprintf(stderr, "jam test: %d bits\n", u2_met(0, pak)); u2_ux_write(wir_r, pak, "watt/264", "noun"); fprintf(stderr, "jam test: cue\n"); u2_bx_boot(wir_r); bag = _hill_b_cue(wir_r, soa, sob, pak); u2_bx_show(wir_r); if ( u2_yes == u2_sing(bag, dat) ) { fprintf(stderr, "jam test: match\n"); } else { fprintf(stderr, "jam test: NO MATCH\n"); } } #endif return Hill; } while (0); free(Hill); return 0; } }