X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=util%2Fmkerr.pl;h=4645658e993a73c3797725d049f2b0621f3f17da;hp=15b774f27728b5006aa1504391b5cc7b191b4066;hb=71728dd8aa3acc0bc9d621f8c4a4032aa3325fe4;hpb=05566760dabc12fd1325ba84ecf47c3f28f5b37a diff --git a/util/mkerr.pl b/util/mkerr.pl index 15b774f277..4645658e99 100644 --- a/util/mkerr.pl +++ b/util/mkerr.pl @@ -1,19 +1,28 @@ -#!/usr/local/bin/perl -w +#! /usr/bin/env perl +# Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the OpenSSL license (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html my $config = "crypto/err/openssl.ec"; -my $hprefix = "openssl/"; my $debug = 0; +my $unref = 0; my $rebuild = 0; my $static = 1; my $recurse = 0; my $reindex = 0; my $dowrite = 0; my $staticloader = ""; +my @t = localtime(); +my $YEAR = @t[5] + 1900; my $pack_errcode; my $load_errcode; my $errcount; +my $year = (localtime)[5] + 1900; while (@ARGV) { my $arg = $ARGV[0]; @@ -25,6 +34,7 @@ while (@ARGV) { $hprefix = shift @ARGV; } elsif($arg eq "-debug") { $debug = 1; + $unref = 1; shift @ARGV; } elsif($arg eq "-rebuild") { $rebuild = 1; @@ -41,6 +51,9 @@ while (@ARGV) { } elsif($arg eq "-staticloader") { $staticloader = "static "; shift @ARGV; + } elsif($arg eq "-unref") { + $unref = 1; + shift @ARGV; } elsif($arg eq "-write") { $dowrite = 1; shift @ARGV; @@ -56,6 +69,8 @@ Options: -hprefix P Prepend the filenames in generated #include
statements with prefix P. Default: 'openssl/' (without the quotes, naturally) + NOTE: not used any more because our include directory + structure has changed. -debug Turn on debugging verbose output on stderr. @@ -82,23 +97,25 @@ Options: Default: keep previously assigned numbers. (You are warned when collisions are detected.) - -nostatic Generates a different source code, where these additional + -nostatic Generates a different source code, where these additional functions are generated for each library specified in the config file: void ERR_load__strings(void); void ERR_unload__strings(void); void ERR__error(int f, int r, char *fn, int ln); - #define err(f,r) ERR__error(f,r,__FILE__,__LINE__) + #define err(f,r) ERR__error(f,r,OPENSSL_FILE,OPENSSL_LINE) while the code facilitates the use of these in an environment - where the error support routines are dynamically loaded at + where the error support routines are dynamically loaded at runtime. Default: 'static' code generation. -staticloader Prefix generated functions with the 'static' scope modifier. Default: don't write any scope modifier prefix. - -write Actually (over)write the generated code to the header and C - source files as assigned to each library through the config + -unref Print out unreferenced function and reason codes. + + -write Actually (over)write the generated code to the header and C + source files as assigned to each library through the config file. Default: don't write. @@ -115,7 +132,7 @@ EOF } if($recurse) { - @source = (, , ); + @source = ( , , , ) } else { @source = @ARGV; } @@ -157,8 +174,8 @@ close IN; while (($hdr, $lib) = each %libinc) { next if($hdr eq "NONE"); - print STDERR "Scanning header file $hdr\n" if $debug; - my $line = "", $def= "", $linenr = 0, $gotfile = 0; + print STDERR "Scanning header file $hdr\n" if $debug; + my $line = "", $def= "", $linenr = 0, $gotfile = 0, $cpp = 0; if (open(IN, "<$hdr")) { $gotfile = 1; while() { @@ -179,7 +196,7 @@ while (($hdr, $lib) = each %libinc) if(/\/\*/) { if (not /\*\//) { # multiline comment... $line = $_; # ... just accumulate - next; + next; } else { s/\/\*.*?\*\///gs; # wipe it } @@ -250,7 +267,7 @@ while (($hdr, $lib) = each %libinc) if ($gotfile) { while() { - if(/^\#define\s+(\S+)\s+(\S+)/) { + if(/^\#\s*define\s+(\S+)\s+(\S+)/) { $name = $1; $code = $2; next if $name =~ /^${lib}err/; @@ -327,9 +344,18 @@ foreach $file (@source) { next if exists $cskip{$file}; print STDERR "File loaded: ".$file."\r" if $debug; open(IN, "<$file") || die "Can't open source file $file\n"; + my $func; + my $linenr = 0; while() { # skip obsoleted source files entirely! last if(/^#error\s+obsolete/); + $linenr++; + if (!/;$/ && /^\**([a-zA-Z_].*[\s*])?([A-Za-z_0-9]+)\(.*([),]|$)/) + { + /^([^()]*(\([^()]*\)[^()]*)*)\(/; + $1 =~ /([A-Za-z_0-9]*)$/; + $func = $1; + } if(/(([A-Z0-9]+)_F_([A-Z0-9_]+))/) { next unless exists $csrc{$2}; @@ -339,8 +365,12 @@ foreach $file (@source) { $fcodes{$1} = "X"; $fnew{$2}++; } - $notrans{$1} = 1 unless exists $ftrans{$3}; - print STDERR "Function: $1\t= $fcodes{$1} (lib: $2, name: $3)\n" if $debug; + $ftrans{$3} = $func unless exists $ftrans{$3}; + if (uc $func ne $3) { + print STDERR "ERROR: mismatch $file:$linenr $func:$3\n"; + $errcount++; + } + print STDERR "Function: $1\t= $fcodes{$1} (lib: $2, name: $3)\n" if $debug; } if(/(([A-Z0-9]+)_R_[A-Z0-9_]+)/) { next unless exists $csrc{$2}; @@ -349,8 +379,8 @@ foreach $file (@source) { $rcodes{$1} = "X"; $rnew{$2}++; } - print STDERR "Reason: $1\t= $rcodes{$1} (lib: $2)\n" if $debug; - } + print STDERR "Reason: $1\t= $rcodes{$1} (lib: $2)\n" if $debug; + } } close IN; } @@ -363,7 +393,6 @@ foreach $lib (keys %csrc) my $hfile = $hinc{$lib}; my $cfile = $csrc{$lib}; if(!$fnew{$lib} && !$rnew{$lib}) { - print STDERR "$lib:\t\tNo new error codes\n"; next unless $rebuild; } else { print STDERR "$lib:\t\t$fnew{$lib} New Functions,"; @@ -381,75 +410,37 @@ foreach $lib (keys %csrc) # Rewrite the header file + $cpp = 0; + $cplusplus = 0; if (open(IN, "<$hfile")) { # Copy across the old file while() { + $cplusplus = $cpp if /^#.*ifdef.*cplusplus/; + $cpp++ if /^#\s*if/; + $cpp-- if /^#\s*endif/; push @out, $_; last if (/BEGIN ERROR CODES/); } close IN; } else { + $cpp = 1; + $cplusplus = 1; push @out, -"/* ====================================================================\n", -" * Copyright (c) 2001-2010 The OpenSSL Project. All rights reserved.\n", -" *\n", -" * Redistribution and use in source and binary forms, with or without\n", -" * modification, are permitted provided that the following conditions\n", -" * are met:\n", -" *\n", -" * 1. Redistributions of source code must retain the above copyright\n", -" * notice, this list of conditions and the following disclaimer. \n", -" *\n", -" * 2. Redistributions in binary form must reproduce the above copyright\n", -" * notice, this list of conditions and the following disclaimer in\n", -" * the documentation and/or other materials provided with the\n", -" * distribution.\n", -" *\n", -" * 3. All advertising materials mentioning features or use of this\n", -" * software must display the following acknowledgment:\n", -" * \"This product includes software developed by the OpenSSL Project\n", -" * for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"\n", -" *\n", -" * 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n", -" * endorse or promote products derived from this software without\n", -" * prior written permission. For written permission, please contact\n", -" * openssl-core\@openssl.org.\n", -" *\n", -" * 5. Products derived from this software may not be called \"OpenSSL\"\n", -" * nor may \"OpenSSL\" appear in their names without prior written\n", -" * permission of the OpenSSL Project.\n", -" *\n", -" * 6. Redistributions of any form whatsoever must retain the following\n", -" * acknowledgment:\n", -" * \"This product includes software developed by the OpenSSL Project\n", -" * for use in the OpenSSL Toolkit (http://www.openssl.org/)\"\n", -" *\n", -" * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n", -" * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n", -" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n", -" * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR\n", -" * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n", -" * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n", -" * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n", -" * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n", -" * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n", -" * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n", -" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n", -" * OF THE POSSIBILITY OF SUCH DAMAGE.\n", -" * ====================================================================\n", -" *\n", -" * This product includes cryptographic software written by Eric Young\n", -" * (eay\@cryptsoft.com). This product includes software written by Tim\n", -" * Hudson (tjh\@cryptsoft.com).\n", +"/*\n", +" * Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved.\n", " *\n", +" * Licensed under the OpenSSL license (the \"License\"). You may not use\n", +" * this file except in compliance with the License. You can obtain a copy\n", +" * in the file LICENSE in the source distribution or at\n", +" * https://www.openssl.org/source/license.html\n", " */\n", "\n", "#ifndef HEADER_${lib}_ERR_H\n", -"#define HEADER_${lib}_ERR_H\n", +"# define HEADER_${lib}_ERR_H\n", "\n", -"#ifdef __cplusplus\n", +"# ifdef __cplusplus\n", "extern \"C\" {\n", -"#endif\n", +"# endif\n", "\n", "/* BEGIN ERROR CODES */\n"; } @@ -458,21 +449,23 @@ foreach $lib (keys %csrc) print OUT @out; undef @out; print OUT <<"EOF"; -/* The following lines are auto generated by the script mkerr.pl. Any changes +/* + * The following lines are auto generated by the script mkerr.pl. Any changes * made after this point may be overwritten when the script is next run. */ + EOF if($static) { print OUT <<"EOF"; -${staticloader}void ERR_load_${lib}_strings(void); +${staticloader}int ERR_load_${lib}_strings(void); EOF } else { print OUT <<"EOF"; -${staticloader}void ERR_load_${lib}_strings(void); +${staticloader}int ERR_load_${lib}_strings(void); ${staticloader}void ERR_unload_${lib}_strings(void); ${staticloader}void ERR_${lib}_error(int function, int reason, char *file, int line); -#define ${lib}err(f,r) ERR_${lib}_error((f),(r),__FILE__,__LINE__) +# define ${lib}err(f,r) ERR_${lib}_error((f),(r),OPENSSL_FILE,OPENSSL_LINE) EOF } @@ -483,7 +476,7 @@ EOF EOF foreach $i (@function) { - $z=6-int(length($i)/8); + $z=48 - length($i); if($fcodes{$i} eq "X") { $fassigned{$lib} =~ m/^:([^:]*):/; $findcode = $1; @@ -497,13 +490,13 @@ EOF $fassigned{$lib} .= "$findcode:"; print STDERR "New Function code $i\n" if $debug; } - printf OUT "#define $i%s $fcodes{$i}\n","\t" x $z; + printf OUT "# define $i%s $fcodes{$i}\n"," " x $z; } print OUT "\n/* Reason codes. */\n"; foreach $i (@reasons) { - $z=6-int(length($i)/8); + $z=48 - length($i); if($rcodes{$i} eq "X") { $rassigned{$lib} =~ m/^:([^:]*):/; $findcode = $1; @@ -517,15 +510,21 @@ EOF $rassigned{$lib} .= "$findcode:"; print STDERR "New Reason code $i\n" if $debug; } - printf OUT "#define $i%s $rcodes{$i}\n","\t" x $z; + printf OUT "# define $i%s $rcodes{$i}\n"," " x $z; } print OUT <<"EOF"; -#ifdef __cplusplus -} -#endif -#endif EOF + do { + if ($cplusplus == $cpp) { + print OUT "#", " "x$cpp, "ifdef __cplusplus\n"; + print OUT "}\n"; + print OUT "#", " "x$cpp, "endif\n"; + } + if ($cpp-- > 0) { + print OUT "#", " "x$cpp, "endif\n"; + } + } while ($cpp); close OUT; # Rewrite the C source file containing the error details. @@ -533,14 +532,21 @@ EOF # First, read any existing reason string definitions: my %err_reason_strings; if (open(IN,"<$cfile")) { + my $line = ""; while () { - if (/\b(${lib}_R_\w*)\b.*\"(.*)\"/) { - $err_reason_strings{$1} = $2; - } - if (/\b${lib}_F_(\w*)\b.*\"(.*)\"/) { - if (!exists $ftrans{$1} && ($1 ne $2)) { - print STDERR "WARNING: Mismatched function string $2\n"; - $ftrans{$1} = $2; + s|\R$||; # Better chomp + $_ = $line . $_; + $line = ""; + if (/{ERR_(FUNC|REASON)\(/) { + if (/\b(${lib}_R_\w*)\b.*\"(.*)\"/) { + $err_reason_strings{$1} = $2; + } elsif (/\b${lib}_F_(\w*)\b.*\"(.*)\"/) { + if (!exists $ftrans{$1} && ($1 ne $2)) { + print STDERR "WARNING: Mismatched function string $2\n"; + $ftrans{$1} = $2; + } + } else { + $line = $_; } } } @@ -550,8 +556,13 @@ EOF my $hincf; if($static) { - $hfile =~ /([^\/]+)$/; - $hincf = "<${hprefix}$1>"; + $hincf = $hfile; + $hincf =~ s|.*include/||; + if ($hincf =~ m|^openssl/|) { + $hincf = "<${hincf}>"; + } else { + $hincf = "\"${hincf}\""; + } } else { $hincf = "\"$hfile\""; } @@ -574,64 +585,14 @@ EOF open (OUT,">$cfile") || die "Can't open $cfile for writing"; print OUT <<"EOF"; -/* $cfile */ -/* ==================================================================== - * Copyright (c) 1999-2010 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core\@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay\@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh\@cryptsoft.com). +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved. * - */ - -/* NOTE: this file was auto generated by the mkerr.pl script: any changes - * made to it will be overwritten when the script next updates this file, - * only reason strings will be preserved. + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html */ #include @@ -641,11 +602,10 @@ EOF /* BEGIN ERROR CODES */ #ifndef OPENSSL_NO_ERR -#define ERR_FUNC(func) ERR_PACK($pack_errcode,func,0) -#define ERR_REASON(reason) ERR_PACK($pack_errcode,0,reason) +# define ERR_FUNC(func) ERR_PACK($pack_errcode,func,0) +# define ERR_REASON(reason) ERR_PACK($pack_errcode,0,reason) -static ERR_STRING_DATA ${lib}_str_functs[]= - { +static ERR_STRING_DATA ${lib}_str_functs[] = { EOF # Add each function code: if a function name is found then use it. foreach $i (@function) { @@ -656,20 +616,22 @@ EOF $fn = $ftrans{$fn}; } # print OUT "{ERR_PACK($pack_errcode,$i,0),\t\"$fn\"},\n"; - print OUT "{ERR_FUNC($i),\t\"$fn\"},\n"; + if(length($i) + length($fn) > 57) { + print OUT " {ERR_FUNC($i),\n \"$fn\"},\n"; + } else { + print OUT " {ERR_FUNC($i), \"$fn\"},\n"; + } } print OUT <<"EOF"; -{0,NULL} - }; + {0, NULL} +}; -static ERR_STRING_DATA ${lib}_str_reasons[]= - { +static ERR_STRING_DATA ${lib}_str_reasons[] = { EOF # Add each reason code. foreach $i (@reasons) { my $rn; my $rstr = "ERR_REASON($i)"; - my $nspc = 0; if (exists $err_reason_strings{$i}) { $rn = $err_reason_strings{$i}; } else { @@ -677,90 +639,89 @@ EOF $rn = $1; $rn =~ tr/_[A-Z]/ [a-z]/; } - $nspc = 40 - length($rstr) unless length($rstr) > 40; - $nspc = " " x $nspc; - print OUT "{${rstr}${nspc},\"$rn\"},\n"; + if(length($i) + length($rn) > 55) { + print OUT " {${rstr},\n \"$rn\"},\n"; + } else { + print OUT " {${rstr}, \"$rn\"},\n"; + } } if($static) { print OUT <<"EOF"; -{0,NULL} - }; + {0, NULL} +}; #endif -${staticloader}void ERR_load_${lib}_strings(void) - { +${staticloader}int ERR_load_${lib}_strings(void) +{ #ifndef OPENSSL_NO_ERR - if (ERR_func_error_string(${lib}_str_functs[0].error) == NULL) - { - ERR_load_strings($load_errcode,${lib}_str_functs); - ERR_load_strings($load_errcode,${lib}_str_reasons); - } + if (ERR_func_error_string(${lib}_str_functs[0].error) == NULL) { + ERR_load_strings($load_errcode, ${lib}_str_functs); + ERR_load_strings($load_errcode, ${lib}_str_reasons); + } #endif - } + return 1; +} EOF } else { print OUT <<"EOF"; -{0,NULL} - }; + {0, NULL} +}; #endif #ifdef ${lib}_LIB_NAME -static ERR_STRING_DATA ${lib}_lib_name[]= - { -{0 ,${lib}_LIB_NAME}, -{0,NULL} - }; +static ERR_STRING_DATA ${lib}_lib_name[] = { + {0, ${lib}_LIB_NAME}, + {0, NULL} +}; #endif +static int ${lib}_lib_error_code = 0; +static int ${lib}_error_init = 1; -static int ${lib}_lib_error_code=0; -static int ${lib}_error_init=1; - -${staticloader}void ERR_load_${lib}_strings(void) - { - if (${lib}_lib_error_code == 0) - ${lib}_lib_error_code=ERR_get_next_error_library(); +${staticloader}int ERR_load_${lib}_strings(void) +{ + if (${lib}_lib_error_code == 0) + ${lib}_lib_error_code = ERR_get_next_error_library(); - if (${lib}_error_init) - { - ${lib}_error_init=0; + if (${lib}_error_init) { + ${lib}_error_init = 0; #ifndef OPENSSL_NO_ERR - ERR_load_strings(${lib}_lib_error_code,${lib}_str_functs); - ERR_load_strings(${lib}_lib_error_code,${lib}_str_reasons); + ERR_load_strings(${lib}_lib_error_code, ${lib}_str_functs); + ERR_load_strings(${lib}_lib_error_code, ${lib}_str_reasons); #endif #ifdef ${lib}_LIB_NAME - ${lib}_lib_name->error = ERR_PACK(${lib}_lib_error_code,0,0); - ERR_load_strings(0,${lib}_lib_name); + ${lib}_lib_name->error = ERR_PACK(${lib}_lib_error_code, 0, 0); + ERR_load_strings(0, ${lib}_lib_name); #endif - } - } + } + return 1; +} ${staticloader}void ERR_unload_${lib}_strings(void) - { - if (${lib}_error_init == 0) - { +{ + if (${lib}_error_init == 0) { #ifndef OPENSSL_NO_ERR - ERR_unload_strings(${lib}_lib_error_code,${lib}_str_functs); - ERR_unload_strings(${lib}_lib_error_code,${lib}_str_reasons); + ERR_unload_strings(${lib}_lib_error_code, ${lib}_str_functs); + ERR_unload_strings(${lib}_lib_error_code, ${lib}_str_reasons); #endif #ifdef ${lib}_LIB_NAME - ERR_unload_strings(0,${lib}_lib_name); + ERR_unload_strings(0, ${lib}_lib_name); #endif - ${lib}_error_init=1; - } - } + ${lib}_error_init = 1; + } +} ${staticloader}void ERR_${lib}_error(int function, int reason, char *file, int line) - { - if (${lib}_lib_error_code == 0) - ${lib}_lib_error_code=ERR_get_next_error_library(); - ERR_PUT_error(${lib}_lib_error_code,function,reason,file,line); - } +{ + if (${lib}_lib_error_code == 0) + ${lib}_lib_error_code = ERR_get_next_error_library(); + ERR_PUT_error(${lib}_lib_error_code, function, reason, file, line); +} EOF } @@ -769,7 +730,7 @@ EOF undef %err_reason_strings; } -if($debug && defined(%notrans)) { +if($debug && %notrans) { print STDERR "The following function codes were not translated:\n"; foreach(sort keys %notrans) { @@ -787,7 +748,7 @@ foreach (keys %rcodes) { push (@runref, $_) unless exists $urcodes{$_}; } -if($debug && defined(@funref) ) { +if($unref && @funref) { print STDERR "The following function codes were not referenced:\n"; foreach(sort @funref) { @@ -795,7 +756,7 @@ if($debug && defined(@funref) ) { } } -if($debug && defined(@runref) ) { +if($unref && @runref) { print STDERR "The following reason codes were not referenced:\n"; foreach(sort @runref) {