summaryrefslogtreecommitdiff
path: root/src/perl
diff options
context:
space:
mode:
Diffstat (limited to 'src/perl')
-rw-r--r--src/perl/common/Window.xs24
-rw-r--r--src/perl/common/module.h1
-rw-r--r--src/perl/perl-common.c35
-rw-r--r--src/perl/perl-common.h3
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);