diff options
author | Sebastian Thorarensen <sebth@naju.se> | 2014-06-16 21:59:48 +0200 |
---|---|---|
committer | Sebastian Thorarensen <sebth@naju.se> | 2014-07-06 23:24:09 +0200 |
commit | 281c6d437dbc30ffc30c615b8dc773dc937abefa (patch) | |
tree | e9b3e49e883baabb621120378057c54a623529b4 | |
parent | 5c05c854dc298a914de8515a2795fa8dd2adca04 (diff) | |
download | irssi-281c6d437dbc30ffc30c615b8dc773dc937abefa.zip |
Avoid unnecessary splitting of lines
`split_line_end' could force lines to be unnecessarily split. This
commit fixes the problem by making sure that the last line isn't shorter
than `split_line_end'.
-rw-r--r-- | src/irc/core/irc-servers.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index 8af8364d..fa7feda6 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -81,7 +81,7 @@ static char **split_line(const SERVER_REC *server, const char *line, const char *end = settings_get_str("split_line_end"); char *recoded_start = recode_out(server, start, target); char *recoded_end = recode_out(server, end, target); - char **lines; + char **lines = NULL; int i; /* @@ -90,10 +90,8 @@ static char **split_line(const SERVER_REC *server, const char *line, * the code much simpler. It's worth it. */ len -= strlen(recoded_start) + strlen(recoded_end); - g_free(recoded_start); - g_free(recoded_end); if (len <= 0) - return NULL; /* There is no room for anything. */ + goto out; /* There is no room for anything. */ lines = recode_split(server, line, target, len); for (i = 0; lines[i] != NULL; i++) { @@ -106,11 +104,36 @@ static char **split_line(const SERVER_REC *server, const char *line, if (lines[i + 1] != NULL && *end != '\0') { /* Not the last line. */ char *tmp = lines[i]; + + if (lines[i + 2] == NULL) { + /* Next to last line. Check if we have room + * to append the last line to the current line, + * to avoid an unnecessary line break. + */ + char *recoded_l = recode_out(server, + lines[i+1], + target); + if (strlen(recoded_l) <= strlen(recoded_end)) { + lines[i] = g_strconcat(tmp, lines[i+1], + NULL); + g_free_and_null(lines[i+1]); + lines = g_renew(char *, lines, i + 2); + + g_free(recoded_l); + g_free(tmp); + break; + } + g_free(recoded_l); + } + lines[i] = g_strconcat(tmp, end, NULL); g_free(tmp); } } +out: + g_free(recoded_start); + g_free(recoded_end); return lines; } |