diff options
author | Sven Schnelle <svens@linux.ibm.com> | 2022-11-28 19:55:57 +0100 |
---|---|---|
committer | Heiko Carstens <hca@linux.ibm.com> | 2023-01-09 14:33:59 +0100 |
commit | 1fefd62fee50d4455ef5ebf65e22b282d773ed7d (patch) | |
tree | 4b30780dffb0ef87298e76110bdd4522a7e0105a /drivers/s390/char/con3270.c | |
parent | cbb36313bdb696cfe0874406327b24b403c9e8e0 (diff) | |
download | linux-stable-1fefd62fee50d4455ef5ebf65e22b282d773ed7d.tar.gz linux-stable-1fefd62fee50d4455ef5ebf65e22b282d773ed7d.tar.bz2 linux-stable-1fefd62fee50d4455ef5ebf65e22b282d773ed7d.zip |
s390/tty3270: split up tty3270_convert_line()
To make the code easier to read, split up tty3270_convertline()
into several subfunctions:
- tty3270_resize_line() to realloc the line if it doesn't have enough
space left
- tty3270_required_length() to calculate how much space we need
- tty3270_add_attributes() to add the color and highlight attributes
- tty3270_add_reset_attributes() to reset the attributes at the end of
the line
Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Tested-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Diffstat (limited to 'drivers/s390/char/con3270.c')
-rw-r--r-- | drivers/s390/char/con3270.c | 161 |
1 files changed, 93 insertions, 68 deletions
diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c index 61c73eb2471f..f4e7ac406511 100644 --- a/drivers/s390/char/con3270.c +++ b/drivers/s390/char/con3270.c @@ -1101,6 +1101,18 @@ static char tty3270_graphics_translate(struct tty3270 *tp, char ch) } } +static struct string *tty3270_resize_line(struct tty3270 *tp, struct string *s, int newlen) +{ + struct string *n = tty3270_alloc_string(tp, newlen); + + list_add(&n->list, &s->list); + list_del_init(&s->list); + if (!list_empty(&s->update)) + list_del_init(&s->update); + free_string(&tp->freemem, s); + return n; +} + /* * Insert character into the screen at the current position with the * current color and highlight. This function does NOT do cursor movement. @@ -1128,26 +1140,19 @@ static void tty3270_put_character(struct tty3270 *tp, char ch) cell->attributes = tp->attributes; } -/* - * Convert a tty3270_line to a 3270 data fragment usable for output. - */ -static void tty3270_convert_line(struct tty3270 *tp, int line_nr) +static int tty3270_required_length(struct tty3270 *tp, int line_nr) { + unsigned char f_color, b_color, highlight; struct tty3270_line *line; struct tty3270_cell *cell; - struct string *s, *n; - unsigned char highlight; - unsigned char f_color, b_color; - char *cp; - int flen, i; + int i, flen = 3; /* Prefix (TO_SBA). */ - /* Determine how long the fragment will be. */ - flen = 3; /* Prefix (TO_SBA). */ line = tp->screen + line_nr; flen += line->len; highlight = TAX_RESET; f_color = TAC_RESET; b_color = TAC_RESET; + for (i = 0, cell = line->cells; i < line->len; i++, cell++) { if (cell->attributes.highlight != highlight) { flen += 3; /* TO_SA to switch highlight. */ @@ -1173,80 +1178,107 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr) if (line->len < tp->view.cols) flen += 4; /* Postfix (TO_RA). */ - /* Find the line in the list. */ - i = tp->view.rows - 2 - line_nr; - list_for_each_entry_reverse(s, &tp->lines, list) - if (--i <= 0) - break; - /* - * Check if the line needs to get reallocated. - */ - if (s->len != flen) { - /* Reallocate string. */ - n = tty3270_alloc_string(tp, flen); - list_add(&n->list, &s->list); - list_del_init(&s->list); - if (!list_empty(&s->update)) - list_del_init(&s->update); - free_string(&tp->freemem, s); - s = n; + return flen; +} + +static char *tty3270_add_reset_attributes(struct tty3270 *tp, struct tty3270_line *line, + char *cp, struct tty3270_attribute *attr) +{ + if (attr->highlight != TAX_RESET) { + *cp++ = TO_SA; + *cp++ = TAT_EXTHI; + *cp++ = TAX_RESET; + } + if (attr->f_color != TAC_RESET) { + *cp++ = TO_SA; + *cp++ = TAT_FGCOLOR; + *cp++ = TAC_RESET; + } + if (attr->b_color != TAC_RESET) { + *cp++ = TO_SA; + *cp++ = TAT_BGCOLOR; + *cp++ = TAC_RESET; + } + if (line->len < tp->view.cols) { + *cp++ = TO_RA; + *cp++ = 0; + *cp++ = 0; + *cp++ = 0; } + return cp; +} + +static char *tty3270_add_attributes(struct tty3270_line *line, struct tty3270_attribute *attr, + char *cp) +{ + struct tty3270_cell *cell; + int i; - /* Write 3270 data fragment. */ - cp = s->string; *cp++ = TO_SBA; *cp++ = 0; *cp++ = 0; - highlight = TAX_RESET; - f_color = TAC_RESET; - b_color = TAC_RESET; for (i = 0, cell = line->cells; i < line->len; i++, cell++) { - if (cell->attributes.highlight != highlight) { + if (cell->attributes.highlight != attr->highlight) { *cp++ = TO_SA; *cp++ = TAT_EXTHI; *cp++ = cell->attributes.highlight; - highlight = cell->attributes.highlight; + attr->highlight = cell->attributes.highlight; } - if (cell->attributes.f_color != f_color) { + if (cell->attributes.f_color != attr->f_color) { *cp++ = TO_SA; *cp++ = TAT_FGCOLOR; *cp++ = cell->attributes.f_color; - f_color = cell->attributes.f_color; + attr->f_color = cell->attributes.f_color; } - if (cell->attributes.b_color != b_color) { + if (cell->attributes.b_color != attr->b_color) { *cp++ = TO_SA; *cp++ = TAT_BGCOLOR; *cp++ = cell->attributes.b_color; - b_color = cell->attributes.b_color; + attr->b_color = cell->attributes.b_color; } if (cell->attributes.alternate_charset) *cp++ = TO_GE; - *cp++ = cell->character; } - if (highlight != TAX_RESET) { - *cp++ = TO_SA; - *cp++ = TAT_EXTHI; - *cp++ = TAX_RESET; - } - if (f_color != TAC_RESET) { - *cp++ = TO_SA; - *cp++ = TAT_FGCOLOR; - *cp++ = TAC_RESET; - } - if (b_color != TAC_RESET) { - *cp++ = TO_SA; - *cp++ = TAT_BGCOLOR; - *cp++ = TAC_RESET; - } - if (line->len < tp->view.cols) { - *cp++ = TO_RA; - *cp++ = 0; - *cp++ = 0; - *cp++ = 0; - } + return cp; +} +static void tty3270_reset_attributes(struct tty3270_attribute *attr) +{ + attr->highlight = TAX_RESET; + attr->f_color = TAC_RESET; + attr->b_color = TAC_RESET; +} + +/* + * Convert a tty3270_line to a 3270 data fragment usable for output. + */ +static void tty3270_convert_line(struct tty3270 *tp, int line_nr) +{ + struct tty3270_line *line = tp->screen + line_nr; + struct tty3270_attribute attr; + struct string *s; + int flen, i; + char *cp; + + /* Determine how long the fragment will be. */ + flen = tty3270_required_length(tp, line_nr); + /* Find the line in the list. */ + i = tp->view.rows - 2 - line_nr; + list_for_each_entry_reverse(s, &tp->lines, list) + if (--i <= 0) + break; + /* + * Check if the line needs to get reallocated. + */ + if (s->len != flen) + s = tty3270_resize_line(tp, s, flen); + + /* Write 3270 data fragment. */ + tty3270_reset_attributes(&attr); + cp = tty3270_add_attributes(line, &attr, s->string); + cp = tty3270_add_reset_attributes(tp, line, cp, &attr); if (tp->nr_up + line_nr < tp->view.rows - 2) { /* Line is currently visible on screen. */ tty3270_update_string(tp, s, line_nr); @@ -1297,13 +1329,6 @@ static void tty3270_ri(struct tty3270 *tp) } } -static void tty3270_reset_attributes(struct tty3270_attribute *attr) -{ - attr->highlight = TAX_RESET; - attr->f_color = TAC_RESET; - attr->b_color = TAC_RESET; -} - static void tty3270_reset_cell(struct tty3270 *tp, struct tty3270_cell *cell) { cell->character = tp->view.ascebc[' ']; |