This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
CPAN.pm sync
[perl5.git] / warnings.pl
index 4be4280..caa4954 100644 (file)
@@ -1,5 +1,8 @@
 #!/usr/bin/perl
 
+
+$VERSION = '1.00';
+
 BEGIN {
   push @INC, './lib';
 }
@@ -16,6 +19,7 @@ my $tree = {
                                        'closed'        => DEFAULT_OFF,
                                        'newline'       => DEFAULT_OFF,
                                        'exec'          => DEFAULT_OFF,
+                                       'layer'         => DEFAULT_OFF,
                           },
                'syntax'        => {    'ambiguous'     => DEFAULT_OFF,
                                'semicolon'     => DEFAULT_OFF,
@@ -24,7 +28,6 @@ my $tree = {
                                'reserved'      => DEFAULT_OFF,
                                'digit'         => DEFAULT_OFF,
                                'parenthesis'   => DEFAULT_OFF,
-                                       'deprecated'    => DEFAULT_OFF,
                                        'printf'        => DEFAULT_OFF,
                                        'prototype'     => DEFAULT_OFF,
                                        'qw'            => DEFAULT_OFF,
@@ -34,6 +37,7 @@ my $tree = {
                                'debugging'     => DEFAULT_ON,
                                'malloc'        => DEFAULT_ON,
                           },
+        'deprecated'   => DEFAULT_OFF,
                'void'          => DEFAULT_OFF,
                'recursion'     => DEFAULT_OFF,
                'redefine'      => DEFAULT_OFF,
@@ -44,8 +48,6 @@ my $tree = {
                'regexp'        => DEFAULT_OFF,
                'glob'          => DEFAULT_OFF,
                'y2k'           => DEFAULT_OFF,
-               'chmod'         => DEFAULT_OFF,
-               'umask'         => DEFAULT_OFF,
                'untie'         => DEFAULT_OFF,
        'substr'        => DEFAULT_OFF,
        'taint'         => DEFAULT_OFF,
@@ -104,7 +106,7 @@ sub mkRange
 
 
     for ($i = 1 ; $i < @a; ++ $i) {
-       $out[$i] = ".." 
+       $out[$i] = ".."
           if $a[$i] == $a[$i - 1] + 1 && $a[$i] + 1 == $a[$i + 1] ;
     }
 
@@ -130,9 +132,9 @@ sub printTree
        print $prefix . "|\n" ;
        print $prefix . "+- $k" ;
        if (ref $v)
-       { 
+       {
            print " " . "-" x ($max - length $k ) . "+\n" ;
-           printTree ($v, $prefix . "|" , $max + $indent - 1) 
+           printTree ($v, $prefix . "|" , $max + $indent - 1)
        }
        else
          { print "\n" }
@@ -142,9 +144,9 @@ sub printTree
 
 ###########################################################################
 
-sub mkHex
+sub mkHexOct
 {
-    my ($max, @a) = @_ ;
+    my ($f, $max, @a) = @_ ;
     my $mask = "\x00" x $max ;
     my $string = "" ;
 
@@ -152,14 +154,29 @@ sub mkHex
        vec($mask, $_, 1) = 1 ;
     }
 
-    #$string = unpack("H$max", $mask) ;
-    #$string =~ s/(..)/\x$1/g;
     foreach (unpack("C*", $mask)) {
-       $string .= '\x' . sprintf("%2.2x", $_) ;
+        if ($f eq 'x') {
+            $string .= '\x' . sprintf("%2.2x", $_)
+        }
+        else {
+            $string .= '\\' . sprintf("%o", $_)
+        }
     }
     return $string ;
 }
 
+sub mkHex
+{
+    my($max, @a) = @_;
+    return mkHexOct("x", $max, @a);
+}
+
+sub mkOct
+{
+    my($max, @a) = @_;
+    return mkHexOct("o", $max, @a);
+}
+
 ###########################################################################
 
 if (@ARGV && $ARGV[0] eq "tree")
@@ -169,8 +186,8 @@ if (@ARGV && $ARGV[0] eq "tree")
     exit ;
 }
 
-#unlink "warnings.h";
-#unlink "lib/warnings.pm";
+unlink "warnings.h";
+unlink "lib/warnings.pm";
 open(WARN, ">warnings.h") || die "Can't create warnings.h: $!\n";
 open(PM, ">lib/warnings.pm") || die "Can't create lib/warnings.pm: $!\n";
 
@@ -207,6 +224,10 @@ $index = $offset ;
 #@{ $list{"all"} } = walk ($tree) ;
 walk ($tree) ;
 
+die <<EOM if $index > 255 ;
+Too many warnings categories -- max is 255
+    rewrite packWARN* & unpackWARN* macros 
+EOM
 
 $index *= 2 ;
 my $warn_size = int($index / 8) + ($index % 8 != 0) ;
@@ -221,6 +242,9 @@ print WARN tab(5, '#define WARNsize'),      "$warn_size\n" ;
 #print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ;
 print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ;
 print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ;
+my $WARN_TAINTstring = mkOct($warn_size, map $_ * 2, @{ $list{'taint'} });
+
+print WARN tab(5, '#define WARN_TAINTstring'), qq["$WARN_TAINTstring"\n] ;
 
 print WARN <<'EOM';
 
@@ -230,11 +254,6 @@ print WARN <<'EOM';
 #define isWARN_on(c,x) (IsSet(SvPVX(c), 2*(x)))
 #define isWARNf_on(c,x)        (IsSet(SvPVX(c), 2*(x)+1))
 
-#define ckDEAD(x)                                                      \
-          ( ! specialWARN(PL_curcop->cop_warnings) &&                  \
-           ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) ||          \
-             isWARNf_on(PL_curcop->cop_warnings, x)))
-
 #define ckWARN(x)                                                      \
        ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE &&     \
              (PL_curcop->cop_warnings == pWARN_ALL ||                  \
@@ -248,6 +267,23 @@ print WARN <<'EOM';
                isWARN_on(PL_curcop->cop_warnings, y) ) )               \
            ||  (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
 
+#define ckWARN3(x,y,z)                                                 \
+         ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE &&   \
+             (PL_curcop->cop_warnings == pWARN_ALL ||                  \
+               isWARN_on(PL_curcop->cop_warnings, x)  ||               \
+               isWARN_on(PL_curcop->cop_warnings, y)  ||               \
+               isWARN_on(PL_curcop->cop_warnings, z) ) )               \
+           ||  (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN4(x,y,z,t)                                               \
+         ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE &&   \
+             (PL_curcop->cop_warnings == pWARN_ALL ||                  \
+               isWARN_on(PL_curcop->cop_warnings, x)  ||               \
+               isWARN_on(PL_curcop->cop_warnings, y)  ||               \
+               isWARN_on(PL_curcop->cop_warnings, z)  ||               \
+               isWARN_on(PL_curcop->cop_warnings, t) ) )               \
+           ||  (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
+
 #define ckWARN_d(x)                                                    \
          (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL ||     \
             (PL_curcop->cop_warnings != pWARN_NONE &&                  \
@@ -259,6 +295,39 @@ print WARN <<'EOM';
                (isWARN_on(PL_curcop->cop_warnings, x)  ||              \
                 isWARN_on(PL_curcop->cop_warnings, y) ) ) )
 
+#define ckWARN3_d(x,y,z)                                               \
+         (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL ||     \
+            (PL_curcop->cop_warnings != pWARN_NONE &&                  \
+               (isWARN_on(PL_curcop->cop_warnings, x)  ||              \
+                isWARN_on(PL_curcop->cop_warnings, y)  ||              \
+                isWARN_on(PL_curcop->cop_warnings, z) ) ) )
+
+#define ckWARN4_d(x,y,z,t)                                             \
+         (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL ||     \
+            (PL_curcop->cop_warnings != pWARN_NONE &&                  \
+               (isWARN_on(PL_curcop->cop_warnings, x)  ||              \
+                isWARN_on(PL_curcop->cop_warnings, y)  ||              \
+                isWARN_on(PL_curcop->cop_warnings, z)  ||              \
+                isWARN_on(PL_curcop->cop_warnings, t) ) ) )
+
+#define packWARN(a)            (a                                 )
+#define packWARN2(a,b)         ((a) | (b)<<8                      )
+#define packWARN3(a,b,c)       ((a) | (b)<<8 | (c) <<16           )
+#define packWARN4(a,b,c,d)     ((a) | (b)<<8 | (c) <<16 | (d) <<24)
+
+#define unpackWARN1(x)         ((x)        & 0xFF)
+#define unpackWARN2(x)         (((x) >>8)  & 0xFF)
+#define unpackWARN3(x)         (((x) >>16) & 0xFF)
+#define unpackWARN4(x)         (((x) >>24) & 0xFF)
+
+#define ckDEAD(x)                                                      \
+          ( ! specialWARN(PL_curcop->cop_warnings) &&                  \
+           ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) ||          \
+             isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) ||    \
+             isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) ||    \
+             isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) ||    \
+             isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
+
 /* end of file warnings.h */
 
 EOM
