summaryrefslogtreecommitdiffstats
path: root/src/perl/ui/Formats.xs
diff options
context:
space:
mode:
Diffstat (limited to 'src/perl/ui/Formats.xs')
-rw-r--r--src/perl/ui/Formats.xs177
1 files changed, 177 insertions, 0 deletions
diff --git a/src/perl/ui/Formats.xs b/src/perl/ui/Formats.xs
new file mode 100644
index 0000000..0f8b59b
--- /dev/null
+++ b/src/perl/ui/Formats.xs
@@ -0,0 +1,177 @@
+#define PERL_NO_GET_CONTEXT
+#include "module.h"
+
+static int magic_free_text_dest(pTHX_ SV *sv, MAGIC *mg)
+{
+ TEXT_DEST_REC *dest = (TEXT_DEST_REC *) mg->mg_ptr;
+ char *target = (char *) dest->target;
+ g_free(target);
+ g_free(dest);
+ mg->mg_ptr = NULL;
+ sv_setiv(sv, 0);
+ return 0;
+}
+
+static MGVTBL vtbl_free_text_dest =
+{
+ NULL, NULL, NULL, NULL, magic_free_text_dest
+};
+
+static SV *perl_format_create_dest(SERVER_REC *server, char *target,
+ int level, WINDOW_REC *window)
+{
+ TEXT_DEST_REC *dest;
+ SV *sv, *ret_sv;
+
+ dest = g_new0(TEXT_DEST_REC, 1);
+ format_create_dest(dest, server, g_strdup(target), level, window);
+
+ ret_sv = plain_bless(dest, "Irssi::UI::TextDest");
+
+ sv = *hv_fetch(hvref(ret_sv), "_irssi", 6, 0);
+ sv_magic(sv, NULL, '~', NULL, 0);
+
+ SvMAGIC(sv)->mg_private = 0x1551; /* HF */
+ SvMAGIC(sv)->mg_virtual = &vtbl_free_text_dest;
+ SvMAGIC(sv)->mg_ptr = (char *) dest;
+
+ return ret_sv;
+}
+
+MODULE = Irssi::UI::Formats PACKAGE = Irssi
+PROTOTYPES: ENABLE
+
+int
+format_get_length(str)
+ char *str
+
+int
+format_real_length(str, len)
+ char *str
+ int len
+
+void
+format_string_expand(str)
+ char *str
+PREINIT:
+ char *ret;
+PPCODE:
+ ret = format_string_expand(str, NULL);
+ XPUSHs(sv_2mortal(new_pv(ret)));
+ g_free(ret);
+
+void
+strip_codes(input)
+ char *input
+PREINIT:
+ char *ret;
+PPCODE:
+ ret = strip_codes(input);
+ XPUSHs(sv_2mortal(new_pv(ret)));
+ g_free(ret);
+
+void
+format_string_unexpand(input)
+ char *input
+PREINIT:
+ char *ret;
+PPCODE:
+ ret = format_string_unexpand(input, 0);
+ XPUSHs(sv_2mortal(new_pv(ret)));
+ g_free(ret);
+
+void
+format_create_dest(target, level=MSGLEVEL_CLIENTNOTICE, window=NULL)
+ char *target
+ int level
+ Irssi::UI::Window window
+PPCODE:
+ XPUSHs(sv_2mortal(perl_format_create_dest(NULL, target, level, window)));
+
+#*******************************
+MODULE = Irssi::UI::Formats PACKAGE = Irssi::UI::Window
+#*******************************
+
+void
+format_get_text(window, module, server, target, format, ...)
+ Irssi::UI::Window window
+ char *module
+ Irssi::Server server
+ char *target
+ char *format
+PREINIT:
+ TEXT_DEST_REC dest;
+ THEME_REC *theme;
+ char **charargs;
+ char *ret;
+ int formatnum;
+ int n;
+PPCODE:
+ charargs = g_new0(char *, items-5+1);
+ for (n = 5; n < items; n++) {
+ charargs[n-5] = SvPV_nolen(ST(n));
+ }
+
+ format_create_dest(&dest, server, target, 0, window);
+ theme = window_get_theme(dest.window);
+ formatnum = format_find_tag(module, format);
+
+ ret = format_get_text_theme_charargs(theme, module, &dest, formatnum, charargs);
+ g_free(charargs);
+
+ XPUSHs(sv_2mortal(new_pv(ret)));
+ g_free_not_null(ret);
+
+#*******************************
+MODULE = Irssi::UI::Formats PACKAGE = Irssi::UI::Window
+#*******************************
+
+void
+format_create_dest(window=NULL, level=MSGLEVEL_CLIENTNOTICE)
+ Irssi::UI::Window window
+ int level
+PPCODE:
+ XPUSHs(sv_2mortal(perl_format_create_dest(NULL, NULL, level, window)));
+
+#*******************************
+MODULE = Irssi::UI::Formats PACKAGE = Irssi::Server
+#*******************************
+
+void
+format_create_dest(server, target=NULL, level=MSGLEVEL_CLIENTNOTICE, window=NULL)
+ Irssi::Server server
+ char *target
+ int level
+ Irssi::UI::Window window
+PPCODE:
+ XPUSHs(sv_2mortal(perl_format_create_dest(server, target, level, window)));
+
+#*******************************
+MODULE = Irssi::UI::Formats PACKAGE = Irssi::UI::TextDest
+#*******************************
+
+void
+print(dest, str)
+ Irssi::UI::TextDest dest
+ char *str
+CODE:
+ printtext_dest(dest, "%s", str);
+
+#*******************************
+MODULE = Irssi::UI::Formats PACKAGE = Irssi::UI::TextDest PREFIX = format_dest_
+#*******************************
+
+void
+format_dest_meta_stash(dest, meta_key, meta_value)
+ Irssi::UI::TextDest dest
+ char *meta_key
+ char *meta_value
+
+char *
+format_dest_meta_stash_find(dest, meta_key)
+ Irssi::UI::TextDest dest
+ char *meta_key
+CODE:
+ RETVAL = (char *) format_dest_meta_stash_find(dest, meta_key);
+OUTPUT:
+ RETVAL