chiark / gitweb /
fetches much
authorian <ian>
Thu, 8 Apr 2004 01:21:20 +0000 (01:21 +0000)
committerian <ian>
Thu, 8 Apr 2004 01:21:20 +0000 (01:21 +0000)
farnell/circuit.partlist
farnell/farnell-find

index befcf7f8884dc4aa7801f8b4982fccc2b983677f..1f27ed676e73300a04b428b225ff55949e61d04c 100644 (file)
@@ -21,8 +21,8 @@ ICSP VPP/mclr
        std 330r        1
        std 720r        1
        std 220k        1
-       std 2k2 2
-       c cer 100n
+       std 2k2 2       1
+       c cer 100n      1
        in4148          1
        74f07           1/6
 
@@ -40,19 +40,20 @@ ICSP PC
 
 ICSP PD
        std 1k          1
-       bat86           2@pic
        std 22k 2
        std 220k        1
        74hct04         2/6
        74f07           1
        1n4148          1
+ per PIC
+       bat86           2
 
 Point solenoid
  per Half-point
        483-3363        1       stp22nf03l power FET
        352-5351        1       1n5401 freewheel diode
  per Half-point-discrete
-       std 330r
+       std 330r        1
  per Half-point-dil7
        149-002         1/7     470r x7 dil network
  per Half-point-dil8
@@ -126,7 +127,7 @@ PIC core
        std 3k9         2
        221-480         1
  per PIC
-       411-3822        pic18f458-i/p
+       411-3822        1       pic18f458-i/p
        c cer 100n      1
 
 Power supplies
@@ -165,3 +166,5 @@ r 0w4 470r  =       332-010
 r 0w4 680r     =       332-033
 r 0w4 1k5      =       332-070
 r 0w4 1k8      =       332-082
+
+end
index 038713f4d5264def5427ed74d4c523dac918aa4f..78bbd4cd907baa2550e3c34c2a73cea5111f0e35 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/perl -w
 
 use strict;
+use POSIX;
 
 our(@warn);
 our(@fault);
@@ -59,7 +60,7 @@ sub by_item ($) {
     $chr->{MinOrder}= snarf('Minimum Order');
     $chr->{Multiple}= snarf('Order Multiple');
     $price= snarf('Unit Price', "\n\<!--.*--\\>");
-    $price =~ m/\£(\d+\.\d\d)$/ or die "price $price ?";
+    $price =~ m/\£(\d+\.\d\d+)$/ or die "price $price ?";
     $chr->{Price}= $1;
     # price
     return $chr;
@@ -67,10 +68,10 @@ sub by_item ($) {
     
 sub snarf ($;$) {
     my ($thing, $allowbefore) = @_;
-    $allowbefore='' if !defined $allowbefore;
+    $allowbefore= defined $allowbefore ? "(?:$allowbefore)?" : '';
     m!
 \<td class="tabledata"(?: width="\d+%")?\>$thing</td>
-\<td class="tabledata"(?: width="\d+%")?\>(?:$allowbefore)?
+\<td class="tabledata"(?: width="\d+%")?\>$allowbefore
 (.+)(?:\n\&nbsp\;)*
 \</td>
 !
@@ -82,7 +83,7 @@ sub read_spec () {
     local ($_);
     my ($section,$sectionper);
     for (;;) {
-       $!=0; $_=<F>; die unless length $_;
+       $!=0; $_=<F>; die unless defined $_;
        chomp; s/\s+$//;
        last if m/^end$/;
        next if m/^\#/ || !m/\S/;
@@ -115,6 +116,7 @@ sub analyse_spec () {
     my ($item,$qty,$ii,$bi,$toorder,$price,$total,$notechar);
     foreach $part (keys %partdef) {
        $pd= $partdef{$part};
+       $pd->{Desc}= '' if !defined $pd->{Desc};
        next if length $pd->{Desc};
 
        $try= $part;
@@ -143,6 +145,7 @@ sub analyse_spec () {
        }
        foreach $pe (@{ $parts{$sp} }) {
            $desc= $pe->{Desc};
+           $desc= '' if !defined $desc;
            if ($pe->{Part} =~ m/^\d{3}\-/) {
                $item= $pe->{Part};
            } elsif (exists $partdef{$pe->{Part}}) {
@@ -176,15 +179,71 @@ sub analyse_spec () {
        next unless $bi;
        ($toorder,$notechar)= calcorder($qty, $bi);
        $price= $toorder * $bi->{Price};
-       printf("%5d%1s %-11s %.-60s %5.2d %5.2d\n",
+       printf("%5d%1s %-11s %-.60s %6.2f %6.2f %s\n",
               $toorder, $notechar, $item, $bi->{Description},
-              $bi->{Price}, $price)
+              $bi->{Price}, $price, $bi->{Avail})
            or die $!;
        $total += $price;
     }
-    printf((' 'x(5+1+1+11+1+60+5+1))."%5.2d\n", $total) or die $!;
+    printf((' 'x(5+1+1+11+1+60+6+1))."%6.2f\n", $total) or die $!;
     dump_warnerrs();
-}       
+}
+
+sub addqty ($$$$) {
+    my ($q1, $q2, $m2, $item) = @_;
+    my ($q1numer,$q1denom,$q1exact);
+    my ($q2numer,$q2denom,$q2exact);
+    if ($q2 !~ m!^(\d+)(?:/(\d+))?(\=?)$!) {
+       push @fault, "bad quantity $q2 x$m2 for item $item";
+       return $q1;
+    }
+    $q2numer= $1;
+    $q2denom= defined $2 ? $2 : '';
+    $q2exact= !!length $3;
+
+    $q1 =~ m!^(\d+)(?:/(\d+))?(\=?)$! or die "$q1 ?";
+    $q1numer= $1;
+    $q1denom= defined $2 ? $2 : '';
+    $q2exact= !!length $3;
+    if ($q1denom ne $q2denom) {
+       push @fault, "denominator for item $item changes from".
+           " $q1denom to $q2denom";
+       return $q1;
+    }
+    return sprintf("%d%s%s",
+                  ($q1numer+$q2numer),
+                  $q1denom,
+                  ($q1exact && $q2exact ? '=' : ''));
+}
+
+sub calcorder ($$) {
+    my ($qty, $bi) = @_; # => ($toorder, $notechar);
+    my ($notechar, $exact);
+    $notechar= '';
+    $exact= 0;
+    if ($qty =~ s/\=$//) {
+       $exact= 1;
+       $notechar= '=';
+    }
+    if ($qty =~ m!^(\d+)/(\d+)!) {
+       my ($numer,$denom)= ($1,$2);
+       $numer += $denom/2 if !$exact;
+       $qty= ceil($numer / $denom);
+       $exact= 1;
+       $notechar= '~';
+    }
+    $qty =~ m/^\d+$/ or die "$qty ?";
+    $qty++ if !$exact;
+    if ($qty % $bi->{Multiple}) {
+       $qty= floor(($qty + $bi->{Multiple} - 1) / $bi->{Multiple});
+       $notechar= '*';
+    }
+    if ($qty < $bi->{MinOrder}) {
+       $qty= $bi->{MinOrder};
+       $notechar= '>';
+    }
+    ($qty, $notechar);
+}
 
 sub dump_warnerrs () {
     my ($w);