示例#1
0
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 {
示例#2
0
文件: screen.c 项目: huynhrene/dex
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;
}
示例#3
0
文件: uchar.c 项目: BG2BKK/cmus
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;
}
示例#4
0
文件: uchar.c 项目: BG2BKK/cmus
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;
}