#
# Input format: lines, #-comments, blank lines ignored.
# Indent level is relevant, but only 0, 1, >1 relevant.
+# Order of information in a file is not relevant unless explicitly
+# stated below.
#
# <Circuit Name>
# Starts a circuit.
# no more specific description, and the constructed description
# is <desc prefix> with a space and the remainder of the part
# name appended.
+#
+# suppress <item>
+# suppress <part glob>
+# Suppresses all processing for all parts matching the
+# glob.
+#
# end
# Ends the file. Optional.
# $show{$item}{Info} ) strings ready to print
# $show{$item}{Price} calculated value
+our(%suppress_item);
+our(@suppress_partre);
+
our(@sorthow);
# list of desc price avail
if (defined $3) {
push @{ $itemdesc{$2} }, "$1: $3";
}
+ } elsif (m/^suppress\s+($item_re)$/) {
+ $suppress_item{$1}= 1;
+ } elsif (m/^suppress\s+(\S.*)$/) {
+ $_= $1; s/\s+/ /g;
+ s/\W/ ($& eq '*' ? '.*' :
+ $& eq '?' ? '.' :
+ "\\$&") /ge;
+ push @suppress_partre, $_;
} else {
die "$_ ?";
}
my ($o, $bi, $how, $title);
$o= '';
$bi= $iteminfo{$item};
- if (!defined $bi) { return "? $item\n"; }
+ if (!defined $bi) {
+ $bi= { Avail => '?U' };
+ $bi->{Description} = $itemdesc{$item} ? $itemdesc{$item}[0] : '?U';
+ }
foreach $how (@sorthow) {
if ($how eq 'price') {
$o .= sprintf "%030.20f ", 1.0 / ($show{$item}{Price} + 0.0001);
return $o;
}
+sub hrule () { print '-'x79, "\n" or die $!; }
+
+sub iteminstanceprint ($) {
+ my ($ii) = @_;
+ my ($ql,$qr);
+
+ $ql= $ii->{Qty}; $qr= '';
+ if ($ql =~ s/\D\d+$//) { $qr= $&; }
+ if ($ql =~ s,(\d+)/[a-z]+$,,) { $qr= "$1/"; }
+ if ($ql =~ s/\=//) { $qr .= $&; }
+ return sprintf("%*s %5s%-2s %s\n",
+ (4+1+4),'',
+ $ql,$qr,
+ $ii->{Use});
+}
+
sub analyse_spec () {
my ($part,$pd,$try,@rhs,$sp,$circuit,$iteratable,$count,$pe,$use);
my ($item,$totalqty,$ii,$bi,$toorder,$price,$total,$notechar,$desc);
- my ($avail,%avail,$desclen,$why,$ql,$qr);
+ my ($avail,%avail,$desclen,$why,$suppress,%suppress,$pi);
+ my ($iteminstance);
+ $desclen= 42;
foreach $part (sort keys %partdef) {
$item= $partdef{$part};
next if exists $itemdesc{$item};
$use= $pe->{Use};
$use= defined $use ? "$circuit: $use" : $circuit;
$part= $pe->{Part};
+ $suppress= 0;
if ($part =~ m/^$item_re$/) {
$item= $part;
} elsif (exists $partdef{$part}) {
+ $suppress= 1 if grep { $part =~ m/^$_$/ } @suppress_partre;
$item= $partdef{$part};
} else {
push @fault, "unknown part $part ($pe->{FileLine})";
next;
}
- push @{ $iteminstances{$item} }, {
+ $suppress= 1 if exists $suppress_item{$item};
+ $iteminstance= {
Use => $use,
Qty => $pe->{Qty},
Mult => $count,
- FileLine => $pe->{FileLine}
- };
+ FileLine => $pe->{FileLine},
+ };
+ if ($suppress) {
+ push @{ $suppress{$item} }, iteminstanceprint($iteminstance);
+ } else {
+ push @{ $iteminstances{$item} }, $iteminstance;
+ }
}
}
$total= 0;
- $desclen= 42;
foreach $item (sort keys %iteminstances) {
$why= defined $itemdesc{$item} ? $itemdesc{$item}[0].'; ' : '';
$why .= join ",", map { $_->{FileLine} } @{ $iteminstances{$item} };
$desc);
}
foreach $ii (@{ $iteminstances{$item} }) {
- $ql= $ii->{Qty}; $qr= '';
- if ($ql =~ s/\D\d+$//) { $qr= $&; }
- if ($ql =~ s,(\d+)/[a-z]+$,,) { $qr= "$1/"; }
- if ($ql =~ s/\=//) { $qr .= $&; }
- $show{$item}{Info} .=
- sprintf("%*s %5s%-2s %s\n",
- (4+1+4),'',
- $ql,$qr,
- $ii->{Use});
+ $show{$item}{Info} .= iteminstanceprint($ii);
}
}
foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
or die $!;
print "\n" or die $!;
dump_warnerrs();
- print '-'x70, "\n" or die $!;
+ if (keys %suppress) {
+ print "---------- suppressed ----------\n" or die $!;
+ foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
+ keys %suppress) {
+ $pi= $item;
+ foreach $ii (@{ $itemdesc{$item} }) {
+ printf " %-10s %s\n", $pi, $ii
+ or die $!;
+ $pi= '';
+ }
+ if (length $pi) {
+ print " $pi\n" or die $!;
+ }
+ foreach $ii (@{ $suppress{$item} }) {
+ print $ii or die $!;
+ }
+ }
+ }
+ hrule();
}
sub addqty ($$$$) {