void shell_write_char(EditState *e, int c) { char ch; if (e->interactive) { ShellState *s = e->b->priv_data; ch = c; tty_write(s, &ch, 1); } else { switch (c) { case 4: do_delete_char(e); break; case 9: do_tab(e); break; case 11: do_kill_region(e, 2); break; case 127: do_backspace(e); break; case '\r': do_return(e); break; default: text_write_char(e, c); break; } } }
void hex_write_char(EditState *s, int key) { unsigned int cur_ch, ch; int hsize, shift, cur_len, len, h; char buf[10]; if (s->hex_mode) { if (s->unihex_mode) hsize = 4; else hsize = 2; h = to_hex(key); if (h < 0) return; if (s->insert && s->hex_nibble == 0) { ch = h << ((hsize - 1) * 4); if (s->unihex_mode) { len = unicode_to_charset(buf, ch, s->b->charset); } else { len = 1; buf[0] = ch; } eb_insert(s->b, s->offset, buf, len); } else { if (s->unihex_mode) { cur_ch = eb_nextc(s->b, s->offset, &cur_len); cur_len -= s->offset; } else { eb_read(s->b, s->offset, buf, 1); cur_ch = buf[0]; cur_len = 1; } shift = (hsize - s->hex_nibble - 1) * 4; ch = (cur_ch & ~(0xf << shift)) | (h << shift); if (s->unihex_mode) { len = unicode_to_charset(buf, ch, s->b->charset); } else { len = 1; buf[0] = ch; } #if 1 eb_replace(s->b, s->offset, cur_len, buf, len); #else if (cur_len == len) { eb_write(s->b, s->offset, buf, len); } else { eb_delete(s->b, s->offset, cur_len); eb_insert(s->b, s->offset, buf, len); } #endif } if (++s->hex_nibble == hsize) { s->hex_nibble = 0; if (s->offset < s->b->total_size) s->offset += len; } } else { text_write_char(s, key); } }