From 86b714881cf5c32895c8dd1b947cd752ea6698a1 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 29 Dec 2000 19:48:02 +0000 Subject: [PATCH] Irssi::print() doesn't call printtext() with args (.., "%s", text) since it broke %_ etc. formats. But instead of crashing every time someone prints %s with Irssi::print(), irssi now checks all those formats and prints them as-is. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1028 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/perl/common/Window.xs | 24 ++++++++++++++++++++---- src/perl/common/module.h | 1 + src/perl/perl-common.c | 35 +++++++++++++++++++++++++++++++++++ src/perl/perl-common.h | 3 +++ 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/perl/common/Window.xs b/src/perl/common/Window.xs index 540378b0..92db5391 100644 --- a/src/perl/common/Window.xs +++ b/src/perl/common/Window.xs @@ -30,15 +30,23 @@ void print(str, level=MSGLEVEL_CLIENTNOTICE) char *str int level; +PREINIT: + char *fixed; CODE: - printtext(NULL, NULL, level, "%s", str); + fixed = perl_fix_formats(str); + printtext(NULL, NULL, level, fixed); + g_free(fixed); void print_window(str, level=MSGLEVEL_CLIENTNOTICE) char *str int level; +PREINIT: + char *fixed; CODE: - printtext_window(active_win, level, "%s", str); + fixed = perl_fix_formats(str); + printtext_window(active_win, level, fixed); + g_free(fixed); void command(cmd, server=active_win->active_server, item=active_win->active) @@ -107,8 +115,12 @@ print(server, channel, str, level) char *channel char *str int level +PREINIT: + char *fixed; CODE: - printtext(server, channel, level, "%s", str); + fixed = perl_fix_formats(str); + printtext(server, channel, level, fixed); + g_free(fixed); Irssi::Windowitem window_item_find(server, name) @@ -276,5 +288,9 @@ print(item, str, level=MSGLEVEL_CLIENTNOTICE) Irssi::Windowitem item int level char *str +PREINIT: + char *fixed; CODE: - printtext(item->server, item->name, level, "%s", str); + fixed = perl_fix_formats(str); + printtext(item->server, item->name, level, fixed); + g_free(fixed); diff --git a/src/perl/common/module.h b/src/perl/common/module.h index c7db2d3a..7a035c6c 100644 --- a/src/perl/common/module.h +++ b/src/perl/common/module.h @@ -4,6 +4,7 @@ #undef _ #undef VERSION +#define HAVE_CONFIG_H #include "../module.h" #include "network.h" diff --git a/src/perl/perl-common.c b/src/perl/perl-common.c index 12c7b93c..f683a4a0 100644 --- a/src/perl/perl-common.c +++ b/src/perl/perl-common.c @@ -435,6 +435,41 @@ void printformat_perl(TEXT_DEST_REC *dest, char *format, char **arglist) g_free(module); } +/* change all %s strings to %%s */ +char *perl_fix_formats(char *str) +{ + char *ret, *out; + + out = ret = g_malloc(strlen(str)*2+1); + while (*str != '\0') { + if (*str == '%') { + str++; + switch (*str) { + case 's': + case 'd': + case 'f': + case 'u': + case 'l': + case '%': + *out++ = '%'; + *out++ = '%'; + if (*str == '%') + str += 2; + break; + default: + *out++ = '%'; + break; + } + + continue; + } + + *out++ = *str++; + } + *out = '\0'; + return ret; +} + void perl_command(const char *cmd, SERVER_REC *server, WI_ITEM_REC *item) { const char *cmdchars; diff --git a/src/perl/perl-common.h b/src/perl/perl-common.h index d8774090..c97a4e38 100644 --- a/src/perl/perl-common.h +++ b/src/perl/perl-common.h @@ -42,6 +42,9 @@ void irssi_add_plains(PLAIN_OBJECT_INIT_REC *objects); char *perl_get_use_list(void); +/* change all %s strings to %%s */ +char *perl_fix_formats(char *str); + void perl_common_init(void); void perl_common_deinit(void);