version 1.147, 2019/03/12 20:02:47 |
version 1.148, 2019/03/14 09:53:52 |
|
|
screen_write_cnputs(struct screen_write_ctx *ctx, ssize_t maxlen, |
screen_write_cnputs(struct screen_write_ctx *ctx, ssize_t maxlen, |
const struct grid_cell *gcp, const char *fmt, ...) |
const struct grid_cell *gcp, const char *fmt, ...) |
{ |
{ |
struct grid_cell gc; |
struct style sy; |
struct utf8_data *ud = &gc.data; |
struct utf8_data *ud = &sy.gc.data; |
va_list ap; |
va_list ap; |
char *msg; |
char *msg; |
u_char *ptr, *last; |
u_char *ptr, *last; |
size_t left, size = 0; |
size_t left, size = 0; |
enum utf8_state more; |
enum utf8_state more; |
|
|
memcpy(&gc, gcp, sizeof gc); |
style_set(&sy, gcp); |
|
|
va_start(ap, fmt); |
va_start(ap, fmt); |
xvasprintf(&msg, fmt, ap); |
xvasprintf(&msg, fmt, ap); |
|
|
} |
} |
*last = '\0'; |
*last = '\0'; |
|
|
style_parse(gcp, &gc, ptr); |
style_parse(&sy, gcp, ptr); |
ptr = last + 1; |
ptr = last + 1; |
continue; |
continue; |
} |
} |
|
|
continue; |
continue; |
if (maxlen > 0 && size + ud->width > (size_t)maxlen) { |
if (maxlen > 0 && size + ud->width > (size_t)maxlen) { |
while (size < (size_t)maxlen) { |
while (size < (size_t)maxlen) { |
screen_write_putc(ctx, &gc, ' '); |
screen_write_putc(ctx, &sy.gc, ' '); |
size++; |
size++; |
} |
} |
break; |
break; |
} |
} |
size += ud->width; |
size += ud->width; |
screen_write_cell(ctx, &gc); |
screen_write_cell(ctx, &sy.gc); |
} else { |
} else { |
if (maxlen > 0 && size + 1 > (size_t)maxlen) |
if (maxlen > 0 && size + 1 > (size_t)maxlen) |
break; |
break; |
|
|
if (*ptr == '\001') |
if (*ptr == '\001') |
gc.attr ^= GRID_ATTR_CHARSET; |
sy.gc.attr ^= GRID_ATTR_CHARSET; |
else if (*ptr > 0x1f && *ptr < 0x7f) { |
else if (*ptr > 0x1f && *ptr < 0x7f) { |
size++; |
size++; |
screen_write_putc(ctx, &gc, *ptr); |
screen_write_putc(ctx, &sy.gc, *ptr); |
} |
} |
ptr++; |
ptr++; |
} |
} |