Integrate with Nick.
[p5sagit/p5-mst-13.2.git] / lib / warning.pm
1
2 # This file was created by warning.pl
3 # Any changes made here will be lost.
4 #
5
6 package warning;
7
8 =head1 NAME
9
10 warning - Perl pragma to control optional warnings
11
12 =head1 SYNOPSIS
13
14     use warning;
15     no warning;
16
17     use warning "all";
18     no warning "all";
19
20 =head1 DESCRIPTION
21
22 If no import list is supplied, all possible warnings are either enabled
23 or disabled.
24
25 See L<perlmod/Pragmatic Modules> and L<perllexwarn>.
26
27
28 =cut
29
30 use Carp ;
31
32 %Bits = (
33     'all'               => "\x55\x55\x55\x55\x55\x55\x55\x55\x55", # [0..35]
34     'ambiguous'         => "\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [16]
35     'closed'            => "\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
36     'closure'           => "\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [26]
37     'debugging'         => "\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [12]
38     'deprecated'        => "\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [17]
39     'exec'              => "\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
40     'inplace'           => "\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [13]
41     'internal'          => "\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [14]
42     'io'                => "\x55\x05\x00\x00\x00\x00\x00\x00\x00", # [0..5]
43     'misc'              => "\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [6]
44     'newline'           => "\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
45     'numeric'           => "\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [7]
46     'octal'             => "\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [18]
47     'once'              => "\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [8]
48     'parenthesis'       => "\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [19]
49     'pipe'              => "\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [4]
50     'precedence'        => "\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [20]
51     'printf'            => "\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [21]
52     'recursion'         => "\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [9]
53     'redefine'          => "\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [10]
54     'reserved'          => "\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [22]
55     'semicolon'         => "\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [23]
56     'severe'            => "\x00\x00\x40\x15\x00\x00\x00\x00\x00", # [11..14]
57     'signal'            => "\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [27]
58     'substr'            => "\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [28]
59     'syntax'            => "\x00\x00\x00\x40\x55\x55\x00\x00\x00", # [15..23]
60     'taint'             => "\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [29]
61     'uninitialized'     => "\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [24]
62     'unopened'          => "\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [5]
63     'unsafe'            => "\x00\x00\x00\x00\x00\x00\x54\x55\x00", # [25..31]
64     'untie'             => "\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [30]
65     'utf8'              => "\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [31]
66     'void'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [32]
67   );
68
69 %DeadBits = (
70     'all'               => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", # [0..35]
71     'ambiguous'         => "\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [16]
72     'closed'            => "\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
73     'closure'           => "\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [26]
74     'debugging'         => "\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [12]
75     'deprecated'        => "\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [17]
76     'exec'              => "\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
77     'inplace'           => "\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [13]
78     'internal'          => "\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [14]
79     'io'                => "\xaa\x0a\x00\x00\x00\x00\x00\x00\x00", # [0..5]
80     'misc'              => "\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [6]
81     'newline'           => "\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
82     'numeric'           => "\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [7]
83     'octal'             => "\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [18]
84     'once'              => "\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [8]
85     'parenthesis'       => "\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [19]
86     'pipe'              => "\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [4]
87     'precedence'        => "\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [20]
88     'printf'            => "\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [21]
89     'recursion'         => "\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [9]
90     'redefine'          => "\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [10]
91     'reserved'          => "\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [22]
92     'semicolon'         => "\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [23]
93     'severe'            => "\x00\x00\x80\x2a\x00\x00\x00\x00\x00", # [11..14]
94     'signal'            => "\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [27]
95     'substr'            => "\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [28]
96     'syntax'            => "\x00\x00\x00\x80\xaa\xaa\x00\x00\x00", # [15..23]
97     'taint'             => "\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [29]
98     'uninitialized'     => "\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [24]
99     'unopened'          => "\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [5]
100     'unsafe'            => "\x00\x00\x00\x00\x00\x00\xa8\xaa\x00", # [25..31]
101     'untie'             => "\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [30]
102     'utf8'              => "\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [31]
103     'void'              => "\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [32]
104   );
105
106
107 sub bits {
108     my $mask ;
109     my $catmask ;
110     my $fatal = 0 ;
111     foreach my $word (@_) {
112         if  ($word eq 'FATAL')
113           { $fatal = 1 }
114         elsif ($catmask = $Bits{$word}) {
115           $mask |= $catmask ;
116           $mask |= $DeadBits{$word} if $fatal ;
117         }
118         else
119           { croak "unknown warning category '$word'" }
120     }
121
122     return $mask ;
123 }
124
125 sub import {
126     shift;
127     $^B |= bits(@_ ? @_ : 'all') ;
128 }
129
130 sub unimport {
131     shift;
132     $^B &= ~ bits(@_ ? @_ : 'all') ;
133 }
134
135
136 sub make_fatal
137 {
138     my $self = shift ;
139     my $bitmask = $self->bits(@_) ;
140     $SIG{__WARN__} =
141         sub
142         {
143             die @_ if $^B & $bitmask ;
144             warn @_
145         } ;
146 }
147
148 sub bitmask
149 {
150     return $^B ;
151 }
152
153 sub enabled
154 {
155     my $string = shift ;
156
157     return 1
158         if $bits{$string} && $^B & $bits{$string} ;
159    
160     return 0 ; 
161 }
162
163 1;