@@ -289,9 +358,9 @@ foreach $k (sort keys  %list) {
     my $v = $list{$k} ;
     my @list = sort { $a <=> $b } @$v ;
 
-    print PM tab(4, "    '$k'"), '=> "', 
-               # mkHex($warn_size, @list), 
-               mkHex($warn_size, map $_ * 2 , @list), 
+    print PM tab(4, "    '$k'"), '=> "',
+               # mkHex($warn_size, @list),
+               mkHex($warn_size, map $_ * 2 , @list),
                '", # [', mkRange(@list), "]\n" ;
 }
 
@@ -303,9 +372,9 @@ foreach $k (sort keys  %list) {
     my $v = $list{$k} ;
     my @list = sort { $a <=> $b } @$v ;
 
-    print PM tab(4, "    '$k'"), '=> "', 
-               # mkHex($warn_size, @list), 
-               mkHex($warn_size, map $_ * 2 + 1 , @list), 
+    print PM tab(4, "    '$k'"), '=> "',
+               # mkHex($warn_size, @list),
+               mkHex($warn_size, map $_ * 2 + 1 , @list),
                '", # [', mkRange(@list), "]\n" ;
 }
 
@@ -327,6 +396,8 @@ __END__
 
 package warnings;
 
+our $VERSION = '1.00';
+
 =head1 NAME
 
 warnings - Perl pragma to control optional warnings
