# NOTE: this is printed through printf()-like function, # so no extra percent characters. # %%d : must be first - 1 if perl libraries are to be linked # statically with irssi binary, 0 if not # %%s : must be second - use Irssi; use Irssi::Irc; etc.. package Irssi::Core; use Symbol; sub is_static { return %d; } sub destroy { eval { $_[0]->UNLOAD() if $_[0]->can('UNLOAD'); }; Symbol::delete_package($_[0]); } sub eval_data { my ($data, $id) = @_; destroy("Irssi::Script::$id"); $SIG{__WARN__} = sub { Irssi::print("Warning in script $id:"); print $_[0]; }; my $package = "Irssi::Script::$id"; my $eval = qq{package $package; %s sub handler { $data; }}; { # hide our variables within this block my ($filename, $package, $data); eval $eval; } die $@ if $@; my $ret; eval { $ret = $package->handler; }; die $@ if $@; return $ret; } sub eval_file { my ($filename, $id) = @_; local *FH; open FH, $filename or die "File not found: $filename"; local($/) = undef; my $data = ; close FH; local($/) = "\n"; eval_data($data, $id); }