Extract some duplicate code in boxes.c into new function analyze_line_ascii() #1

This commit is contained in:
Thomas Jensen 2021-02-05 18:25:35 +01:00
parent a579da13a5
commit c41a4e881e
No known key found for this signature in database
GPG Key ID: A4ACEE270D0FB7DB

View File

@ -1285,6 +1285,21 @@ static size_t count_invisible_chars(const uint32_t *s, size_t *num_esc, char **a
static void analyze_line_ascii(line_t *line)
{
size_t num_esc = 0;
char *ascii;
size_t invis = count_invisible_chars(line->mbtext, &num_esc, &ascii);
line->invis = invis;
/* u32_strwidth() does not count control characters, i.e. ESC characters, for which we must correct */
line->len = u32_strwidth(line->mbtext, encoding) - invis + num_esc;
line->num_chars = u32_strlen(line->mbtext);
BFREE(line->text);
line->text = ascii;
}
static int apply_substitutions(const int mode) static int apply_substitutions(const int mode)
/* /*
* Apply regular expression substitutions to input text. * Apply regular expression substitutions to input text.
@ -1361,13 +1376,7 @@ static int apply_substitutions(const int mode)
input.lines[k].mbtext = newtext; input.lines[k].mbtext = newtext;
input.lines[k].mbtext_org = newtext; input.lines[k].mbtext_org = newtext;
size_t num_esc = 0; analyze_line_ascii(input.lines + k);
char *ascii; // TODO HERE extract into function analyze/asciify(line_t) ?
size_t invis = count_invisible_chars(input.lines[k].mbtext, &num_esc, &ascii);
input.lines[k].len = u32_strwidth(input.lines[k].mbtext, encoding) - invis + num_esc;
input.lines[k].num_chars = u32_strlen(input.lines[k].mbtext);
BFREE(input.lines[k].text);
input.lines[k].text = ascii;
if (input.lines[k].len > input.maxline) { if (input.lines[k].len > input.maxline) {
input.maxline = input.lines[k].len; input.maxline = input.lines[k].len;
} }
@ -1507,27 +1516,14 @@ static int read_all_input(const int use_stdin)
input.lines[input.anz_lines].num_chars = len_chars; input.lines[input.anz_lines].num_chars = len_chars;
/* /*
* Find ANSI CSI/ESC sequences * Build ASCII equivalent of the multi-byte string, update line stats
*/ */
size_t num_esc = 0; analyze_line_ascii(input.lines + input.anz_lines);
size_t invis = count_invisible_chars(input.lines[input.anz_lines].mbtext, &num_esc,
&(input.lines[input.anz_lines].text));
input.lines[input.anz_lines].invis = invis;
/* u32_strwidth() does not count control characters, i.e. ESC characters, for which we must correct */
size_t mbtext_cols = u32_strwidth(input.lines[input.anz_lines].mbtext, encoding);
input.lines[input.anz_lines].len = mbtext_cols - invis + num_esc;
input.lines[input.anz_lines].num_leading_blanks = 0; input.lines[input.anz_lines].num_leading_blanks = 0;
/*
* Update length of longest line
*/
if (input.lines[input.anz_lines].len > input.maxline) { if (input.lines[input.anz_lines].len > input.maxline) {
input.maxline = input.lines[input.anz_lines].len; input.maxline = input.lines[input.anz_lines].len;
} }
/*
* next please
*/
++input.anz_lines; ++input.anz_lines;
} }
@ -1541,12 +1537,7 @@ static int read_all_input(const int use_stdin)
else { else {
/* recalculate input statistics for redrawing the mended box */ /* recalculate input statistics for redrawing the mended box */
for (i = 0; i < input.anz_lines; ++i) { for (i = 0; i < input.anz_lines; ++i) {
size_t num_esc = 0; analyze_line_ascii(input.lines + i);
char *dummy; // TODO extract into function
size_t invis = count_invisible_chars(input.lines[i].mbtext, &num_esc, &dummy);
BFREE(dummy);
input.lines[i].len = u32_strwidth(input.lines[i].mbtext, encoding) - invis + num_esc;
input.lines[i].num_chars = u32_strlen(input.lines[i].mbtext);
if (input.lines[i].len > input.maxline) { if (input.lines[i].len > input.maxline) {
input.maxline = input.lines[i].len; input.maxline = input.lines[i].len;
} }