/* _unix_scan(): scan noun from file. */ static u2_noun _unix_scan(u2_wire wir_r, FILE* fil) { c3_i c = fgetc(fil); if ( c == '[' ) { return _unix_scan_cell(wir_r, fil); } else if ( c == '%' ) { c3_c buf[1025]; fscanf(fil, "%1024[a-z-]", buf); return u2_bn_string(wir_r, buf); } else { mpz_t amp; ungetc(c, fil); mpz_init(amp); gmp_fscanf(fil, "%Zd", amp); return u2_bn_mp(wir_r, amp); } }
/* u2_bn_decimal(): ** ** On (wir_r), write (list), a list of digits, as a decimal. */ u2_noun u2_bn_decimal(u2_ray wir_r, u2_list lit) { mpz_t mp; mpz_init(mp); while ( u2_nul != lit ) { c3_w byt_w = u2_bi_byte(wir_r, 0, u2_h(lit)); mpz_mul_ui(mp, mp, 10); mpz_add_ui(mp, mp, (byt_w - '0')); lit = u2_t(lit); } return u2_bn_mp(wir_r, mp); }
/* u2_bn_heximal(): ** ** On (wir_r), write (lit), a list of digits, as a hexadecimal. */ u2_noun u2_bn_heximal(u2_ray wir_r, u2_list lit) { mpz_t mp; mpz_init(mp); while ( u2_nul != lit ) { c3_w byt_w = u2_bi_byte(wir_r, 0, u2_h(lit)); mpz_mul_ui(mp, mp, 16); if ( (byt_w >= 'a') && (byt_w <= 'f') ) { mpz_add_ui(mp, mp, (byt_w + 10 - 'a')); } else { mpz_add_ui(mp, mp, (byt_w - '0')); } lit = u2_t(lit); } return u2_bn_mp(wir_r, mp); }