示例#1
0
文件: canvas.c 项目: j123123/radare2
R_API void r_cons_canvas_write(RConsCanvas *c, const char *s) {
	char *p, ch;
	int orig_x, x;
	int left, slen, attr_len, piece_len;

	if (!c || !s || !*s) {
		return;
	}
	/* split the string into pieces of non-ANSI chars and print them normally,
	** using the ANSI chars to set the attr of the canvas */
	orig_x = c->x;
	do {
		const char *s_part = set_attr (c, s);
		ch = 0;
		piece_len = get_piece (s_part, &ch);
		if (piece_len == 0 && ch == '\0' && s_part == s) {
			break;
		}
		left = 0;
		p = prefixline (c, &left);
		slen = R_MIN (left, piece_len);
		attr_len = slen <= 0 && s_part != s? 1: slen;
		if (attr_len > 0) {
			stamp_attr (c, attr_len);
		}
		x = c->x - c->sx;
		if (G (x, c->y - c->sy)) {
			memcpy (p, s_part, slen);
		}
		s = s_part;
		if (ch == '\n') {
			c->y++;
			c->x = orig_x;
			s++;
			if (*s == '\0') {
				break;
			}
		} else {
			c->x += slen;
		}
		s += piece_len;
	} while (*s);
	c->x = orig_x;
}
示例#2
0
文件: canvas.c 项目: Jing-Xie/radare2
R_API void r_cons_canvas_write(RConsCanvas *c, const char *s) {
	char *p, ch;
	int orig_x, x;
	int left, slen, piece_len;

	if (!c || !s || !*s) return;

	/* split the string into pieces of non-ANSI chars and print them normally,
	 * using the ANSI chars to set the attr of the canvas */
	orig_x = c->x;
	do {
		s = set_attr (c, s);
		piece_len = get_piece (s, &ch);
		if (piece_len == 0 && ch == '\0') break;

		slen = 0;
		if (piece_len > 0) {
			p = prefixline (c, &left);
			slen = R_MIN (left, piece_len);
			x = c->x - c->sx;
			if (G (x, c->y - c->sy)) {
				stamp_attr(c, slen);
				memcpy (p, s, slen);
			}
		}

		if (ch == '\n') {
			c->y++;
			c->x = orig_x;
			s++;
			if (*s == '\0') break;
		} else {
			c->x += slen;
		}
		s += piece_len;
	} while (*s);
}
示例#3
0
R_API void r_cons_canvas_write(RConsCanvas *c, const char *_s) {
    int left, slen;
    char *p, *s, *str;
    char *line, *n;
    int x;

    if (!c || !_s || !*_s)
        return;
    str = n = strdup (_s);

    do {
        s = n;
        line = getrow (s, &n);
        if (!line)
            break;

        if (*line == '\0' && n)
            continue;

        p = prefixline (c, &left);
        slen = R_MIN (left, strlen (line));
        if (slen < 1)
            break;

        x = c->x - c->sx;
        if (!G (x, c->y - c->sy))
            continue;

        stamp_attr(c, slen);
        memcpy (p, line, slen);

        if (!n) break;
    } while (G (c->x - c->sx, c->y + 1 - c->sy));

    free (str);
}