@@ -352,16 +423,16 @@ warnings - Perl pragma to control optional warnings
         warnings::warn($object, "some warning");
     }
 
-    warnif("some warning");
-    warnif("void", "some warning");
-    warnif($object, "some warning");
+    warnings::warnif("some warning");
+    warnings::warnif("void", "some warning");
+    warnings::warnif($object, "some warning");
 
 =head1 DESCRIPTION
 
 If no import list is supplied, all possible warnings are either enabled
 or disabled.
 
-A number of functions are provided to assist module authors. 
+A number of functions are provided to assist module authors.
 
 =over 4
 
@@ -452,6 +523,12 @@ KEYWORDS
 
 $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
 
+sub Croaker
+{
+    delete $Carp::CarpInternal{'warnings'};
+    croak @_ ;
+}
+
 sub bits {
     my $mask ;
     my $catmask ;
@@ -465,7 +542,7 @@ sub bits {
            $mask |= $DeadBits{$word} if $fatal ;
        }
        else
-          { croak("unknown warnings category '$word'")}  
+          { Croaker("Unknown warnings category '$word'")}
     }
 
     return $mask ;
@@ -473,17 +550,22 @@ sub bits {
 
 sub import {
     shift;
-    ${^WARNING_BITS} |= bits(@_ ? @_ : 'all') ;
+    my $mask = ${^WARNING_BITS} ;
+    if (vec($mask, $Offsets{'all'}, 1)) {
+        $mask |= $Bits{'all'} ;
+        $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+    }
+    ${^WARNING_BITS} = $mask | bits(@_ ? @_ : 'all') ;
 }
 
 sub unimport {
     shift;
     my $mask = ${^WARNING_BITS} ;
     if (vec($mask, $Offsets{'all'}, 1)) {
-        $mask = $Bits{'all'} ;
+        $mask |= $Bits{'all'} ;
         $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
     }
-    ${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
+    ${^WARNING_BITS} = $mask & ~ (bits('FATAL' => (@_ ? @_ : 'all')) | $All) ;
 }
 
 sub __chk
@@ -496,23 +578,23 @@ sub __chk
         # check the category supplied.
         $category = shift ;
         if (ref $category) {
-            croak ("not an object")
-                if $category !~ /^([^=]+)=/ ;+
+            Croaker ("not an object")
+                if $category !~ /^([^=]+)=/ ;
            $category = $1 ;
             $isobj = 1 ;
         }
         $offset = $Offsets{$category};
-        croak("unknown warnings category '$category'")
+        Croaker("Unknown warnings category '$category'")
            unless defined $offset;
     }
     else {
-        $category = (caller(1))[0] ; 
+        $category = (caller(1))[0] ;
         $offset = $Offsets{$category};
-        croak("package '$category' not registered for warnings")
+        Croaker("package '$category' not registered for warnings")
            unless defined $offset ;
     }
 
-    my $this_pkg = (caller(1))[0] ; 
+    my $this_pkg = (caller(1))[0] ;
     my $i = 2 ;
     my $pkg ;
 
@@ -526,17 +608,17 @@ sub __chk
         for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
             last if $pkg ne $this_pkg ;
         }
