From fe5e9c1a903f084186d886e5afbc422a7b44b7a8 Mon Sep 17 00:00:00 2001 From: Britton Smith Date: Mon, 22 Jun 2009 14:27:18 -0600 Subject: [PATCH] Added support for parameters with multiple values. Conflict entries can now match single values of an array, any values in an array, or all values of the array. See the enzo_parameter_conflicts.txt file for an example. --HG-- branch : week-of-code --- bin/find_conflicts | 105 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/bin/find_conflicts b/bin/find_conflicts index cea232426..8fcedfe2f 100755 --- a/bin/find_conflicts +++ b/bin/find_conflicts @@ -32,14 +32,61 @@ sub findConflicts { for (my $w = 0;$w < @{$conflicts[$q]{situations}};$w++) { MATCH: for (my $e = 0;$e < @{$conflicts[$q]{situations}[$w]{value}};$e++) { - my $compare = sprintf "\$check = int(%s %s %s)", - $parameters{$conflicts[$q]{situations}[$w]{parameter}}, - $conflicts[$q]{situations}[$w]{comparison}, - $conflicts[$q]{situations}[$w]{value}[$e]; - eval $compare; - if ($check) { - $matches++; - last MATCH; + if (defined($parameters{$conflicts[$q]{situations}[$w]{parameter}})) { + + # multi-value parameter + if (defined($conflicts[$q]{situations}[$w]{array})) { + + # any of the array values match. + if ($conflicts[$q]{situations}[$w]{array} =~ /^any$/i) { + for (my $r = 0;$r < @{$parameters{$conflicts[$q]{situations}[$w]{parameter}}};$r++) { + if (&checkValues($parameters{$conflicts[$q]{situations}[$w]{parameter}}[$r], + $conflicts[$q]{situations}[$w]{comparison}, + $conflicts[$q]{situations}[$w]{value}[$e])) { + $matches++; + last MATCH; + } + } + } + # all of the array values match. + if ($conflicts[$q]{situations}[$w]{array} =~ /^all$/i) { + my $arrayMatches = 0; + for (my $r = 0;$r < @{$parameters{$conflicts[$q]{situations}[$w]{parameter}}};$r++) { + if (&checkValues($parameters{$conflicts[$q]{situations}[$w]{parameter}}[$r], + $conflicts[$q]{situations}[$w]{comparison}, + $conflicts[$q]{situations}[$w]{value}[$e])) { + $arrayMatches++; + } + } + if ($arrayMatches == scalar @{$parameters{$conflicts[$q]{situations}[$w]{parameter}}}) { + $matches++; + last MATCH; + } + } + + # match a certain value in the array. + else { + if (&checkValues($parameters{$conflicts[$q]{situations}[$w]{parameter}} + [$conflicts[$q]{situations}[$w]{array}], + $conflicts[$q]{situations}[$w]{comparison}, + $conflicts[$q]{situations}[$w]{value}[$e])) { + $matches++; + last MATCH; + } + } + + } + + # single value parameter + else { + if (&checkValues($parameters{$conflicts[$q]{situations}[$w]{parameter}}, + $conflicts[$q]{situations}[$w]{comparison}, + $conflicts[$q]{situations}[$w]{value}[$e])) { + $matches++; + last MATCH; + } + } + } } @@ -54,12 +101,28 @@ sub findConflicts { } +sub checkValues { + my ($par,$comp,$val) = @_; + + my $compare = sprintf "\$check = int(%s %s %s)", $par, $comp, $val; + eval $compare; + return $check; +} + sub printConflict { my ($cNumber) = @_; print "Conflict found:\n"; for (my $w = 0;$w < @{$conflicts[$cNumber]{situations}};$w++) { - print "\t$conflicts[$cNumber]{situations}[$w]{parameter} = $parameters{$conflicts[$cNumber]{situations}[$w]{parameter}}\n"; + my $parValue; + if (ref($parameters{$conflicts[$cNumber]{situations}[$w]{parameter}}) == 'ARRAY') { + $parValue = join " ", @{$parameters{$conflicts[$cNumber]{situations}[$w]{parameter}}}; + } + else { + $parValue = $parameters{$conflicts[$cNumber]{situations}[$w]{parameter}}; + } + + print "\t$conflicts[$cNumber]{situations}[$w]{parameter} = $parValue\n"; } print "Message: $conflicts[$cNumber]{message}\n"; print "\n"; @@ -77,10 +140,17 @@ sub readParameterFile { foreach $comment (@comments) { $line =~ s/$comment.*//; } - if ($line =~ /^\s*([^\s]+)\s*=\s*([^\s]+)\s*$/) { + if ($line =~ /^\s*([^\s]+)\s*=\s*(.+)\s*$/) { my $parameter = $1; my $value = $2; - $parameters{$parameter} = $value; + + # if parameter has more than one value, store it as an array. + if ($value =~ /\S+\s+\S+/) { + @{$parameters{$parameter}} = split /\s+/, $value; + } + else { + $parameters{$parameter} = $value; + } } } close (IN); @@ -129,7 +199,18 @@ sub loadConflicts { $values =~ s/\s+//g; @values = split ",",$values; } - $conflicts[$nConflicts]{situations}[$situations]{parameter} = $parameter; + + # catch array indices + if ($parameter =~ /(.+)\[(.+)\]/) { + my $arrayParameter = $1; + my $arrayIndex = $2; + $conflicts[$nConflicts]{situations}[$situations]{parameter} = $arrayParameter; + $conflicts[$nConflicts]{situations}[$situations]{array} = $arrayIndex; + } + else { + $conflicts[$nConflicts]{situations}[$situations]{parameter} = $parameter; + } + $conflicts[$nConflicts]{situations}[$situations]{comparison} = $comparison; @{$conflicts[$nConflicts]{situations}[$situations]{value}} = @values; $situations++;