package Linux::Perl::SigSet;
use strict;
use warnings;
my $sig_num_hr;
use constant {
_SIG_MAX => 63,
};
sub from_list {
my (@list) = @_;
my $vec = q<>;
for my $sig (@list) {
if ($sig =~ tr<0-9><>c) {
$sig_num_hr ||= do {
require Config;
my @names = split m< >, $Config::Config{'sig_name'};
my %signum;
@signum{@names} = split m< >, $Config::Config{'sig_num'};
\%signum;
};
$sig = $sig_num_hr->{$sig} || die "Unrecognized signal: '$sig'";
}
vec( $vec, $sig - 1, 1 ) = 1;
}
vec( $vec, _SIG_MAX(), 1 ) = 0;
return $vec;
}
sub to_list {
my ($mask) = @_;
my @nums;
for my $n ( 0 .. _SIG_MAX() ) {
if ( vec($mask, $n, 1) ) {
push @nums, 1 + $n;
}
}
return @nums;
}
1;