summaryrefslogtreecommitdiffstats
path: root/screen-write.c
diff options
context:
space:
mode:
authornicm <nicm>2016-04-29 13:21:33 +0000
committernicm <nicm>2016-04-29 13:21:33 +0000
commit5f2bfd980737d2f13b744e288532e5d2daf97a0f (patch)
tree347772bf562e9b68544138be0bb1061a3fb36ac9 /screen-write.c
parent97417a18130ea17dbf9ab62b5e6dabb25376a988 (diff)
Make the grid_cell passed into screen_write_* const.
Diffstat (limited to 'screen-write.c')
-rw-r--r--screen-write.c100
1 files changed, 50 insertions, 50 deletions
diff --git a/screen-write.c b/screen-write.c
index e58d744c..63801dee 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -64,11 +64,15 @@ screen_write_reset(struct screen_write_ctx *ctx)
/* Write character. */
void
-screen_write_putc(struct screen_write_ctx *ctx, struct grid_cell *gc,
+screen_write_putc(struct screen_write_ctx *ctx, const struct grid_cell *gcp,
u_char ch)
{
- utf8_set(&gc->data, ch);
- screen_write_cell(ctx, gc);
+ struct grid_cell gc;
+
+ memcpy(&gc, gcp, sizeof gc);
+
+ utf8_set(&gc.data, ch);
+ screen_write_cell(ctx, &gc);
}
/* Calculate string length, with embedded formatting. */
@@ -148,75 +152,74 @@ screen_write_strlen(const char *fmt, ...)
/* Write simple string (no UTF-8 or maximum length). */
void
-screen_write_puts(struct screen_write_ctx *ctx, struct grid_cell *gc,
+screen_write_puts(struct screen_write_ctx *ctx, const struct grid_cell *gcp,
const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- screen_write_vnputs(ctx, -1, gc, fmt, ap);
+ screen_write_vnputs(ctx, -1, gcp, fmt, ap);
va_end(ap);
}
/* Write string with length limit (-1 for unlimited). */
void
screen_write_nputs(struct screen_write_ctx *ctx, ssize_t maxlen,
- struct grid_cell *gc, const char *fmt, ...)
+ const struct grid_cell *gcp, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- screen_write_vnputs(ctx, maxlen, gc, fmt, ap);
+ screen_write_vnputs(ctx, maxlen, gcp, fmt, ap);
va_end(ap);
}
void
screen_write_vnputs(struct screen_write_ctx *ctx, ssize_t maxlen,
- struct grid_cell *gc, const char *fmt, va_list ap)
+ const struct grid_cell *gcp, const char *fmt, va_list ap)
{
+ struct grid_cell gc;
+ struct utf8_data *ud = &gc.data;
char *msg;
- struct utf8_data ud;
u_char *ptr;
size_t left, size = 0;
enum utf8_state more;
+ memcpy(&gc, gcp, sizeof gc);
xvasprintf(&msg, fmt, ap);
ptr = msg;
while (*ptr != '\0') {
- if (*ptr > 0x7f && utf8_open(&ud, *ptr) == UTF8_MORE) {
+ if (*ptr > 0x7f && utf8_open(ud, *ptr) == UTF8_MORE) {
ptr++;
left = strlen(ptr);
- if (left < (size_t)ud.size - 1)
+ if (left < (size_t)ud->size - 1)
break;
- while ((more = utf8_append(&ud, *ptr)) == UTF8_MORE)
+ while ((more = utf8_append(ud, *ptr)) == UTF8_MORE)
ptr++;
ptr++;
- if (more == UTF8_DONE) {
- if (maxlen > 0 &&
- size + ud.width > (size_t) maxlen) {
- while (size < (size_t) maxlen) {
- screen_write_putc(ctx, gc, ' ');
- size++;
- }
- break;
+ if (more != UTF8_DONE)
+ continue;
+ if (maxlen > 0 && size + ud->width > (size_t)maxlen) {
+ while (size < (size_t)maxlen) {
+ screen_write_putc(ctx, &gc, ' ');
+ size++;
}
- size += ud.width;
-
- utf8_copy(&gc->data, &ud);
- screen_write_cell(ctx, gc);
+ break;
}
+ size += ud->width;
+ screen_write_cell(ctx, &gc);
} else {
- if (maxlen > 0 && size + 1 > (size_t) maxlen)
+ if (maxlen > 0 && size + 1 > (size_t)maxlen)
break;
if (*ptr == '\001')
- gc->attr ^= GRID_ATTR_CHARSET;
+ gc.attr ^= GRID_ATTR_CHARSET;
else if (*ptr > 0x1f && *ptr < 0x7f) {
size++;
- screen_write_putc(ctx, gc, *ptr);
+ screen_write_putc(ctx, &gc, *ptr);
}
ptr++;
}
@@ -228,22 +231,22 @@ screen_write_vnputs(struct screen_write_ctx *ctx, ssize_t maxlen,
/* Write string, similar to nputs, but with embedded formatting (#[]). */
void
screen_write_cnputs(struct screen_write_ctx *ctx, ssize_t maxlen,
- struct grid_cell *gc, const char *fmt, ...)
+ const struct grid_cell *gcp, const char *fmt, ...)
{
- struct grid_cell lgc;
- struct utf8_data ud;
+ struct grid_cell gc;
+ struct utf8_data *ud = &gc.data;
va_list ap;
char *msg;
u_char *ptr, *last;
size_t left, size = 0;
enum utf8_state more;
+ memcpy(&gc, gcp, sizeof gc);
+
va_start(ap, fmt);
xvasprintf(&msg, fmt, ap);
va_end(ap);
- memcpy(&lgc, gc, sizeof lgc);
-
ptr = msg;
while (*ptr != '\0') {
if (ptr[0] == '#' && ptr[1] == '[') {
@@ -255,42 +258,39 @@ screen_write_cnputs(struct screen_write_ctx *ctx, ssize_t maxlen,
}
*last = '\0';
- style_parse(gc, &lgc, ptr);
+ style_parse(gcp, &gc, ptr);
ptr = last + 1;
continue;
}
- if (*ptr > 0x7f && utf8_open(&ud, *ptr) == UTF8_MORE) {
+ if (*ptr > 0x7f && utf8_open(ud, *ptr) == UTF8_MORE) {
ptr++;
left = strlen(ptr);
- if (left < (size_t)ud.size - 1)
+ if (left < (size_t)ud->size - 1)
break;
- while ((more = utf8_append(&ud, *ptr)) == UTF8_MORE)
+ while ((more = utf8_append(ud, *ptr)) == UTF8_MORE)
ptr++;
ptr++;
- if (more == UTF8_DONE) {
- if (maxlen > 0 &&
- size + ud.width > (size_t) maxlen) {
- while (size < (size_t) maxlen) {
- screen_write_putc(ctx, gc, ' ');
- size++;
- }
- break;
+ if (more != UTF8_DONE)
+ continue;
+ if (maxlen > 0 && size + ud->width > (size_t)maxlen) {
+ while (size < (size_t)maxlen) {
+ screen_write_putc(ctx, &gc, ' ');
+ size++;
}
- size += ud.width;
-
- utf8_copy(&lgc.data, &ud);
- screen_write_cell(ctx, &lgc);
+ break;
}
+ size += ud->width;
+ screen_write_cell(ctx, &gc);
} else {
- if (maxlen > 0 && size + 1 > (size_t) maxlen)
+ if (maxlen > 0 && size + 1 > (size_t)maxlen)
break;
if (*ptr > 0x1f && *ptr < 0x7f) {
size++;
- screen_write_putc(ctx, &lgc, *ptr);
+ screen_write_putc(ctx, &gc, *ptr);
}
ptr++;
}