/* _term_it_show_wide(): show wide text, retaining. */ static void _term_it_show_wide(u3_utty* uty_u, c3_w len_w, c3_w* txt_w) { u3_noun wad = u3i_words(len_w, txt_w); u3_noun txt = u3do("tuft", wad); c3_c* txt_c = u3r_string(txt); _term_it_write_str(uty_u, txt_c); free(txt_c); u3z(txt); uty_u->tat_u.mir.cus_w += len_w; }
/* _sist_cask(): ask for a passcode. */ static u3_noun _sist_cask(c3_c* dir_c, u3_noun nun) { c3_c paw_c[60]; u3_noun key; uH; while ( 1 ) { printf("passcode for %s%s? ~", dir_c, (c3y == nun) ? " [none]" : ""); paw_c[0] = 0; c3_fpurge(stdin); fgets(paw_c, 59, stdin); if ( '\n' == paw_c[0] ) { if ( c3y == nun ) { key = 0; break; } else { continue; } } else { c3_c* say_c = c3_malloc(strlen(paw_c) + 2); u3_noun say; say_c[0] = '~'; say_c[1] = 0; strncat(say_c, paw_c, strlen(paw_c) - 1); say = u3do("slay", u3i_string(say_c)); if ( (u3_nul == say) || (u3_blip != u3h(u3t(say))) || ('p' != u3h(u3t(u3t(say)))) ) { printf("invalid passcode\n"); continue; } key = u3k(u3t(u3t(u3t(say)))); u3z(say); break; } } uL(0); return key; }
/* _sist_staf(): try to load passcode by mug from home directory. */ static u3_noun _sist_staf(c3_l key_l) { c3_c ful_c[2048]; c3_c* hom_c = u3_Host.dir_c; u3_noun gum = u3dc("scot", 'p', key_l); c3_c* gum_c = u3r_string(gum); u3_noun txt; snprintf(ful_c, 2048, "%s/.urb/code.%s", hom_c, gum_c); free(gum_c); u3z(gum); txt = u3_walk_safe(ful_c); if ( 0 == txt ) { uL(fprintf(uH, "staf: no passcode %s\n", ful_c)); return 0; } else { // c3_c* txt_c = u3r_string(txt); u3_noun say = u3do("slay", txt); u3_noun pas; if ( (u3_nul == say) || (u3_blip != u3h(u3t(say))) || ('p' != u3h(u3t(u3t(say)))) ) { uL(fprintf(uH, "staf: %s is corrupt\n", ful_c)); u3z(say); return 0; } uL(fprintf(uH, "loaded passcode from %s\n", ful_c)); pas = u3k(u3t(u3t(u3t(say)))); u3z(say); return pas; } }
/* _term_io_suck_char(): process a single character. */ static void _term_io_suck_char(u3_utty* uty_u, c3_y cay_y) { u3_utat* tat_u = &uty_u->tat_u; if ( c3y == tat_u->esc.ape ) { if ( c3y == tat_u->esc.bra ) { switch ( cay_y ) { default: { _term_it_write_txt(uty_u, uty_u->ufo_u.out.bel_y); break; } case 'A': _term_io_belt(uty_u, u3nc(c3__aro, 'u')); break; case 'B': _term_io_belt(uty_u, u3nc(c3__aro, 'd')); break; case 'C': _term_io_belt(uty_u, u3nc(c3__aro, 'r')); break; case 'D': _term_io_belt(uty_u, u3nc(c3__aro, 'l')); break; } tat_u->esc.ape = tat_u->esc.bra = c3n; } else { if ( (cay_y >= 'a') && (cay_y <= 'z') ) { tat_u->esc.ape = c3n; _term_io_belt(uty_u, u3nc(c3__met, cay_y)); } else if ( ('[' == cay_y) || ('O' == cay_y) ) { tat_u->esc.bra = c3y; } else { tat_u->esc.ape = c3n; _term_it_write_txt(uty_u, uty_u->ufo_u.out.bel_y); } } } else if ( 0 != tat_u->fut.wid_w ) { tat_u->fut.syb_y[tat_u->fut.len_w++] = cay_y; if ( tat_u->fut.len_w == tat_u->fut.wid_w ) { u3_noun huv = u3i_bytes(tat_u->fut.wid_w, tat_u->fut.syb_y); u3_noun wug; // uL(fprintf(uH, "muck-utf8 len %d\n", tat_u->fut.len_w)); // uL(fprintf(uH, "muck-utf8 %x\n", huv)); wug = u3do("turf", huv); // uL(fprintf(uH, "muck-utf32 %x\n", tat_u->fut.len_w)); tat_u->fut.len_w = tat_u->fut.wid_w = 0; _term_io_belt(uty_u, u3nt(c3__txt, wug, u3_nul)); } } else { if ( (cay_y >= 32) && (cay_y < 127) ) { _term_io_belt(uty_u, u3nt(c3__txt, cay_y, u3_nul)); } else if ( 0 == cay_y ) { _term_it_write_txt(uty_u, uty_u->ufo_u.out.bel_y); } else if ( 8 == cay_y || 127 == cay_y ) { _term_io_belt(uty_u, u3nc(c3__bac, u3_nul)); } else if ( 13 == cay_y ) { _term_io_belt(uty_u, u3nc(c3__ret, u3_nul)); } else if ( cay_y <= 26 ) { _term_io_belt(uty_u, u3nc(c3__ctl, ('a' + (cay_y - 1)))); } else if ( 27 == cay_y ) { tat_u->esc.ape = c3y; } else if ( cay_y >= 128 ) { tat_u->fut.len_w = 1; tat_u->fut.syb_y[0] = cay_y; if ( cay_y <= 224 ) { tat_u->fut.wid_w = 2; } else if ( cay_y <= 240 ) { tat_u->fut.wid_w = 3; } else tat_u->fut.wid_w = 4; } } }