-        $i = 2 
+        $i = 2
             if !$pkg || $pkg eq $this_pkg ;
     }
 
-    my $callers_bitmask = (caller($i))[9] ; 
+    my $callers_bitmask = (caller($i))[9] ;
     return ($callers_bitmask, $offset, $i) ;
 }
 
 sub enabled
 {
-    croak("Usage: warnings::enabled([category])")
+    Croaker("Usage: warnings::enabled([category])")
        unless @_ == 1 || @_ == 0 ;
 
     my ($callers_bitmask, $offset, $i) = __chk(@_) ;
@@ -549,13 +631,12 @@ sub enabled
 
 sub warn
 {
-    croak("Usage: warnings::warn([category,] 'message')")
+    Croaker("Usage: warnings::warn([category,] 'message')")
        unless @_ == 2 || @_ == 1 ;
 
     my $message = pop ;
     my ($callers_bitmask, $offset, $i) = __chk(@_) ;
-    local $Carp::CarpLevel = $i ;
-    croak($message) 
+    croak($message)
        if vec($callers_bitmask, $offset+1, 1) ||
           vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
     carp($message) ;
@@ -563,19 +644,18 @@ sub warn
 
 sub warnif
 {
-    croak("Usage: warnings::warnif([category,] 'message')")
+    Croaker("Usage: warnings::warnif([category,] 'message')")
        unless @_ == 2 || @_ == 1 ;
 
     my $message = pop ;
     my ($callers_bitmask, $offset, $i) = __chk(@_) ;
-    local $Carp::CarpLevel = $i ;
 
-    return 
+    return
         unless defined $callers_bitmask &&
                (vec($callers_bitmask, $offset, 1) ||
                vec($callers_bitmask, $Offsets{'all'}, 1)) ;
 
-    croak($message) 
+    croak($message)
        if vec($callers_bitmask, $offset+1, 1) ||
           vec($callers_bitmask, $Offsets{'all'}+1, 1) ;