chiark / gitweb /
line numbers
authorian <ian>
Wed, 14 Apr 2004 15:58:23 +0000 (15:58 +0000)
committerian <ian>
Wed, 14 Apr 2004 15:58:23 +0000 (15:58 +0000)
farnell/farnell-find

index 6b72090bcc37036e0a3d87405fcda9e3a9e1d810..cd01ec5f28f80a4e6a81d0aae2783ea2a048e3da 100755 (executable)
@@ -39,6 +39,7 @@
 
 use strict;
 use POSIX;
+use IO::Handle;
 
 our(@warn);
 our(@fault);
@@ -51,6 +52,7 @@ our(%parts);
 # $parts{"$circuit\n$sper"}[]{Part}       or item
 # $parts{"$circuit\n$sper"}[]{Qty}
 # $parts{"$circuit\n$sper"}[]{Use}
+# $parts{"$circuit\n$sper"}[]{LineNo}
 
 our(%partdef);
 # $partdef{"part name"}= $item;
@@ -64,6 +66,7 @@ our(%iteminstances);
 # $iteminstances{$item}[]{Use}   includes circuit
 # $iteminstances{$item}[]{Qty}
 # $iteminstances{$item}[]{Mult}   number in this circuit/sper
+# $iteminstances{$item}[]{LineNo}
 
 our(%itemdesc);
 # $itemdesc{$item}[]= $desc;
@@ -79,8 +82,8 @@ our($item_re)= '\d{3}\-\d{3,7}';
 our(%stockmap)= ('In Stock' => 'Y',
                 'Awaiting Delivery' => 'A');
 
-sub by_item ($) {
-    my ($itemcode) = @_;
+sub by_item ($;$) {
+    my ($itemcode,$why) = @_;
     # looks up $itemcode (ddd-d...) at Farnell and returns
     # cat hash ref
     local ($_);
@@ -104,8 +107,11 @@ sub by_item ($) {
        die "wrong results $sc2 ?\n" unless $sc2 eq $chr->{Shortcode};
        1;
     }) {
+       my ($emsg);
        $@ =~ s/\n$//;
-       push @warn, "item $itemcode: $@";
+       $emsg= "item $itemcode: $@";
+       $emsg.= " ($why)" if defined $why;
+       push @warn, $emsg;
        return undef;
     }
     $chr->{Description}= snarf('Description');
@@ -153,7 +159,7 @@ sub read_spec () {
            die "$_ ?";
        } elsif (m,^\s+($part_re|$item_re)\s+([0-9/=]+)(?:\s+(\S.*))?$,) {
            push @{ $parts{"$circuit\n$iteratable"} }, {
-               Part => $1, Qty => $2, Use => $3
+               Part => $1, Qty => $2, Use => $3, LineNo => $.
                };
        } elsif (m/^($part_re)\s+\?\s+\=\s+(\S.*)$/) {
            die if exists $pkinddesc{$1};
@@ -183,7 +189,7 @@ sub itemsortmap ($) {
 sub analyse_spec () {
     my ($part,$pd,$try,@rhs,$sp,$circuit,$iteratable,$count,$pe,$use);
     my ($item,$qty,$ii,$bi,$toorder,$price,$total,$notechar,$desc,$ql,$qr);
-    my ($avail,%avail);
+    my ($avail,%avail,$desclen,$why);
     foreach $part (keys %partdef) {
        $item= $partdef{$part};
        next if exists $itemdesc{$item};
@@ -221,20 +227,24 @@ sub analyse_spec () {
            } elsif (exists $partdef{$part}) {
                $item= $partdef{$part};
            } else {
-               push @fault, "unknown part $part";
+               push @fault, "unknown part $part (line $pe->{LineNo})";
                next;
            }
            push @{ $iteminstances{$item} }, {
                Use => $use,
                Qty => $pe->{Qty},
                Mult => $count,
+               LineNo => $pe->{LineNo}
                };
        }
     }
     $total= 0;
-    my ($desclen)= 43;
+    $desclen= 43;
     foreach $item (keys %iteminstances) {
-       $bi= by_item($item);
+       $why= defined $itemdesc{$item} ? $itemdesc{$item}[0].'; ' : '';
+       $why .= "line ".(join ",", map { $_->{LineNo} }
+                      @{ $iteminstances{$item} });
+       $bi= by_item($item, $why);
        $iteminfo{$item}= $bi;
     }  
     foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
@@ -350,6 +360,7 @@ sub dump_warnerrs () {
     my (%r);
     foreach $w (@fault) { next if $r{$w}++; print("ERROR: $w\n") or die $!; }
     foreach $w (@warn) { next if $r{$w}++; print("WARNING: $w\n") or die $!; }
+    STDOUT->flush or die $!;
     die "errors\n" if @fault;
 }