our(%iteminfo);
# $iteminfo{$item}= by_item(...);
+our(%show);
+# $show{$item}{Head} ) newline terminated
+# $show{$item}{Info} ) strings ready to print
+# $show{$item}{Price} calculated value
+
+our($sorthow);
+# desc or price
+
our($partword1_re)= '\S*[^ \t0-9-]\S*';
our($partword_re)= '\S*[^ \t0-9/=]\S*';
our($part_re)= "$partword1_re(?: $partword_re)*";
sub itemsortmap ($) {
my ($item) = @_;
- my ($bi, $title);
+ my ($z, $bi, $title);
+ if ($sorthow eq 'price') {
+ $z= sprintf "%030.20f ", 1.0 / ($show{$item}{Price} + 0.0001);
+ } else {
+ $z= '';
+ }
$bi= $iteminfo{$item};
- return "? $item" if !defined $bi;
+ return "? $z $item" if !defined $bi;
$title= $bi->{Description};
$title .= "\n".$1 if $title =~ s/^(\[[^][]+\]) //;
- return $title;
+ return "$z $title";
}
sub analyse_spec () {
$bi= by_item($item, $why);
$iteminfo{$item}= $bi;
}
- foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
- keys %iteminstances) {
+ foreach $item (keys %iteminstances) {
undef $qty;
foreach $ii (@{ $iteminstances{$item} }) {
if (!defined $qty) {
$avail= $bi->{Avail};
$avail{$avail}= 1;
$avail= ' '.$stockmap{$avail} if exists $stockmap{$avail};
- printf("%5d%1s %-11s %-.${desclen}s %6.2f %6.2f%1s %s\n",
- $toorder, $notechar, $item, $bi->{Description},
- $bi->{Price}, $price, $notechar, $avail)
- or die $!;
+ $show{$item}{Head}=
+ sprintf("%5d%1s %-11s %-.${desclen}s %6.2f %6.2f%1s %s\n",
+ $toorder, $notechar, $item, $bi->{Description},
+ $bi->{Price}, $price, $notechar, $avail);
+ $show{$item}{Info}= '';
$total += $price;
+ $show{$item}{Price}= $price;
foreach $desc (@{ $itemdesc{$item} }) {
- printf("%*s %s\n",
- (5+1+1+11),'',
- $desc)
- or die $!;
+ $show{$item}{Info} .=
+ sprintf("%*s %s\n",
+ (5+1+1+11),'',
+ $desc);
}
foreach $ii (@{ $iteminstances{$item} }) {
$ql= $ii->{Qty}; $qr= '';
if ($ql =~ s/\D.*$//) { $qr= $&; }
- printf("%*s %5s%-2s %s\n",
- (5+1+5),'',
- $ql,$qr,
- $ii->{Use})
- or die $!;
+ $show{$item}{Info} .=
+ sprintf("%*s %5s%-2s %s\n",
+ (5+1+5),'',
+ $ql,$qr,
+ $ii->{Use});
}
- printf "\n" or die $!;
+ }
+ foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
+ keys %show) {
+ print $show{$item}{Head}, $show{$item}{Info}, "\n"
+ or die $!;
}
printf("%*s %11s %-*s %6.2f\n",
(5+1), 'TOTAL',
foreach $k (sort keys %$chr) {
printf "%-20s %s\n", $k, $chr->{$k} or die $!;
}
-} elsif (@ARGV==1) {
+} elsif (@ARGV==1 || @ARGV==2) {
open F, "< $ARGV[0]" or die $!;
+ $sorthow= @ARGV>1 ? $ARGV[1] : 'price';
+ die unless $sorthow !~ m/^(?:cost|desc)$/;
read_spec();
close F or die $!;
analyse_spec();