# HG changeset patch # User Mikael Berthe # Date 1141594154 -3600 # Node ID 1c3620668857e9b724d69d0e2dd877836c4b726b # Parent 51be2bc1a820a45b930991e731240cbd703c7e10 Expand tabs when reading history files diff -r 51be2bc1a820 -r 1c3620668857 mcabber/src/histolog.c --- a/mcabber/src/histolog.c Sun Mar 05 19:09:17 2006 +0100 +++ b/mcabber/src/histolog.c Sun Mar 05 22:29:14 2006 +0100 @@ -33,6 +33,7 @@ #include "utils.h" #include "logprint.h" #include "settings.h" +#include "utils.h" static guint UseFileLogging; static guint FileLoadLogs; @@ -123,6 +124,7 @@ char *filename; guchar type, info; char *data, *tail; + char *xtext; time_t timestamp; guint prefix_flags; guint len; @@ -217,8 +219,10 @@ prefix_flags = HBB_PREFIX_OUT; else prefix_flags = HBB_PREFIX_IN; - hbuf_add_line(p_buddyhbuf, &data[26], timestamp, - prefix_flags, width); + xtext = ut_expand_tabs(&data[26]); // Expand tabs + hbuf_add_line(p_buddyhbuf, xtext, timestamp, prefix_flags, width); + if (xtext != &data[26]) + g_free(xtext); err = 0; } } diff -r 51be2bc1a820 -r 1c3620668857 mcabber/src/screen.c --- a/mcabber/src/screen.c Sun Mar 05 19:09:17 2006 +0100 +++ b/mcabber/src/screen.c Sun Mar 05 22:29:14 2006 +0100 @@ -978,29 +978,11 @@ inline void scr_WriteMessage(const char *jid, const char *text, time_t timestamp, guint prefix_flags) { - char *p, *xtext; - guint8 n =0; + char *xtext; if (!timestamp) timestamp = time(NULL); - xtext = (char*)text; - - // Expand tabs - for (p=xtext; *p; p++) - if (*p == '\t') n++; - if (n) { - char *q; - xtext = g_new(char, strlen(text) + 1 + 8*n); - p = (char*)text; - q = xtext; - do { - if (*p == '\t') { - do { *q++ = ' '; } while ((q-xtext)%8); - } else { - *q++ = *p; - } - } while (*p++); - } + xtext = ut_expand_tabs(text); // Expand tabs // XXX Are there other special chars we should filter out? diff -r 51be2bc1a820 -r 1c3620668857 mcabber/src/utils.c --- a/mcabber/src/utils.c Sun Mar 05 19:09:17 2006 +0100 +++ b/mcabber/src/utils.c Sun Mar 05 22:29:14 2006 +0100 @@ -459,4 +459,38 @@ } } +// ut_expand_tabs(text) +// Expand tabs in string text. +// If there is no tab in the string, a pointer to text is returned (be +// careful _not_ to free the pointer in this case). +// If there are some tabs, a new string with expanded chars is returned; this +// is up to the caller to free this string after use. +char *ut_expand_tabs(const char *text) +{ + char *xtext; + char *p, *q; + guint8 n=0; + + xtext = (char*)text; + for (p=xtext; *p; p++) + if (*p == '\t') n++; + + if (!n) + return (char*)text; + + xtext = g_new(char, strlen(text) + 1 + 8*n); + p = (char*)text; + q = xtext; + do { + if (*p == '\t') { + do { *q++ = ' '; } while ((q-xtext)%8); + } else { + *q++ = *p; + } + } while (*p++); + + return xtext; +} + + /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 51be2bc1a820 -r 1c3620668857 mcabber/src/utils.h --- a/mcabber/src/utils.h Sun Mar 05 19:09:17 2006 +0100 +++ b/mcabber/src/utils.h Sun Mar 05 22:29:14 2006 +0100 @@ -28,6 +28,7 @@ void free_arg_lst(char **arglst); void replace_nl_with_dots(char *bufstr); +char *ut_expand_tabs(const char *text); #endif