summaryrefslogtreecommitdiff
path: root/src/perl
diff options
context:
space:
mode:
Diffstat (limited to 'src/perl')
-rw-r--r--src/perl/.cvsignore9
-rw-r--r--src/perl/Makefile.am22
-rwxr-xr-xsrc/perl/get-signals.pl29
-rw-r--r--src/perl/irssi-perl.c43
-rw-r--r--src/perl/irssi-perl.h7
-rw-r--r--src/perl/xs/.cvsignore7
-rw-r--r--src/perl/xs/Irssi-bans.xs40
-rw-r--r--src/perl/xs/Irssi-channel.xs193
-rw-r--r--src/perl/xs/Irssi-core.xs122
-rw-r--r--src/perl/xs/Irssi-dcc.xs39
-rw-r--r--src/perl/xs/Irssi-flood.xs29
-rw-r--r--src/perl/xs/Irssi-ignore.xs74
-rw-r--r--src/perl/xs/Irssi-log.xs89
-rw-r--r--src/perl/xs/Irssi-masks.xs26
-rw-r--r--src/perl/xs/Irssi-modes.xs67
-rw-r--r--src/perl/xs/Irssi-netsplit.xs34
-rw-r--r--src/perl/xs/Irssi-notifylist.xs71
-rw-r--r--src/perl/xs/Irssi-query.xs74
-rw-r--r--src/perl/xs/Irssi-rawlog.xs84
-rw-r--r--src/perl/xs/Irssi-server.xs184
-rw-r--r--src/perl/xs/Irssi-settings.xs39
-rw-r--r--src/perl/xs/Irssi-window.xs106
-rw-r--r--src/perl/xs/Irssi.xs942
-rw-r--r--src/perl/xs/Makefile.PL.in2
-rw-r--r--src/perl/xs/module.h54
-rw-r--r--src/perl/xs/typemap12
26 files changed, 1449 insertions, 949 deletions
diff --git a/src/perl/.cvsignore b/src/perl/.cvsignore
new file mode 100644
index 00000000..04cb6224
--- /dev/null
+++ b/src/perl/.cvsignore
@@ -0,0 +1,9 @@
+*.la
+*.lo
+*.o
+.deps
+.libs
+Makefile
+Makefile.in
+so_locations
+perl-signals.h
diff --git a/src/perl/Makefile.am b/src/perl/Makefile.am
index 4093d2ad..2e527e70 100644
--- a/src/perl/Makefile.am
+++ b/src/perl/Makefile.am
@@ -1,6 +1,6 @@
noinst_LTLIBRARIES = libperl.la
-libperl_la_DEPENDENCIES = perl-signals.h
+irssi-perl.c: perl-signals.h
INCLUDES = $(GLIB_CFLAGS) \
-DPLUGINSDIR=\""$(libdir)/irssi/plugins"\" \
@@ -18,11 +18,31 @@ perl-signals.h: $(top_srcdir)/docs/signals.txt $(srcdir)/get-signals.pl
EXTRA_DIST = \
get-signals.pl \
+ xs/Irssi-bans.xs \
+ xs/Irssi-channel.xs \
+ xs/Irssi-core.xs \
+ xs/Irssi-dcc.xs \
+ xs/Irssi-flood.xs \
+ xs/Irssi-ignore.xs \
+ xs/Irssi-log.xs \
+ xs/Irssi-masks.xs \
+ xs/Irssi-modes.xs \
+ xs/Irssi-netsplit.xs \
+ xs/Irssi-notifylist.xs \
+ xs/Irssi-query.xs \
+ xs/Irssi-rawlog.xs \
+ xs/Irssi-server.xs \
+ xs/Irssi-settings.xs \
+ xs/Irssi-window.xs \
xs/Irssi.xs \
xs/Irssi.pm \
xs/Makefile.PL.in \
xs/typemap
+noinst_HEADERS = \
+ module.h \
+ xs/module.h
+
all-local:
cd xs && if [ ! -f Makefile ]; then $(perlpath) Makefile.PL; fi && $(MAKE) && cd ..
diff --git a/src/perl/get-signals.pl b/src/perl/get-signals.pl
index 73b6401f..e3a574a9 100755
--- a/src/perl/get-signals.pl
+++ b/src/perl/get-signals.pl
@@ -18,18 +18,23 @@ while (<STDIN>) {
s/int[^,]*/int/g;
s/GSList of (\w+)s/gslist_\1/g;
- s/SERVER_REC \*[^,]*/Irssi::Server/g;
- s/RECONNECT_REC \*[^,]*/Irssi::Reconnect/g;
- s/CHANNEL_REC \*[^,]*/Irssi::Channel/g;
- s/COMMAND_REC \*[^,]*/Irssi::Command/g;
- s/NICK_REC \*[^,]*/Irssi::Nick/g;
- s/BAN_REC \*[^,]*/Irssi::Ban/g;
- s/NETSPLIT_REC \*[^,]*/Irssi::Netsplit/g;
- s/DCC_REC \*[^,]*/Irssi::Dcc/g;
- s/LOG_REC \*[^,]*/Irssi::Log/g;
- s/LOG_ITEM_REC \*[^,]*/Irssi::Logitem/g;
- s/PLUGIN_REC \*[^,]*/Irssi::Plugin/g;
- s/AUTOIGNORE_REC \*[^,]*/Irssi::Autoignore/g;
+ s/SERVER_REC[^,]*/Irssi::Server/g;
+ s/IRC_SERVER_REC[^,]*/Irssi::Server/g;
+ s/RECONNECT_REC[^,]*/Irssi::Reconnect/g;
+ s/CHANNEL_REC[^,]*/Irssi::Channel/g;
+ s/QUERY_REC[^,]*/Irssi::Query/g;
+ s/COMMAND_REC[^,]*/Irssi::Command/g;
+ s/NICK_REC[^,]*/Irssi::Nick/g;
+ s/BAN_REC[^,]*/Irssi::Ban/g;
+ s/DCC_REC[^,]*/Irssi::Dcc/g;
+ s/NETSPLIT_REC[^,]*/Irssi::Netsplit/g;
+ s/AUTOIGNORE_REC[^,]*/Irssi::Autoignore/g;
+ s/LOG_REC[^,]*/Irssi::Log/g;
+ s/RAWLOG_REC[^,]*/Irssi::Rawlog/g;
+ s/NOTIFYLIST_REC[^,]*/Irssi::Notifylist/g;
+ s/IGNORE_REC[^,]*/Irssi::Ignore/g;
+ s/WINDOW_REC[^,]*/Irssi::Window/g;
+ s/WI_ITEM_REC[^,]*/Irssi::Windowitem/g;
s/([\w:]+)(,|$)/"\1"\2/g;
print " { -1, \"$signal\", { $_, NULL } },\n";
diff --git a/src/perl/irssi-perl.c b/src/perl/irssi-perl.c
index 494e0da5..49373684 100644
--- a/src/perl/irssi-perl.c
+++ b/src/perl/irssi-perl.c
@@ -116,14 +116,13 @@ static void irssi_perl_start(void)
"sub load_file()\n"
"{\n"
" (my $file_name) = @_;\n"
- " open FH, $file_name or return 2;\n"
+ " open FH, $file_name or return \"File not found: $file_name\";\n"
" local($/) = undef;\n"
" $file = <FH>;\n"
" close FH;\n"
" eval $file;\n"
" eval $file if $@;\n"
- " return 1 if $@;\n"
- " return 0;\n"
+ " return $@ if $@;\n"
"}";
first_signals = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal);
@@ -137,9 +136,16 @@ static void irssi_perl_start(void)
perl_eval_pv(load_file, TRUE);
}
-static void signal_destroy_hash(void *key, PERL_SIGNAL_REC *rec)
+static void signal_destroy_hash(void *key, GSList *list)
{
- perl_signal_destroy(rec);
+ GSList *next;
+
+ while (list != NULL) {
+ next = list->next;
+
+ perl_signal_destroy(list->data);
+ list = next;
+ }
}
static void irssi_perl_stop(void)
@@ -195,10 +201,15 @@ static void cmd_run(char *data)
if (SvTRUE(ERRSV)) {
STRLEN n_a;
- signal_emit("perl error", 1, SvPV(ERRSV, n_a));
+ signal_emit("gui dialog", 2, "error", SvPV(ERRSV, n_a));
(void) POPs;
}
- else while (retcount--) (void) POPi;
+ else if (retcount > 0) {
+ char *str = POPp;
+
+ if (str != NULL && *str != '\0')
+ signal_emit("gui dialog", 2, "error", str);
+ }
PUTBACK;
FREETMPS;
@@ -406,8 +417,12 @@ static int call_perl(const char *func, int signal, va_list va)
}
else
{
- stash = gv_stashpv(rec->args[n], 0);
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(arg))), stash)));
+ if (arg == NULL)
+ XPUSHs(sv_2mortal(newSViv(0)));
+ else {
+ stash = gv_stashpv(rec->args[n], 0);
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(arg))), stash)));
+ }
}
}
}
@@ -421,7 +436,7 @@ static int call_perl(const char *func, int signal, va_list va)
{
STRLEN n_a;
- signal_emit("perl error", 1, SvPV(ERRSV, n_a));
+ signal_emit("gui dialog", 2, "error", SvPV(ERRSV, n_a));
(void)POPs;
}
else
@@ -490,6 +505,7 @@ static void irssi_perl_autorun(void)
{
DIR *dirp;
struct dirent *dp;
+ struct stat statbuf;
char *path, *fname;
path = g_strdup_printf("%s/.irssi/scripts/autorun", g_get_home_dir());
@@ -501,7 +517,8 @@ static void irssi_perl_autorun(void)
while ((dp = readdir(dirp)) != NULL) {
fname = g_strdup_printf("%s/%s", path, dp->d_name);
- cmd_run(fname);
+ if (stat(fname, &statbuf) == 0 && !S_ISDIR(statbuf.st_mode))
+ cmd_run(fname);
g_free(fname);
}
closedir(dirp);
@@ -522,8 +539,8 @@ void irssi_perl_deinit(void)
{
irssi_perl_stop();
- command_unbind("run", (SIGNAL_FUNC) cmd_run);
- command_unbind("perlflush", (SIGNAL_FUNC) cmd_flush);
if (signal_grabbed) signal_remove("signal", (SIGNAL_FUNC) sig_signal);
if (siglast_grabbed) signal_remove("last signal", (SIGNAL_FUNC) sig_lastsignal);
+ command_unbind("run", (SIGNAL_FUNC) cmd_run);
+ command_unbind("perlflush", (SIGNAL_FUNC) cmd_flush);
}
diff --git a/src/perl/irssi-perl.h b/src/perl/irssi-perl.h
deleted file mode 100644
index b26ac3b0..00000000
--- a/src/perl/irssi-perl.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __IRSSI_PERL_H
-#define __IRSSI_PERL_H
-
-void irssi_perl_init(void);
-void irssi_perl_deinit(void);
-
-#endif
diff --git a/src/perl/xs/.cvsignore b/src/perl/xs/.cvsignore
new file mode 100644
index 00000000..d424b077
--- /dev/null
+++ b/src/perl/xs/.cvsignore
@@ -0,0 +1,7 @@
+Makefile
+Makefile.PL
+Irssi.c
+Irssi.bs
+*.o
+pm_to_blib
+blib
diff --git a/src/perl/xs/Irssi-bans.xs b/src/perl/xs/Irssi-bans.xs
new file mode 100644
index 00000000..6d76bb5d
--- /dev/null
+++ b/src/perl/xs/Irssi-bans.xs
@@ -0,0 +1,40 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+ban_set_type(type)
+ char *type
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Channel
+#*******************************
+
+char *
+ban_get_mask(channel, nick)
+ Irssi::Channel channel
+ char *nick
+
+void
+ban_set(channel, bans)
+ Irssi::Channel channel
+ char *bans
+
+void
+ban_remove(channel, ban)
+ Irssi::Channel channel
+ char *ban
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Ban
+#*******************************
+
+void
+values(ban)
+ Irssi::Ban ban
+PREINIT:
+ HV *hv;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "ban", 3, new_pv(ban->ban), 0);
+ hv_store(hv, "setby", 5, new_pv(ban->setby), 0);
+ hv_store(hv, "time", 4, newSViv(ban->time), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
diff --git a/src/perl/xs/Irssi-channel.xs b/src/perl/xs/Irssi-channel.xs
new file mode 100644
index 00000000..62d5892e
--- /dev/null
+++ b/src/perl/xs/Irssi-channel.xs
@@ -0,0 +1,193 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+channels()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Channel", 0);
+ for (tmp = channels; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+int
+is_channel(text)
+ char *text
+CODE:
+ RETVAL = ischannel(*text);
+OUTPUT:
+ RETVAL
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server
+#*******************************
+
+void
+channels(server)
+ Irssi::Server server
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Channel", 0);
+ for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+Irssi::Channel
+channel_create(server, channel, automatic)
+ Irssi::Server server
+ char *channel
+ int automatic
+
+Irssi::Channel
+channel_find(server, channel)
+ Irssi::Server server
+ char *channel
+
+void
+channels_join(server, data, automatic)
+ Irssi::Server server
+ char *data
+ int automatic
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Channel PREFIX = channel_
+#*******************************
+
+void
+values(channel)
+ Irssi::Channel channel
+PREINIT:
+ HV *hv, *stash;
+ char *type;
+PPCODE:
+ type = "channel";
+
+ hv = newHV();
+ hv_store(hv, "type", 4, new_pv(type), 0);
+
+ stash = gv_stashpv("Irssi::Server", 0);
+ hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(channel->server))), stash), 0);
+ hv_store(hv, "name", 4, new_pv(channel->name), 0);
+
+ hv_store(hv, "new_data", 8, newSViv(channel->new_data), 0);
+ hv_store(hv, "createtime", 10, newSViv(channel->createtime), 0);
+
+ hv_store(hv, "topic", 5, new_pv(channel->topic), 0);
+ hv_store(hv, "limit", 5, newSViv(channel->limit), 0);
+ hv_store(hv, "key", 3, new_pv(channel->key), 0);
+
+ hv_store(hv, "chanop", 6, newSViv(channel->chanop), 0);
+
+ hv_store(hv, "names_got", 9, newSViv(channel->names_got), 0);
+ hv_store(hv, "wholist", 7, newSViv(channel->wholist), 0);
+ hv_store(hv, "synced", 6, newSViv(channel->synced), 0);
+
+ hv_store(hv, "left", 4, newSViv(channel->left), 0);
+ hv_store(hv, "kicked", 6, newSViv(channel->kicked), 0);
+
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+void
+channel_destroy(channel)
+ Irssi::Channel channel
+
+Irssi::Channel
+channel_find(channel)
+ char *channel
+CODE:
+ RETVAL = channel_find(NULL, channel);
+OUTPUT:
+ RETVAL
+
+void
+command(channel, cmd)
+ Irssi::Channel channel
+ char *cmd
+CODE:
+ signal_emit("send command", 3, cmd, channel->server, channel);
+
+char *
+channel_get_mode(channel)
+ Irssi::Channel channel
+
+Irssi::Nick
+nicklist_insert(channel, nick, op, voice, send_massjoin)
+ Irssi::Channel channel
+ char *nick
+ int op
+ int voice
+ int send_massjoin
+
+void
+nicklist_remove(channel, nick)
+ Irssi::Channel channel
+ Irssi::Nick nick
+
+Irssi::Nick
+nicklist_find(channel, mask)
+ Irssi::Channel channel
+ char *mask
+
+void
+nicklist_getnicks(channel)
+ Irssi::Channel channel
+PREINIT:
+ GSList *list, *tmp;
+ HV *stash;
+PPCODE:
+ list = nicklist_getnicks(channel);
+
+ stash = gv_stashpv("Irssi::Nick", 0);
+ for (tmp = list; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+ g_slist_free(list);
+
+void
+nicklist_get_same(server, nick)
+ Irssi::Server server
+ char *nick
+PREINIT:
+ GSList *list, *tmp;
+ HV *chanstash, *nickstash;
+PPCODE:
+ list = nicklist_get_same(server, nick);
+
+ chanstash = gv_stashpv("Irssi::Channel", 0);
+ nickstash = gv_stashpv("Irssi::Nick", 0);
+
+ for (tmp = list; tmp != NULL; tmp = tmp->next->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), chanstash)));
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->next->data))), nickstash)));
+ }
+ g_slist_free(list);
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Nick
+#*******************************
+
+void
+values(nick)
+ Irssi::Nick nick
+PREINIT:
+ HV *hv;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "last_check", 10, newSViv(nick->last_check), 0);
+ hv_store(hv, "send_massjoin", 13, newSViv(nick->send_massjoin), 0);
+
+ hv_store(hv, "nick", 4, new_pv(nick->nick), 0);
+ hv_store(hv, "host", 4, new_pv(nick->host), 0);
+ hv_store(hv, "realname", 8, new_pv(nick->realname), 0);
+
+ hv_store(hv, "hops", 4, newSViv(nick->hops), 0);
+
+ hv_store(hv, "op", 2, newSViv(nick->op), 0);
+ hv_store(hv, "voice", 5, newSViv(nick->voice), 0);
+ hv_store(hv, "gone", 4, newSViv(nick->gone), 0);
+ hv_store(hv, "ircop", 5, newSViv(nick->ircop), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
diff --git a/src/perl/xs/Irssi-core.xs b/src/perl/xs/Irssi-core.xs
new file mode 100644
index 00000000..b7cdcb6d
--- /dev/null
+++ b/src/perl/xs/Irssi-core.xs
@@ -0,0 +1,122 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+signal_emit(signal, ...)
+ char *signal
+CODE:
+ void *p[6];
+ int n;
+
+ memset(p, 0, sizeof(p));
+ for (n = 1; n < items && n < 6; n++) {
+ p[n-1] = SvPOKp(ST(n)) ? SvPV(ST(n), PL_na) : (void *) SvIV((SV*)SvRV(ST(n)));
+ }
+ signal_emit(signal, items-1, p[0], p[1], p[2], p[3], p[4], p[5]);
+
+void
+signal_add(signal, func)
+ char *signal
+ char *func
+CODE:
+ perl_signal_add(signal, func);
+
+void
+signal_add_last(signal, func)
+ char *signal
+ char *func
+CODE:
+ perl_signal_add_last(signal, func);
+
+void
+signal_remove(signal, func)
+ char *signal
+ char *func
+CODE:
+ perl_signal_remove(signal, func);
+
+void
+signal_stop()
+
+void
+signal_stop_by_name(signal)
+ char *signal
+
+int
+timeout_add(msecs, func, data)
+ int msecs
+ char *func
+ char *data
+CODE:
+ RETVAL = perl_timeout_add(msecs, func, data);
+OUTPUT:
+ RETVAL
+
+void
+timeout_remove(tag)
+ int tag
+CODE:
+ perl_timeout_remove(tag);
+
+int
+level2bits(str)
+ char *str
+
+char *
+bits2level(bits)
+ int bits
+
+int
+combine_level(level, str)
+ int level
+ char *str
+
+void
+commands()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Command", 0);
+ for (tmp = commands; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+void
+command_bind(cmd, category, func)
+ char *cmd
+ char *category
+ char *func
+CODE:
+ char *signal;
+
+ command_bind(cmd, *category ? category : "Perl scripts' commands", NULL);
+ signal = g_strconcat("command ", cmd, NULL);
+ perl_signal_add(signal, func);
+ g_free(signal);
+
+void
+command_unbind(cmd, func)
+ char *cmd
+ char *func
+CODE:
+ char *signal;
+
+ command_unbind(cmd, NULL);
+ signal = g_strconcat("command ", cmd, NULL);
+ perl_signal_remove(signal, func);
+ g_free(signal);
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Command PREFIX = command_
+#*******************************
+
+void
+values(cmd)
+ Irssi::Command cmd
+PREINIT:
+ HV *hv;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "category", 8, new_pv(cmd->category), 0);
+ hv_store(hv, "cmd", 3, new_pv(cmd->cmd), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
diff --git a/src/perl/xs/Irssi-dcc.xs b/src/perl/xs/Irssi-dcc.xs
new file mode 100644
index 00000000..fe524c0b
--- /dev/null
+++ b/src/perl/xs/Irssi-dcc.xs
@@ -0,0 +1,39 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+dccs()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Dcc", 0);
+ for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+Irssi::Dcc
+dcc_find_item(type, nick, arg)
+ int type
+ char *nick
+ char *arg
+
+Irssi::Dcc
+dcc_find_by_port(nick, port)
+ char *nick
+ int port
+
+char *
+dcc_type2str(type)
+ int type
+
+int
+dcc_str2type(type)
+ char *type
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Dcc PREFIX = dcc_
+#*******************************
+
+void
+dcc_destroy(dcc)
+ Irssi::Dcc dcc
diff --git a/src/perl/xs/Irssi-flood.xs b/src/perl/xs/Irssi-flood.xs
new file mode 100644
index 00000000..3cb04226
--- /dev/null
+++ b/src/perl/xs/Irssi-flood.xs
@@ -0,0 +1,29 @@
+MODULE = Irssi PACKAGE = Irssi::Server
+
+void
+autoignore_add(server, nick, level)
+ Irssi::Server server
+ char *nick
+ int level
+
+int
+autoignore_remove(server, mask, level)
+ Irssi::Server server
+ char *mask
+ int level
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Autoignore
+#*******************************
+
+void
+values(ai)
+ Irssi::Autoignore ai
+PREINIT:
+ HV *hv;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "nick", 4, new_pv(ai->nick), 0);
+ hv_store(hv, "timeleft", 8, newSViv(ai->timeleft), 0);
+ hv_store(hv, "level", 5, newSViv(ai->level), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
diff --git a/src/perl/xs/Irssi-ignore.xs b/src/perl/xs/Irssi-ignore.xs
new file mode 100644
index 00000000..643198f3
--- /dev/null
+++ b/src/perl/xs/Irssi-ignore.xs
@@ -0,0 +1,74 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+ignores()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Ignore", 0);
+ for (tmp = servers; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+int
+ignore_check(nick, host, channel, text, level)
+ char *nick
+ char *host
+ char *channel
+ char *text
+ int level
+CODE:
+ RETVAL = ignore_check(NULL, nick, host, channel, text, level);
+OUTPUT:
+ RETVAL
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server
+#*******************************
+
+int
+ignore_check(server, nick, host, channel, text, level)
+ Irssi::Server server
+ char *nick
+ char *host
+ char *channel
+ char *text
+ int level
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Ignore PREFIX = ignore_
+#*******************************
+
+void
+values(ignore)
+ Irssi::Ignore ignore
+PREINIT:
+ HV *hv;
+ AV *av;
+ char **tmp;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "mask", 4, new_pv(ignore->mask), 0);
+ hv_store(hv, "servertag", 9, new_pv(ignore->servertag), 0);
+ av = newAV();
+ for (tmp = ignore->channels; *tmp != NULL; tmp++) {
+ av_push(av, new_pv(*tmp));
+ }
+ hv_store(hv, "channels", 8, newRV_noinc((SV*)av), 0);
+ hv_store(hv, "pattern", 7, new_pv(ignore->pattern), 0);
+
+ hv_store(hv, "level", 5, newSViv(ignore->level), 0);
+ hv_store(hv, "except_level", 12, newSViv(ignore->except_level), 0);
+
+ hv_store(hv, "regexp", 6, newSViv(ignore->regexp), 0);
+ hv_store(hv, "fullword", 8, newSViv(ignore->fullword), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+void
+ignore_add_rec(rec)
+ Irssi::Ignore rec
+
+void
+ignore_update_rec(rec)
+ Irssi::Ignore rec
diff --git a/src/perl/xs/Irssi-log.xs b/src/perl/xs/Irssi-log.xs
new file mode 100644
index 00000000..b0ce8cf0
--- /dev/null
+++ b/src/perl/xs/Irssi-log.xs
@@ -0,0 +1,89 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+logs()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Log", 0);
+ for (tmp = logs; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+Irssi::Log
+log_create_rec(fname, level, items)
+ char *fname
+ int level
+ char *items
+
+Irssi::Log
+log_find(fname)
+ char *fname
+
+void
+log_write(item, level, str)
+ char *item
+ int level
+ char *str
+
+char *
+log_rotate2str(rotate)
+ int rotate
+CODE:
+ RETVAL = (char *) log_rotate2str(rotate);
+OUTPUT:
+ RETVAL
+
+int
+log_str2rotate(str)
+ char *str
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Log PREFIX = log_
+#*******************************
+
+void
+values(log)
+ Irssi::Log log
+PREINIT:
+ HV *hv;
+ AV *av;
+ char **tmp;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "fname", 5, new_pv(log->fname), 0);
+ hv_store(hv, "opened", 6, newSViv(log->opened), 0);
+ hv_store(hv, "level", 5, newSViv(log->level), 0);
+ hv_store(hv, "last", 4, newSViv(log->last), 0);
+ hv_store(hv, "rotate", 6, new_pv((char *) log_rotate2str(log->rotate)), 0);
+ hv_store(hv, "autoopen", 8, newSViv(log->autoopen), 0);
+ hv_store(hv, "temp", 4, newSViv(log->temp), 0);
+
+ av = newAV();
+ for (tmp = log->items; *tmp != NULL; tmp++) {
+ av_push(av, new_pv(*tmp));
+ }
+ hv_store(hv, "items", 4, newRV_noinc((SV*)av), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+void
+log_update(log)
+ Irssi::Log log
+
+void
+log_close(log)
+ Irssi::Log log
+
+void
+log_write_rec(log, str)
+ Irssi::Log log
+ char *str
+
+void
+log_start_logging(log)
+ Irssi::Log log
+
+void
+log_stop_logging(log)
+ Irssi::Log log
diff --git a/src/perl/xs/Irssi-masks.xs b/src/perl/xs/Irssi-masks.xs
new file mode 100644
index 00000000..1d8167ce
--- /dev/null
+++ b/src/perl/xs/Irssi-masks.xs
@@ -0,0 +1,26 @@
+MODULE = Irssi PACKAGE = Irssi
+
+int
+irc_mask_match(mask, nick, user, host)
+ char *mask
+ char *nick
+ char *user
+ char *host
+
+int
+irc_mask_match_address(mask, nick, address)
+ char *mask
+ char *nick
+ char *address
+
+int
+irc_masks_match(masks, nick, address)
+ char *masks
+ char *nick
+ char *address
+
+char *
+irc_get_mask(nick, host, flags)
+ char *nick
+ char *host
+ int flags
diff --git a/src/perl/xs/Irssi-modes.xs b/src/perl/xs/Irssi-modes.xs
new file mode 100644
index 00000000..e1f08d10
--- /dev/null
+++ b/src/perl/xs/Irssi-modes.xs
@@ -0,0 +1,67 @@
+MODULE = Irssi PACKAGE = Irssi
+
+char *
+modes_join(old, mode)
+ char *old
+ char *mode
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server
+#*******************************
+
+void
+channel_set_singlemode(server, channel, nicks, mode)
+ Irssi::Server server
+ char *channel
+ char *nicks
+ char *mode
+
+void
+channel_set_mode(server, channel, mode)
+ Irssi::Server server
+ char *channel
+ char *mode
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Channel PREFIX = channel_
+#*******************************
+
+void
+parse_channel_modes(channel, setby, modestr)
+ Irssi::Channel channel
+ char *setby
+ char *modestr
+
+Irssi::Ban
+banlist_add(channel, ban, nick, time)
+ Irssi::Channel channel
+ char *ban
+ char *nick
+ time_t time
+
+void
+banlist_remove(channel, ban)
+ Irssi::Channel channel
+ char *ban
+
+Irssi::Ban
+banlist_exception_add(channel, ban, nick, time)
+ Irssi::Channel channel
+ char *ban
+ char *nick
+ time_t time
+
+void
+banlist_exception_remove(channel, ban)
+ Irssi::Channel channel
+ char *ban
+
+void
+invitelist_add(channel, mask)
+ Irssi::Channel channel
+ char *mask
+
+void
+invitelist_remove(channel, mask)
+ Irssi::Channel channel
+ char *mask
diff --git a/src/perl/xs/Irssi-netsplit.xs b/src/perl/xs/Irssi-netsplit.xs
new file mode 100644
index 00000000..0c1e998f
--- /dev/null
+++ b/src/perl/xs/Irssi-netsplit.xs
@@ -0,0 +1,34 @@
+MODULE = Irssi PACKAGE = Irssi::Server
+
+Irssi::Netsplit
+netsplit_find(server, nick, address)
+ Irssi::Server server
+ char *nick
+ char *address
+
+Irssi::Nick
+netsplit_find_channel(server, nick, address, channel)
+ Irssi::Server server
+ char *nick
+ char *address
+ char *channel
+
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Netsplit
+#*******************************
+
+void
+values(netsplit)
+ Irssi::Netsplit netsplit
+PREINIT:
+ HV *hv;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "nick", 4, new_pv(netsplit->nick), 0);
+ hv_store(hv, "address", 7, new_pv(netsplit->address), 0);
+ hv_store(hv, "server", 6, new_pv(netsplit->server), 0);
+ hv_store(hv, "destserver", 10, new_pv(netsplit->destserver), 0);
+ hv_store(hv, "destroy", 7, newSViv(netsplit->destroy), 0);
+ /*FIXME: add GSList *channels;*/
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
diff --git a/src/perl/xs/Irssi-notifylist.xs b/src/perl/xs/Irssi-notifylist.xs
new file mode 100644
index 00000000..4b3d22c9
--- /dev/null
+++ b/src/perl/xs/Irssi-notifylist.xs
@@ -0,0 +1,71 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+notifies()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Notifylist", 0);
+ for (tmp = notifies; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+Irssi::Notifylist
+notifylist_add(mask, ircnets, away_check, idle_check_time)
+ char *mask
+ char *ircnets
+ int away_check
+ int idle_check_time
+
+void
+notifylist_remove(mask)
+ char *mask
+
+Irssi::Server
+notifylist_ison(nick, serverlist)
+ char *nick
+ char *serverlist
+
+Irssi::Notifylist
+notifylist_find(mask, ircnet)
+ char *mask
+ char *ircnet
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server
+#*******************************
+
+int
+notifylist_ison_server(server, nick)
+ Irssi::Server server
+ char *nick
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Notifylist PREFIX = notifylist_
+#*******************************
+
+void
+values(notify)
+ Irssi::Notifylist notify
+PREINIT:
+ HV *hv;
+ AV *av;
+ char **tmp;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "mask", 4, new_pv(notify->mask), 0);
+ hv_store(hv, "away_check", 10, newSViv(notify->away_check), 0);
+ hv_store(hv, "idle_check_time", 15, newSViv(notify->idle_check_time), 0);
+
+ av = newAV();
+ for (tmp = notify->ircnets; *tmp != NULL; tmp++) {
+ av_push(av, new_pv(*tmp));
+ }
+ hv_store(hv, "ircnets", 7, newRV_noinc((SV*)av), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+int
+notifylist_ircnets_match(rec, ircnet)
+ Irssi::Notifylist rec
+ char *ircnet
diff --git a/src/perl/xs/Irssi-query.xs b/src/perl/xs/Irssi-query.xs
new file mode 100644
index 00000000..95275dce
--- /dev/null
+++ b/src/perl/xs/Irssi-query.xs
@@ -0,0 +1,74 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+queries()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Query", 0);
+ for (tmp = queries; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server
+#*******************************
+
+void
+queries(server)
+ Irssi::Server server
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Query", 0);
+ for (tmp = server->queries; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+Irssi::Query
+query_create(server, nick, automatic)
+ Irssi::Server server
+ char *nick
+ int automatic
+
+Irssi::Query
+query_find(server, nick)
+ Irssi::Server server
+ char *nick
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Query PREFIX = query_
+#*******************************
+
+void
+values(query)
+ Irssi::Query query
+PREINIT:
+ HV *hv, *stash;
+ char *type;
+PPCODE:
+ type = "query";
+
+ hv = newHV();
+ hv_store(hv, "type", 4, new_pv(type), 0);
+
+ stash = gv_stashpv("Irssi::Server", 0);
+ hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(query->server))), stash), 0);
+ hv_store(hv, "nick", 4, new_pv(query->nick), 0);
+ hv_store(hv, "new_data", 8, newSViv(query->new_data), 0);
+
+ hv_store(hv, "address", 7, new_pv(query->address), 0);
+ hv_store(hv, "server_tag", 10, new_pv(query->server_tag), 0);
+
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+void
+query_destroy(query)
+ Irssi::Query query
+
+void
+query_change_server(query, server)
+ Irssi::Query query
+ Irssi::Server server
diff --git a/src/perl/xs/Irssi-rawlog.xs b/src/perl/xs/Irssi-rawlog.xs
new file mode 100644
index 00000000..c7422bac
--- /dev/null
+++ b/src/perl/xs/Irssi-rawlog.xs
@@ -0,0 +1,84 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+rawlog_set_size(lines)
+ int lines
+
+Irssi::Rawlog
+rawlog_create()
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server
+#*******************************
+
+void
+rawlog_input(rawlog, str)
+ Irssi::Rawlog rawlog
+ char *str
+
+void
+rawlog_output(rawlog, str)
+ Irssi::Rawlog rawlog
+ char *str
+
+void
+rawlog_redirect(rawlog, str)
+ Irssi::Rawlog rawlog
+ char *str
+
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Rawlog PREFIX = rawlog_
+#*******************************
+
+void
+values(rawlog)
+ Irssi::Rawlog rawlog
+PREINIT:
+ HV *hv;
+ AV *av;
+ GSList *tmp;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "logging", 7, newSViv(rawlog->logging), 0);
+ hv_store(hv, "nlines", 6, newSViv(rawlog->nlines), 0);
+
+ av = newAV();
+ for (tmp = rawlog->lines; tmp != NULL; tmp = tmp->next) {
+ av_push(av, new_pv(tmp->data));
+ }
+ hv_store(hv, "lines", 5, newRV_noinc((SV*)av), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+void
+rawlog_destroy(rawlog)
+ Irssi::Rawlog rawlog
+
+void
+rawlog_input(rawlog, str)
+ Irssi::Rawlog rawlog
+ char *str
+
+void
+rawlog_output(rawlog, str)
+ Irssi::Rawlog rawlog
+ char *str
+
+void
+rawlog_redirect(rawlog, str)
+ Irssi::Rawlog rawlog
+ char *str
+
+void
+rawlog_open(rawlog, fname)
+ Irssi::Rawlog rawlog
+ char *fname
+
+void
+rawlog_close(rawlog)
+ Irssi::Rawlog rawlog
+
+void
+rawlog_save(rawlog, fname)
+ Irssi::Rawlog rawlog
+ char *fname
diff --git a/src/perl/xs/Irssi-server.xs b/src/perl/xs/Irssi-server.xs
new file mode 100644
index 00000000..326b8d99
--- /dev/null
+++ b/src/perl/xs/Irssi-server.xs
@@ -0,0 +1,184 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+servers()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Server", 0);
+ for (tmp = servers; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+void
+reconnects()
+PREINIT:
+ GSList *tmp;
+ HV *stash;
+PPCODE:
+ stash = gv_stashpv("Irssi::Reconnect", 0);
+ for (tmp = reconnects; tmp != NULL; tmp = tmp->next) {
+ XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
+ }
+
+Irssi::Connect
+irc_server_create_conn(dest, port=6667, password=NULL, nick=NULL)
+ char *dest
+ int port
+ char *password
+ char *nick
+
+Irssi::Server
+server_find_tag(tag)
+ char *tag
+CODE:
+ RETVAL = (IRC_SERVER_REC *) server_find_tag(tag);
+OUTPUT:
+ RETVAL
+
+Irssi::Server
+server_find_ircnet(ircnet)
+ char *ircnet
+CODE:
+ RETVAL = (IRC_SERVER_REC *) server_find_ircnet(ircnet);
+OUTPUT:
+ RETVAL
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server PREFIX = server_
+#*******************************
+
+void
+values(server)
+ Irssi::Server server
+PREINIT:
+ HV *hv, *stash;
+ char *type;
+PPCODE:
+ type = "IRC";
+
+ hv = newHV();
+ hv_store(hv, "type", 4, new_pv(type), 0);
+ server_fill_hash(hv, server);
+
+ hv_store(hv, "real_address", 12, new_pv(server->real_address), 0);
+ hv_store(hv, "version", 7, new_pv(server->version), 0);
+ hv_store(hv, "usermode", 8, new_pv(server->usermode), 0);
+ hv_store(hv, "userhost", 8, new_pv(server->userhost), 0);
+ hv_store(hv, "last_invite", 11, new_pv(server->last_invite), 0);
+ hv_store(hv, "away_reason", 11, new_pv(server->away_reason), 0);
+ hv_store(hv, "usermode_away", 13, newSViv(server->usermode_away), 0);
+ hv_store(hv, "server_operator", 15, newSViv(server->server_operator), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+int
+server_connect(server)
+ Irssi::Server server
+CODE:
+ RETVAL = server_connect((SERVER_REC *) server);
+OUTPUT:
+ RETVAL
+
+void
+server_disconnect(server)
+ Irssi::Server server
+CODE:
+ server_disconnect((SERVER_REC *) server);
+
+char *
+irc_server_get_channels(server)
+ Irssi::Server server
+
+void
+send_raw(server, cmd)
+ Irssi::Server server
+ char *cmd
+CODE:
+ irc_send_cmd(server, cmd);
+
+void
+irc_send_cmd_split(server, cmd, arg, max_nicks)
+ Irssi::Server server
+ char *cmd
+ int arg
+ int max_nicks
+
+void
+ctcp_send_reply(server, data)
+ Irssi::Server server
+ char *data
+
+void
+server_redirect_init(server, command, last, ...)
+ Irssi::Server server
+ char *command
+ int last
+PREINIT:
+ GSList *list;
+ int n;
+CODE:
+ list = NULL;
+ for (n = 3; n < items; n++) {
+ list = g_slist_append(list, SvPV(ST(n), PL_na));
+ }
+ server_redirect_initv(server, command, last, list);
+
+int
+server_redirect_single_event(server, arg, last, group, event, signal, argpos)
+ Irssi::Server server
+ char *arg
+ int last
+ int group
+ char *event
+ char *signal
+ int argpos
+
+void
+server_redirect_event(server, arg, last, ...)
+ Irssi::Server server
+ char *arg
+ int last
+PREINIT:
+ int n, group;
+CODE:
+ group = 0;
+ for (n = 3; n+3 <= items; n += 3, last--) {
+ group = server_redirect_single_event(server, arg, last > 0, group,
+ (char *) SvPV(ST(n), PL_na), (char *) SvPV(ST(n+1), PL_na), (int) SvIV(ST(n+2)));
+ }
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Connect PREFIX = irc_server_
+#*******************************
+
+void
+values(conn)
+ Irssi::Connect conn
+PREINIT:
+ HV *hv;
+PPCODE:
+ hv = newHV();
+ connect_fill_hash(hv, conn);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+Irssi::Server
+irc_server_connect(conn)
+ Irssi::Connect conn
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Reconnect
+#*******************************
+
+void
+values(reconnect)
+ Irssi::Reconnect reconnect
+PREINIT:
+ HV *hv;
+PPCODE:
+ hv = newHV();
+ add_connect_hash(hv, reconnect->conn);
+ hv_store(hv, "tag", 3, newSViv(reconnect->tag), 0);
+ hv_store(hv, "next_connect", 12, newSViv(reconnect->next_connect), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
diff --git a/src/perl/xs/Irssi-settings.xs b/src/perl/xs/Irssi-settings.xs
new file mode 100644
index 00000000..6f5c0915
--- /dev/null
+++ b/src/perl/xs/Irssi-settings.xs
@@ -0,0 +1,39 @@
+MODULE = Irssi PACKAGE = Irssi
+
+char *
+settings_get_str(key)
+ char *key
+CODE:
+ RETVAL = (char *) settings_get_str(key);
+OUTPUT:
+ RETVAL
+
+int
+settings_get_int(key)
+ char *key
+
+int
+settings_get_bool(key)
+ char *key
+
+void
+settings_add_str(section, key, def)
+ char *section
+ char *key
+ char *def
+
+void
+settings_add_int(section, key, def)
+ char *section
+ char *key
+ int def
+
+void
+settings_add_bool(section, key, def)
+ char *section
+ char *key
+ int def
+
+void
+settings_remove(key)
+ char *key
diff --git a/src/perl/xs/Irssi-window.xs b/src/perl/xs/Irssi-window.xs
new file mode 100644
index 00000000..f28acf92
--- /dev/null
+++ b/src/perl/xs/Irssi-window.xs
@@ -0,0 +1,106 @@
+MODULE = Irssi PACKAGE = Irssi
+
+void
+command(cmd, server=active_win->active_server, item=active_win->active)
+ char *cmd
+ Irssi::Server server
+ Irssi::Windowitem item
+CODE:
+ signal_emit("send command", 3, cmd, server, item);
+
+Irssi::Window
+active_win()
+CODE:
+ RETVAL = active_win;
+OUTPUT:
+ RETVAL
+
+Irssi::Server
+active_server()
+CODE:
+ RETVAL = active_win->active_server;
+OUTPUT:
+ RETVAL
+
+void
+print(str)
+ char *str
+CODE:
+ printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, str);
+
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Server
+#*******************************
+
+void
+command(server, cmd, item=active_win->active)
+ char *cmd
+ Irssi::Server server
+ Irssi::Windowitem item
+CODE:
+ if (item != NULL && item->server != server)
+ item = NULL;
+ signal_emit("send command", 3, cmd, server, item);
+
+void
+printtext(server, channel, level, str)
+ Irssi::Server server
+ char *channel
+ int level
+ char *str
+CODE:
+ printtext(server, channel, level, str);
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Window
+#*******************************
+
+void
+values(window)
+ Irssi::Window window
+PREINIT:
+ HV *hv, *stash;
+ AV *av;
+ GSList *tmp;
+PPCODE:
+ hv = newHV();
+ hv_store(hv, "refnum", 6, newSViv(window->refnum), 0);
+ hv_store(hv, "name", 4, new_pv(window->name), 0);
+
+ av = newAV();
+ for (tmp = window->items; tmp != NULL; tmp = tmp->next) {
+ av_push(av, new_pv(tmp->data));
+ }
+ hv_store(hv, "items", 8, newRV_noinc((SV*)av), 0);
+
+ stash = gv_stashpv("Irssi::Windowitem", 0);
+ hv_store(hv, "active", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(window->active))), stash), 0);
+ stash = gv_stashpv("Irssi::Server", 0);
+ hv_store(hv, "active_server", 13, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(window->active_server))), stash), 0);
+
+ hv_store(hv, "lines", 5, newSViv(window->lines), 0);
+
+ hv_store(hv, "level", 5, newSViv(window->level), 0);
+ hv_store(hv, "new_data", 8, newSViv(window->new_data), 0);
+ hv_store(hv, "last_timestamp", 14, newSViv(window->last_timestamp), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+
+#*******************************
+MODULE = Irssi PACKAGE = Irssi::Windowitem
+#*******************************
+
+void
+values(item)
+ Irssi::Windowitem item
+PREINIT:
+ HV *hv, *stash;
+ AV *av;
+ GSList *tmp;
+PPCODE:
+ hv = newHV();
+ stash = gv_stashpv("Irssi::Server", 0);
+ hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(item->server))), stash), 0);
+ hv_store(hv, "name", 4, new_pv(item->name), 0);
+ hv_store(hv, "new_data", 8, newSViv(item->new_data), 0);
+ XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
diff --git a/src/perl/xs/Irssi.xs b/src/perl/xs/Irssi.xs
index 95c75163..a3c85c39 100644
--- a/src/perl/xs/Irssi.xs
+++ b/src/perl/xs/Irssi.xs
@@ -1,933 +1,53 @@
-/* This could be split to different files / modules ..? */
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
+#include "module.h"
+#include "levels.h"
-#undef _
-#include <irssi-plugin.h>
-#include <irc-base/server-setup.h>
-#include <irc-base/server-reconnect.h>
-#include <irc-base/server-redirect.h>
-
-typedef SERVER_REC *Irssi__Server;
-typedef SERVER_CONNECT_REC *Irssi__Connect;
-typedef RECONNECT_REC *Irssi__Reconnect;
-typedef CHANNEL_REC *Irssi__Channel;
-typedef COMMAND_REC *Irssi__Command;
-typedef NICK_REC *Irssi__Nick;
-typedef BAN_REC *Irssi__Ban;
-typedef DCC_REC *Irssi__Dcc;
-typedef NETSPLIT_REC *Irssi__Netsplit;
-typedef AUTOIGNORE_REC *Irssi__Autoignore;
-typedef LOG_REC *Irssi__Log;
-typedef LOG_ITEM_REC *Irssi__Logitem;
-typedef PLUGIN_REC *Irssi__Plugin;
-
-#define new_pv(a) (newSVpv((a) == NULL ? "" : (a), (a) == NULL ? 0 : strlen(a)))
-
-void add_connect_hash(HV *hv, SERVER_CONNECT_REC *conn)
+void connect_fill_hash(HV *hv, IRC_SERVER_CONNECT_REC *conn)
{
hv_store(hv, "address", 7, new_pv(conn->address), 0);
hv_store(hv, "port", 4, newSViv(conn->port), 0);
- hv_store(hv, "password", 8, new_pv(conn->password), 0);
-
hv_store(hv, "ircnet", 6, new_pv(conn->ircnet), 0);
+
+ hv_store(hv, "password", 8, new_pv(conn->password), 0);
hv_store(hv, "wanted_nick", 11, new_pv(conn->nick), 0);
hv_store(hv, "alternate_nick", 14, new_pv(conn->alternate_nick), 0);
hv_store(hv, "username", 8, new_pv(conn->username), 0);
hv_store(hv, "realname", 8, new_pv(conn->realname), 0);
- hv_store(hv, "autojoin_channels", 17, new_pv(conn->autojoin_channels), 0);
}
-MODULE = Irssi PACKAGE = Irssi
-
-PROTOTYPES: ENABLE
-
-Irssi::Channel
-cur_channel()
-CODE:
- RETVAL = cur_channel;
-OUTPUT:
- RETVAL
-
-Irssi::Server
-cur_server()
-CODE:
- RETVAL = cur_channel->server;
-OUTPUT:
- RETVAL
-
-void
-channels()
-PREINIT:
- GSList *tmp;
- HV *stash;
-PPCODE:
- stash = gv_stashpv("Irssi::Channel", 0);
- for (tmp = channels; tmp != NULL; tmp = tmp->next) {
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
- }
-
-void
-servers()
-PREINIT:
- GSList *tmp;
- HV *stash;
-PPCODE:
- stash = gv_stashpv("Irssi::Server", 0);
- for (tmp = servers; tmp != NULL; tmp = tmp->next) {
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
- }
-
-void
-commands()
-PREINIT:
- GSList *tmp;
- HV *stash;
-PPCODE:
- stash = gv_stashpv("Irssi::Command", 0);
- for (tmp = commands; tmp != NULL; tmp = tmp->next) {
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
- }
-
-void
-dccs()
-PREINIT:
- GSList *tmp;
- HV *stash;
-PPCODE:
- stash = gv_stashpv("Irssi::Dcc", 0);
- for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) {
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
- }
-
-void
-logs()
-PREINIT:
- GSList *tmp;
- HV *stash;
-PPCODE:
- stash = gv_stashpv("Irssi::Log", 0);
- for (tmp = logs; tmp != NULL; tmp = tmp->next) {
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
- }
-
-void
-plugins()
-PREINIT:
- GSList *tmp;
+void server_fill_hash(HV *hv, IRC_SERVER_REC *server)
+{
HV *stash;
-PPCODE:
- stash = gv_stashpv("Irssi::Plugin", 0);
- for (tmp = plugins; tmp != NULL; tmp = tmp->next) {
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
- }
-
-Irssi::Connect
-server_create_conn(dest, port=6667, password=NULL, nick=NULL, channels=NULL)
- char *dest
- int port
- char *password
- char *nick
- char *channels
-
-Irssi::Server
-server_find_tag(tag)
- char *tag
-
-Irssi::Server
-server_find_ircnet(ircnet)
- char *ircnet
-
-Irssi::Channel
-channel_find(channel)
- char *channel
-CODE:
- RETVAL = channel_find(NULL, channel);
-OUTPUT:
- RETVAL
-
-void
-print(str)
- char *str
-CODE:
- printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, str);
-
-void
-signal_emit(signal, ...)
- char *signal
-CODE:
- void *p[6];
- int n;
-
- memset(p, 0, sizeof(p));
- for (n = 1; n < items && n < 6; n++) {
- p[n-1] = SvPOKp(ST(n)) ? SvPV(ST(n), PL_na) : (void *) SvIV((SV*)SvRV(ST(n)));
- }
- signal_emit(signal, items-1, p[0], p[1], p[2], p[3], p[4], p[5]);
-
-void
-signal_add(signal, func)
- char *signal
- char *func
-CODE:
- perl_signal_add(signal, func);
-
-void
-signal_add_last(signal, func)
- char *signal
- char *func
-CODE:
- perl_signal_add_last(signal, func);
-
-void
-signal_remove(signal, func)
- char *signal
- char *func
-CODE:
- perl_signal_remove(signal, func);
-
-int
-timeout_add(msecs, func, data)
- int msecs
- char *func
- char *data
-CODE:
- RETVAL = perl_timeout_add(msecs, func, data);
-OUTPUT:
- RETVAL
-
-void
-timeout_remove(tag)
- int tag
-CODE:
- perl_timeout_remove(tag);
-
-void
-command_bind(cmd, category, func)
- char *cmd
- char *category
- char *func
-CODE:
- char *signal;
-
- command_bind(cmd, *category ? category : "Perl scripts' commands", NULL);
- signal = g_strconcat("command ", cmd, NULL);
- perl_signal_add(signal, func);
- g_free(signal);
-
-void
-command_unbind(cmd, func)
- char *cmd
- char *func
-CODE:
- char *signal;
-
- command_unbind(cmd, NULL);
- signal = g_strconcat("command ", cmd, NULL);
- perl_signal_remove(signal, func);
- g_free(signal);
-
-void
-command(cmd, server=cur_channel->server, channel=cur_channel)
- char *cmd
- Irssi::Server server
- Irssi::Channel channel
-CODE:
- signal_emit("send command", 3, cmd, server, channel);
-
-int
-is_channel(text)
- char *text
-CODE:
- RETVAL = ischannel(*text);
-OUTPUT:
- RETVAL
-
-int
-irc_mask_match(mask, nick, user, host)
- char *mask
- char *nick
- char *user
- char *host
-
-int
-irc_mask_match_address(mask, nick, address)
- char *mask
- char *nick
- char *address
-
-int
-irc_masks_match(masks, nick, address)
- char *masks
- char *nick
- char *address
-
-char *
-irc_get_mask(nick, host, flags)
- char *nick
- char *host
- int flags
-
-int
-level2bits(str)
- char *str
-
-char *
-bits2level(bits)
- int bits
-
-int
-combine_level(level, str)
- int level
- char *str
-
-Irssi::Dcc
-dcc_find_item(type, nick, arg)
- int type
- char *nick
- char *arg
-
-Irssi::Dcc
-dcc_find_by_port(nick, port)
- char *nick
- int port
-
-char *
-dcc_type2str(type)
- int type
-
-int
-dcc_str2type(type)
- char *type
-
-void
-ignore_add(mask, level)
- char *mask
- char *level
-
-void
-ignore_remove(mask, level)
- char *mask
- char *level
-
-Irssi::Log
-log_create(fname, data)
- char *fname
- char *data
-
-Irssi::Log
-log_create_with_level(fname, level)
- char *fname
- int level
-
-Irssi::Log
-log_file_find(fname)
- char *fname
-
-void
-notifylist_add(nick, ircnet)
- char *nick
- char *ircnet
-
-Irssi::Server
-notifylist_ison(nick, serverlist)
- char *nick
- char *serverlist
-
-int
-plugin_load(name, args)
- char *name
- char *args
-
-char *
-plugin_get_description(name)
- char *name
-
-Irssi::Plugin
-plugin_find(name)
- char *name
-
-void
-setup_get(option)
- char *option
-PREINIT:
- char *ret;
-PPCODE:
- switch(setup_option_type(option)) {
- case SETUP_TYPE_TOGGLEBUTTON:
- XPUSHs(sv_2mortal(newSViv(setup_get_bool(option))));
- break;
- case SETUP_TYPE_SPIN:
- case SETUP_TYPE_INT_OBJECT:
- XPUSHs(sv_2mortal(newSViv(setup_get_int(option))));
- break;
- case SETUP_TYPE_ENTRY:
- ret = setup_get_str(option);
- XPUSHs(sv_2mortal(newSVpv(ret, strlen(ret))));
- break;
- }
-
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Server PREFIX = server_
-#*******************************************************
-
-void
-send_raw(server, cmd)
- Irssi::Server server
- char *cmd
-CODE:
- irc_send_cmd(server, cmd);
-
-void
-command(server, cmd, channel=cur_channel)
- char *cmd
- Irssi::Server server
- Irssi::Channel channel
-CODE:
- if (channel->server != server) {
- GSList *tmp;
-
- for (tmp = channels; tmp != NULL; tmp = tmp->next) {
- CHANNEL_REC *rec = tmp->data;
-
- if (rec->server == server) {
- channel = rec;
- break;
- }
- }
- }
- signal_emit("send command", 3, cmd, server, channel);
-
-void
-server_disconnect(server)
- Irssi::Server server
-
-Irssi::Channel
-channel_create(server, channel, type, automatic)
- Irssi::Server server
- char *channel
- int type
- int automatic
-Irssi::Channel
-channel_find(server, channel)
- Irssi::Server server
- char *channel
+ connect_fill_hash(hv, server->connrec);
+ hv_store(hv, "connect_time", 12, newSViv(server->connect_time), 0);
-Irssi::Channel
-channel_find_closest(server, channel, level)
- Irssi::Server server
- char *channel
- int level
-
-Irssi::Channel
-channel_find_level(server, level)
- Irssi::Server server
- int level
-
-void
-printtext(server, channel, level, str)
- Irssi::Server server
- char *channel
- int level
- char *str
-CODE:
- printtext(server, channel, level, str);
-
-void
-irc_send_cmd_split(server, cmd, arg, max_nicks)
- Irssi::Server server
- char *cmd
- int arg
- int max_nicks
-
-void
-ctcp_send_reply(server, data)
- Irssi::Server server
- char *data
-
-Irssi::Netsplit
-netsplit_find(server, nick, address)
- Irssi::Server server
- char *nick
- char *address
-
-Irssi::Nick
-netsplit_find_channel(server, nick, address, channel)
- Irssi::Server server
- char *nick
- char *address
- char *channel
-
-void
-rawlog_input(server, str)
- Irssi::Server server
- char *str
-
-void
-rawlog_output(server, str)
- Irssi::Server server
- char *str
-
-void
-rawlog_redirect(server, str)
- Irssi::Server server
- char *str
-
-void
-server_redirect_init(server, command, last, ...)
- Irssi::Server server
- char *command
- int last
-PREINIT:
- GSList *list;
- int n;
-CODE:
- list = NULL;
- for (n = 3; n < items; n++) {
- list = g_slist_append(list, SvPV(ST(n), PL_na));
- }
- server_redirect_initv(server, command, last, list);
-
-int
-server_redirect_single_event(server, arg, last, group, event, signal, argpos)
- Irssi::Server server
- char *arg
- int last
- int group
- char *event
- char *signal
- int argpos
-
-void
-server_redirect_event(server, arg, last, ...)
- Irssi::Server server
- char *arg
- int last
-PREINIT:
- int n, group;
-CODE:
- group = 0;
- for (n = 3; n+3 <= items; n += 3, last--) {
- group = server_redirect_single_event(server, arg, last > 0, group,
- (char *) SvPV(ST(n), PL_na), (char *) SvPV(ST(n+1), PL_na), (int) SvIV(ST(n+2)));
- }
-
-void
-autoignore_add(server, type, nick)
- Irssi::Server server
- int type
- char *nick
-
-int
-autoignore_remove(server, mask, level)
- Irssi::Server server
- char *mask
- char *level
-
-int
-ignore_check(server, nick, host, type)
- Irssi::Server server
- char *nick
- char *host
- int type
-
-int
-notifylist_ison_server(server, nick)
- Irssi::Server server
- char *nick
-
-void
-values(server)
- Irssi::Server server
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- add_connect_hash(hv, server->connrec);
- hv_store(hv, "real_address", 12, new_pv(server->real_address), 0);
hv_store(hv, "tag", 3, new_pv(server->tag), 0);
hv_store(hv, "nick", 4, new_pv(server->nick), 0);
- hv_store(hv, "usermode", 8, new_pv(server->usermode), 0);
- hv_store(hv, "usermode_away", 13, newSViv(server->usermode_away), 0);
- hv_store(hv, "away_reason", 11, new_pv(server->away_reason), 0);
+
hv_store(hv, "connected", 9, newSViv(server->connected), 0);
hv_store(hv, "connection_lost", 15, newSViv(server->connection_lost), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Connect PREFIX = server_
-#*******************************************************
-
-void
-values(conn)
- Irssi::Connect conn
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- add_connect_hash(hv, conn);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-Irssi::Server
-server_connect(conn)
- Irssi::Connect conn
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Reconnect
-#*******************************************************
-
-void
-values(reconnect)
- Irssi::Reconnect reconnect
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- add_connect_hash(hv, reconnect->conn);
- hv_store(hv, "tag", 3, newSViv(reconnect->tag), 0);
- hv_store(hv, "next_connect", 12, newSViv(reconnect->next_connect), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Channel PREFIX = channel_
-#*******************************************************
-
-void
-command(channel, cmd)
- Irssi::Channel channel
- char *cmd
-CODE:
- signal_emit("send command", 3, cmd, channel->server, channel);
-
-void
-channel_destroy(channel)
- Irssi::Channel channel
-
-void
-channel_change_name(channel, name)
- Irssi::Channel channel
- char *name
-
-char *
-channel_get_mode(channel)
- Irssi::Channel channel
-
-Irssi::Nick
-nicklist_insert(channel, nick, op, voice, send_massjoin)
- Irssi::Channel channel
- char *nick
- int op
- int voice
- int send_massjoin
-
-void
-nicklist_remove(channel, nick)
- Irssi::Channel channel
- Irssi::Nick nick
-
-Irssi::Nick
-nicklist_find(channel, mask)
- Irssi::Channel channel
- char *mask
-
-void
-nicklist_getnicks(channel)
- Irssi::Channel channel
-PREINIT:
- GSList *list, *tmp;
- HV *stash;
-PPCODE:
- list = nicklist_getnicks(channel);
-
- stash = gv_stashpv("Irssi::Nick", 0);
- for (tmp = list; tmp != NULL; tmp = tmp->next) {
- XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash)));
- }
- g_slist_free(list);
-
-Irssi::Ban
-ban_add(channel, ban, nick, time)
- Irssi::Channel channel
- char *ban
- char *nick
- time_t time
-
-void
-ban_remove(channel, ban)
- Irssi::Channel channel
- char *ban
-Irssi::Ban
-ban_exception_add(channel, ban, nick, time)
- Irssi::Channel channel
- char *ban
- char *nick
- time_t time
-
-void
-ban_exception_remove(channel, ban)
- Irssi::Channel channel
- char *ban
-
-char *
-ban_get_mask(channel, nick)
- Irssi::Channel channel
- char *nick
-
-void
-modes_set(channel, data, mode)
- Irssi::Channel channel
- char *data
- char *mode
-CODE:
- modes_set(data, mode, channel->server, channel);
-
-void
-modes_parse_channel(channel, setby, modestr)
- Irssi::Channel channel
- char *setby
- char *modestr
-
-void
-invitelist_add(channel, mask)
- Irssi::Channel channel
- char *mask
-
-void
-invitelist_remove(channel, mask)
- Irssi::Channel channel
- char *mask
-
-void
-values(channel)
- Irssi::Channel channel
-PREINIT:
- HV *hv, *stash;
- char *type;
-PPCODE:
- switch (channel->type)
- {
- case CHANNEL_TYPE_CHANNEL:
- type = "channel";
- break;
- case CHANNEL_TYPE_QUERY:
- type = "query";
- break;
- case CHANNEL_TYPE_DCC_CHAT:
- type = "dcc chat";
- break;
- default:
- type = "empty";
- break;
- }
- hv = newHV();
- stash = gv_stashpv("Irssi::Server", 0);
- hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(channel->server))), stash), 0);
-
- hv_store(hv, "name", 4, new_pv(channel->name), 0);
- hv_store(hv, "type", 4, new_pv(type), 0);
-
- hv_store(hv, "topic", 5, new_pv(channel->topic), 0);
- hv_store(hv, "key", 3, new_pv(channel->key), 0);
- hv_store(hv, "limit", 5, newSViv(channel->limit), 0);
-
- hv_store(hv, "level", 5, newSViv(channel->level), 0);
- hv_store(hv, "new_data", 8, newSViv(channel->new_data), 0);
-
- hv_store(hv, "synced", 6, newSViv(channel->synced), 0);
- hv_store(hv, "wholist", 7, newSViv(channel->wholist), 0);
- hv_store(hv, "names_got", 9, newSViv(channel->names_got), 0);
- hv_store(hv, "chanop", 6, newSViv(channel->chanop), 0);
- hv_store(hv, "left", 4, newSViv(channel->left), 0);
- hv_store(hv, "kicked", 6, newSViv(channel->kicked), 0);
-
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Command
-#*******************************************************
-
-void
-values(cmd)
- Irssi::Command cmd
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "cmd", 3, new_pv(cmd->cmd), 0);
- hv_store(hv, "category", 8, new_pv(cmd->category), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Nick
-#*******************************************************
-
-void
-values(nick)
- Irssi::Nick nick
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "nick", 4, new_pv(nick->nick), 0);
- hv_store(hv, "host", 4, new_pv(nick->host), 0);
- hv_store(hv, "name", 4, new_pv(nick->realname), 0);
- hv_store(hv, "hops", 4, newSViv(nick->hops), 0);
- hv_store(hv, "op", 2, newSViv(nick->op), 0);
- hv_store(hv, "voice", 5, newSViv(nick->voice), 0);
- hv_store(hv, "gone", 4, newSViv(nick->gone), 0);
- hv_store(hv, "ircop", 5, newSViv(nick->ircop), 0);
- hv_store(hv, "last_check", 10, newSViv(nick->last_check), 0);
- hv_store(hv, "send_massjoin", 13, newSViv(nick->send_massjoin), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Ban
-#*******************************************************
-
-void
-values(ban)
- Irssi::Ban ban
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "ban", 3, new_pv(ban->ban), 0);
- hv_store(hv, "setby", 5, new_pv(ban->setby), 0);
- hv_store(hv, "time", 4, newSViv(ban->time), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Dcc PREFIX = dcc_
-#*******************************************************
-
-void
-dcc_destroy(dcc)
- Irssi::Dcc dcc
-
-void
-values(ban)
- Irssi::Ban ban
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "ban", 3, new_pv(ban->ban), 0);
- hv_store(hv, "setby", 5, new_pv(ban->setby), 0);
- hv_store(hv, "time", 4, newSViv(ban->time), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Netsplit
-#*******************************************************
-
-void
-values(netsplit)
- Irssi::Netsplit netsplit
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "nick", 4, new_pv(netsplit->nick), 0);
- hv_store(hv, "address", 7, new_pv(netsplit->address), 0);
- hv_store(hv, "server", 6, new_pv(netsplit->server), 0);
- hv_store(hv, "destserver", 10, new_pv(netsplit->destserver), 0);
- hv_store(hv, "destroy", 7, newSViv(netsplit->destroy), 0);
- /*FIXME: add GSList *channels;*/
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Autoignore
-#*******************************************************
-
-void
-values(ai)
- Irssi::Autoignore ai
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "nick", 4, new_pv(ai->nick), 0);
- hv_store(hv, "timeleft", 8, newSViv(ai->timeleft), 0);
- hv_store(hv, "level", 5, newSViv(ai->level), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Log PREFIX = log_
-#*******************************************************
-
-void
-values(log)
- Irssi::Log log
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "fname", 5, new_pv(log->fname), 0);
- hv_store(hv, "autoopen_log", 12, newSViv(log->autoopen_log), 0);
- hv_store(hv, "last", 4, newSViv(log->last), 0);
- hv_store(hv, "level", 5, newSViv(log->level), 0);
- /*FIXME: add GSList *items;*/
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
-
-void
-destroy(log)
- Irssi::Log log
-CODE:
- log_file_destroy(log);
-
-int
-open(log)
- Irssi::Log log
-CODE:
- log_file_open(log);
-
-void
-close(log)
- Irssi::Log log
-CODE:
- log_file_close(log);
-
-void
-log_append_item(log, name, level)
- Irssi::Log log
- char *name
- int level
-
-void
-log_remove_item(log, name)
- Irssi::Log log
- char *name
-
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Logitem
-#*******************************************************
+ stash = gv_stashpv("Irssi::Rawlog", 0);
+ hv_store(hv, "rawlog", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(server->rawlog))), stash), 0);
+}
-void
-values(item)
- Irssi::Logitem item
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "name", 4, new_pv(item->name), 0);
- hv_store(hv, "level", 5, newSViv(item->level), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+MODULE = Irssi PACKAGE = Irssi
-#*******************************************************
-MODULE = Irssi PACKAGE = Irssi::Plugin PREFIX = plugin_
-#*******************************************************
+PROTOTYPES: ENABLE
-void
-values(plugin)
- Irssi::Plugin plugin
-PREINIT:
- HV *hv;
-PPCODE:
- hv = newHV();
- hv_store(hv, "name", 4, new_pv(plugin->name), 0);
- hv_store(hv, "description", 11, new_pv(plugin->description), 0);
- XPUSHs(sv_2mortal(newRV_noinc((SV*)hv)));
+INCLUDE: Irssi-bans.xs
+INCLUDE: Irssi-channel.xs
+INCLUDE: Irssi-core.xs
+INCLUDE: Irssi-dcc.xs
+INCLUDE: Irssi-flood.xs
+INCLUDE: Irssi-ignore.xs
+INCLUDE: Irssi-log.xs
+INCLUDE: Irssi-masks.xs
+INCLUDE: Irssi-modes.xs
+INCLUDE: Irssi-netsplit.xs
+INCLUDE: Irssi-notifylist.xs
+INCLUDE: Irssi-query.xs
+INCLUDE: Irssi-rawlog.xs
+INCLUDE: Irssi-server.xs
+INCLUDE: Irssi-settings.xs
+INCLUDE: Irssi-window.xs
diff --git a/src/perl/xs/Makefile.PL.in b/src/perl/xs/Makefile.PL.in
index 430d59db..df6f8c2c 100644
--- a/src/perl/xs/Makefile.PL.in
+++ b/src/perl/xs/Makefile.PL.in
@@ -2,5 +2,5 @@ use ExtUtils::MakeMaker;
WriteMakefile('NAME' => 'Irssi',
'LIBS' => '',
- 'INC' => '-I@top_srcdir@/src @GLIB_CFLAGS@',
+ 'INC' => '-I@top_srcdir@/src -I@top_srcdir@/src/core @GLIB_CFLAGS@',
'VERSION_FROM' => '@srcdir@/Irssi.pm');
diff --git a/src/perl/xs/module.h b/src/perl/xs/module.h
new file mode 100644
index 00000000..350f3de0
--- /dev/null
+++ b/src/perl/xs/module.h
@@ -0,0 +1,54 @@
+#include <EXTERN.h>
+#include <perl.h>
+#include <XSUB.h>
+
+#undef _
+#include "common.h"
+#include "network.h"
+#include "commands.h"
+#include "server.h"
+#include "log.h"
+#include "rawlog.h"
+#include "settings.h"
+
+#include "irc/core/bans.h"
+#include "irc/core/channels.h"
+#include "irc/core/query.h"
+#include "irc/core/irc-server.h"
+#include "irc/core/server-reconnect.h"
+#include "irc/core/server-setup.h"
+#include "irc/core/nicklist.h"
+#include "irc/core/masks.h"
+#include "irc/core/modes.h"
+#include "irc/core/mode-lists.h"
+#include "irc/core/netsplit.h"
+#include "irc/core/ignore.h"
+
+#include "irc/dcc/dcc.h"
+#include "irc/flood/autoignore.h"
+#include "irc/notifylist/notifylist.h"
+
+#include "fe-common/core/windows.h"
+
+#define new_pv(a) (newSVpv((a) == NULL ? "" : (a), (a) == NULL ? 0 : strlen(a)))
+
+typedef COMMAND_REC *Irssi__Command;
+typedef LOG_REC *Irssi__Log;
+typedef RAWLOG_REC *Irssi__Rawlog;
+
+typedef CHANNEL_REC *Irssi__Channel;
+typedef QUERY_REC *Irssi__Query;
+typedef IRC_SERVER_REC *Irssi__Server;
+typedef IRC_SERVER_CONNECT_REC *Irssi__Connect;
+typedef RECONNECT_REC *Irssi__Reconnect;
+typedef NICK_REC *Irssi__Nick;
+typedef BAN_REC *Irssi__Ban;
+typedef NETSPLIT_REC *Irssi__Netsplit;
+typedef IGNORE_REC *Irssi__Ignore;
+
+typedef DCC_REC *Irssi__Dcc;
+typedef AUTOIGNORE_REC *Irssi__Autoignore;
+typedef NOTIFYLIST_REC *Irssi__Notifylist;
+
+typedef WINDOW_REC *Irssi__Window;
+typedef WI_ITEM_REC *Irssi__Windowitem;
diff --git a/src/perl/xs/typemap b/src/perl/xs/typemap
index ba1bc85c..0e61ce06 100644
--- a/src/perl/xs/typemap
+++ b/src/perl/xs/typemap
@@ -1,8 +1,9 @@
TYPEMAP
Irssi::Server T_PTROBJ
-Irssi::Connect T_PTROBJ
-Irssi::Reconnect T_PTROBJ
+Irssi::Connect T_PTROBJ
+Irssi::Reconnect T_PTROBJ
Irssi::Channel T_PTROBJ
+Irssi::Query T_PTROBJ
Irssi::Command T_PTROBJ
Irssi::Nick T_PTROBJ
Irssi::Ban T_PTROBJ
@@ -10,5 +11,8 @@ Irssi::Dcc T_PTROBJ
Irssi::Netsplit T_PTROBJ
Irssi::Autoignore T_PTROBJ
Irssi::Log T_PTROBJ
-Irssi::Logitem T_PTROBJ
-Irssi::Plugin T_PTROBJ
+Irssi::Rawlog T_PTROBJ
+Irssi::Notifylist T_PTROBJ
+Irssi::Ignore T_PTROBJ
+Irssi::Window T_PTROBJ
+Irssi::Windowitem T_PTROBJ