--- 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;
}
}
--- 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?
--- 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... */
--- 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