mirror of
https://github.com/irssi/irssi.git
synced 2026-08-11 04:43:34 +02:00
Merge pull request #152 from sebth/master
Try to split long lines on spaces
This commit is contained in:
commit
9abdeb8611
6 changed files with 48 additions and 19 deletions
|
|
@ -967,19 +967,30 @@ char *ascii_strdown(char *str)
|
|||
return str;
|
||||
}
|
||||
|
||||
char **strsplit_len(const char *str, int len)
|
||||
char **strsplit_len(const char *str, int len, gboolean onspace)
|
||||
{
|
||||
char **ret;
|
||||
size_t total_len = strlen(str);
|
||||
int n = total_len / len;
|
||||
int i;
|
||||
char **ret = g_new(char *, 1);
|
||||
int n;
|
||||
int offset;
|
||||
|
||||
if (total_len % len)
|
||||
n++;
|
||||
|
||||
ret = g_new(char *, n + 1);
|
||||
for (i = 0; i < n; i++, str += len)
|
||||
ret[i] = g_strndup(str, len);
|
||||
for (n = 0; *str != '\0'; n++, str += MIN(len - offset, strlen(str))) {
|
||||
offset = 0;
|
||||
if (onspace) {
|
||||
/*
|
||||
* Try to find a space to split on and leave
|
||||
* the space on the previous line.
|
||||
*/
|
||||
int i;
|
||||
for (i = 0; i < len; i++) {
|
||||
if (str[len-1-i] == ' ') {
|
||||
offset = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret[n] = g_strndup(str, len - offset);
|
||||
ret = g_renew(char *, ret, n + 2);
|
||||
}
|
||||
ret[n] = NULL;
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -116,6 +116,6 @@ uoff_t str_to_uofft(const char *str);
|
|||
int find_substr(const char *list, const char *item);
|
||||
|
||||
/* split `str' into `len' sized substrings */
|
||||
char **strsplit_len(const char *str, int len);
|
||||
char **strsplit_len(const char *str, int len, gboolean onspace);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ char *recode_out(const SERVER_REC *server, const char *str, const char *target)
|
|||
}
|
||||
|
||||
char **recode_split(const SERVER_REC *server, const char *str,
|
||||
const char *target, int len)
|
||||
const char *target, int len, gboolean onspace)
|
||||
{
|
||||
GIConv cd = (GIConv)-1;
|
||||
const char *from = translit_charset;
|
||||
|
|
@ -219,7 +219,7 @@ char **recode_split(const SERVER_REC *server, const char *str,
|
|||
cd = g_iconv_open(to, from);
|
||||
if (cd == (GIConv)-1) {
|
||||
/* Fall back to splitting by byte. */
|
||||
ret = strsplit_len(str, len);
|
||||
ret = strsplit_len(str, len, onspace);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -235,11 +235,25 @@ char **recode_split(const SERVER_REC *server, const char *str,
|
|||
*/
|
||||
ret[n] = NULL;
|
||||
g_strfreev(ret);
|
||||
ret = strsplit_len(str, len);
|
||||
ret = strsplit_len(str, len, onspace);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Outbuf overflowed, split the input string. */
|
||||
if (onspace) {
|
||||
/*
|
||||
* Try to find a space to split on and leave
|
||||
* the space on the previous line.
|
||||
*/
|
||||
int i;
|
||||
for (i = 0; i < inbuf - previnbuf; i++) {
|
||||
if (previnbuf[inbuf-previnbuf-1-i] == ' ') {
|
||||
inbuf -= i;
|
||||
inbytesleft += i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret[n++] = g_strndup(previnbuf, inbuf - previnbuf);
|
||||
ret = g_renew(char *, ret, n + 1);
|
||||
previnbuf = inbuf;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
char *recode_in (const SERVER_REC *server, const char *str, const char *target);
|
||||
char *recode_out (const SERVER_REC *server, const char *str, const char *target);
|
||||
char **recode_split(const SERVER_REC *server, const char *str,
|
||||
const char *target, int len);
|
||||
const char *target, int len, gboolean onspace);
|
||||
gboolean is_valid_charset(const char *charset);
|
||||
gboolean is_utf8(void);
|
||||
void recode_update_charset(void);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue