From: Zack Weinberg Date: Mon, 21 Sep 2020 18:40:45 +0000 (-0400) Subject: New utility function Autom4te::ChannelDefs::merge_WARNINGS. X-Git-Tag: v2.69c~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=53f18e7889ef1a64bb9273cc8a81e750d78a6333;p=thirdparty%2Fautoconf.git New utility function Autom4te::ChannelDefs::merge_WARNINGS. This function merges a list of warnings categories into the environment variable WARNINGS, returning a new value to set it to. The intended use is in code of the form { local $ENV{WARNINGS} = merge_WARNINGS ("this", "that"); # run a command here with WARNINGS=this,that,etc } This is not used yet, but will be in the next patch. * lib/Autom4te/ChannelDefs.pm (merge_WARNINGS): New function. --- diff --git a/lib/Autom4te/ChannelDefs.pm b/lib/Autom4te/ChannelDefs.pm index 21f444b9..62e69323 100644 --- a/lib/Autom4te/ChannelDefs.pm +++ b/lib/Autom4te/ChannelDefs.pm @@ -63,7 +63,8 @@ BEGIN our @ISA = qw (Exporter); our @EXPORT = qw (&prog_error &error &fatal &verb - &switch_warning &parse_WARNINGS &parse_warnings); + &switch_warning &parse_WARNINGS &parse_warnings + &merge_WARNINGS); =head2 CHANNELS @@ -409,6 +410,68 @@ sub parse_warnings (@) switch_warning ($_werror ? 'error' : 'no-error'); } +=item C + +Merge the warnings categories in the environment variable C +with the warnings categories in C<@CATEGORIES>, and return a new +value for C. Values in C<@CATEGORIES> take precedence. +Use like this: + + local $ENV{WARNINGS} = merge_WARNINGS @additional_warnings; + +=cut + +sub merge_WARNINGS (@) +{ + my $werror = ''; + my $all_or_none = ''; + my %warnings; + + my @categories = split /,/, $ENV{WARNINGS} || ''; + push @categories, @_; + + foreach (@categories) + { + if (/^(?:no-)?error$/) + { + $werror = $_; + } + elsif (/^(?:all|none)$/) + { + $all_or_none = $_; + } + else + { + # The character class in the second match group is ASCII \S minus + # comma. We are generous with this because category values may come + # from WARNINGS and we don't want to assume what other programs' + # syntaxes for warnings categories are. + /^(no-|)([\w\[\]\/\\!"#$%&'()*+-.:;<=>?@^`{|}~]+)$/ + or die "Invalid warnings category: $_"; + $warnings{$2} = $1; + } + } + + my @final_warnings; + if ($all_or_none) + { + push @final_warnings, $all_or_none; + } + else + { + foreach (sort keys %warnings) + { + push @final_warnings, $warnings{$_} . $_; + } + } + if ($werror) + { + push @final_warnings, $werror; + } + + return join (',', @final_warnings); +} + =item C Configure channels for strictness C<$STRICTNESS_NAME>.