static void print_str(char *buf, int *idx, const char *str) { int d = *idx; if (width) { int ws_len; int i = 0; if (align_left) { i = width; d += u_copy_chars(buf + d, str, &i); ws_len = width - i; memset(buf + d, ' ', ws_len); d += ws_len; } else { int s = 0; ws_len = width - u_str_width(str); if (ws_len > 0) { memset(buf + d, ' ', ws_len); d += ws_len; i += ws_len; } if (ws_len < 0) { int w, c = -ws_len; uchar u; while (c > 0) { u = u_get_char(str, &s); w = u_char_width(u); c -= w; } if (c < 0) { /* gaah, skipped too much */ if (u_char_width(u) == 2) { /* double-byte */ buf[d++] = ' '; } else { /* <xx> */ if (c == -3) buf[d++] = hex_tab[(u >> 4) & 0xf]; if (c <= -2) buf[d++] = hex_tab[u & 0xf]; buf[d++] = '>'; } } } if (width - i > 0) { int w = width - i; d += u_copy_chars(buf + d, str + s, &w); } } } else {
int print_command(char prefix) { long i, w; unsigned int u; int x; // width of characters up to and including cursor position w = 1; // ":" (prefix) i = 0; while (i <= cmdline.pos && i < cmdline.buf.len) { u = u_get_char(cmdline.buf.buffer, cmdline.buf.len, &i); w += u_char_width(u); } if (cmdline.pos == cmdline.buf.len) { w++; } if (w > screen_w) obuf.scroll_x = w - screen_w; set_builtin_color(BC_COMMANDLINE); i = 0; buf_put_char(prefix); x = obuf.x - obuf.scroll_x; while (i < cmdline.buf.len) { BUG_ON(obuf.x > obuf.scroll_x + obuf.width); u = u_get_char(cmdline.buf.buffer, cmdline.buf.len, &i); if (!buf_put_char(u)) break; if (i <= cmdline.pos) x = obuf.x - obuf.scroll_x; } return x; }
int u_str_width(const char *str) { int idx = 0, w = 0; while (str[idx]) { uchar u = u_get_char(str, &idx); w += u_char_width(u); } return w; }
int u_str_nwidth(const char *str, int len) { int idx = 0; int w = 0; while (len > 0) { uchar u = u_get_char(str, &idx); if (u == 0) break; w += u_char_width(u); len--; } return w; }