From 50260728b2e2d2c9e61a13b54b6b973bdc48fae0 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 25 May 2009 18:42:24 +0200 Subject: make tab expansion for plain text utf8 aware In discussion with corvid . --- src/misc.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'src/misc.c') diff --git a/src/misc.c b/src/misc.c index 8cfb7003..d1a5352e 100644 --- a/src/misc.c +++ b/src/misc.c @@ -16,6 +16,7 @@ #include #include +#include "utf8.hh" #include "msg.h" #include "misc.h" @@ -47,7 +48,6 @@ char *a_Misc_escape_chars(const char *str, const char *esc_set) return p; } - #define TAB_SIZE 8 /* * Takes a string and converts any tabs to spaces. @@ -55,23 +55,27 @@ char *a_Misc_escape_chars(const char *str, const char *esc_set) char *a_Misc_expand_tabs(const char *str, int len) { Dstr *New = dStr_new(""); - int i, j, pos, old_pos; + int i = 0, j, pos = 0, old_pos, char_len; + uint_t code; char *val; - if (len) { - for (pos = 0, i = 0; i < len; i++) { - if (str[i] == '\t') { - /* Fill with whitespaces until the next tab. */ - old_pos = pos; - pos += TAB_SIZE - (pos % TAB_SIZE); - for (j = old_pos; j < pos; j++) - dStr_append_c(New, ' '); - } else { - dStr_append_c(New, str[i]); - pos++; - } + while (i < len) { + code = a_Utf8_decode(&str[i], str + len, &char_len); + + if (code == '\t') { + /* Fill with whitespaces until the next tab. */ + old_pos = pos; + pos += TAB_SIZE - (pos % TAB_SIZE); + for (j = old_pos; j < pos; j++) + dStr_append_c(New, ' '); + } else { + dStr_append_l(New, &str[i], char_len); + pos++; } + + i += char_len; } + val = New->str; dStr_free(New, FALSE); return val; -- cgit v1.2.3