#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 strip_codes(input) char *input PREINIT: char *ret; PPCODE: ret = strip_codes(input); 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, formatnum, ...) Irssi::UI::Window window char *module Irssi::Server server char *target int formatnum PREINIT: TEXT_DEST_REC dest; THEME_REC *theme; char **charargs; char *ret; int n; PPCODE: charargs = g_new0(char *, items-5+1); for (n = 5; n < items; n++) { charargs[n-5] = (char *)SvPV(ST(n), PL_na); } format_create_dest(&dest, server, target, 0, window); theme = window_get_theme(dest.window); 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::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);