Rev 281 |
Rev 313 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
#!/usr/bin/perl -w
use strict
;
# $Id: inventory.pl 293 2008-11-18 22:52:14Z agaran $
# Thu, 13 Nov 2008 21:06:23 +0100
# Maciej 'agaran' Pijanka <agaran@pld-linux.org>
# for OpenARM SBC Project
# license: gpl v3
use Getopt
::Long qw//;
use File
::Basename qw/basename/;
my %opts;
$opts{dir
} = '.';
$opts{verbose
} = 1;
my $dirprintoffset = 0;
sub err_printf
($@) {
my ($format, @args) = @_;
printf STDERR "\n-E- ".$format."\n\n", @args;
}
sub wrn_printf
($@) {
my ($format, @args) = @_;
printf STDERR "-W- ".$format."\n", @args;
}
sub inf_printf
($@) {
my ($format, @args) = @_;
printf STDERR "-I- ".$format."\n", @args;
}
sub parse_ifile
($) {
my ($filepath) = @_;
open(IN
, $filepath) or return 1;
my %data;
while (not eof IN
) {
my $line = <IN>;
chomp $line;
next if ($line =~ /^[ ]*$/);
next if ($line =~ /^;/);
last if ($line =~ /^--/);
if ($line =~ /^([A-Za-z ]+):(.*)$/) {
my ($name,$value) = ($1,$2);
$name =~ s/^[ ]+//;
$value =~ s/^[ ]+//;
$name =~ s/[ ]+$//;
$value =~ s/[ ]+$//;
$name = lc $name;
if ($name =~ /^price$/) {
$value =~ s/[^0-9\.\,]//g;
if ($value =~ s/^([0-9]+)[,.]([0-9]+)$/$1.$2/) {
# printf STDERR "Price %.3f\n", $value;
if (!defined($data{price
})) {
$data{price
} = $value;
} else {
wrn_printf
("Duplicated price field in file %s",
substr($filepath, $dirprintoffset));
}
} else {
err_printf
("Bad price field in file %s",
substr($filepath, $dirprintoffset));
}
} elsif ($name =~ /^manufacturer$/i) {
# printf STDERR "Manufacturer %s\n", $value;
if (!defined($data{manufacturer
})) {
$data{manufacturer
} = $value;
} else {
wrn_printf
("Duplicated manufacturer field in file %s",
substr($filepath, $dirprintoffset));
}
} elsif ($name =~ /^manufacturer part no$/ ) {
# printf STDERR "ManPartNo %s\n", $value;
if (!defined($data{manufact_partno
})) {
$data{manufact_partno
} = $value;
} else {
wrn_printf
("Duplicated manufacturer part no field in file %s",
substr($filepath, $dirprintoffset));
}
} elsif ($name =~ /^description$/i) {
# printf STDERR "Desc %s\n", $value;
$data{desc
} = [] unless defined $data{desc
};
push @{$data{desc
}}, $value;
} elsif ($name =~ /^datasheet$/i) {
$data{datasheet
} = [] unless defined $data{datasheet
};
push @{$data{datasheet
}}, $value;
# printf STDERR "Datasheet %s\n", $value;
} elsif ($name =~ /^supplier$/i) {
# printf STDERR "Supplier %s\n", $value;
if (!defined($data{supplier
})) {
$data{supplier
} = $value;
} else {
wrn_printf
("Duplicated supplier field in file %s",
substr($filepath, $dirprintoffset));
}
} elsif ($name =~ /^order code$/) {
# printf STDERR "Order Code %s\n", $value;
if (!defined($data{ordercode
})) {
$data{ordercode
} = $value;
} else {
wrn_printf
("Duplicated order code field in file %s",
substr($filepath, $dirprintoffset));
}
#push @DATA, { $name => $value };
} elsif ($name =~ /^url .*$/) {
# printf STDERR "URL %s\n", $value;
} elsif ($name =~ /^catalog(ue|) page$/) {
# printf STDERR "Catalogue Page %s\n", $value;
} else {
err_printf
("Unhandled field %s in file %s", $name,
substr($filepath, $dirprintoffset));
}
} else {
wrn_printf
("Unparseable line `%s', forgot ; to set it as comment in file %s\n", $line,
substr($filepath, $dirprintoffset));
}
}
close(IN
);
if (scalar keys %data == 0) {
inf_printf
("Skipping file %s because contain no data for me",
substr($filepath, $dirprintoffset));
return;
}
unless (defined ($data{price
}) && $data{price
} != 0) {
wrn_printf
("Missing Price in file %s",
substr($filepath, $dirprintoffset));
}
unless (defined($data{manufact_partno
})) {
inf_printf
("Missing Manufacturer Part No in file %s",
substr($filepath, $dirprintoffset));
}
unless (defined($data{ordercode
})) {
wrn_printf
("Missing Order Code in file %s",
substr($filepath, $dirprintoffset));
}
use Data
::Dumper qw/Dumper/;
#print Dumper(\%data);
}
sub build_ifile_list
($$);
sub build_ifile_list
($$) {
my ($dir,$depth) = @_;
if ( -d
$dir) {
opendir(DIR
, $dir) or return 1;
foreach my $e (readdir(DIR
)) {
my $fe = $dir .'/'. $e;
if ( -f
$fe) {
# Whoo file we have
if ($e eq 'information.txt') {
# we found an information.txt file
parse_ifile
($fe);
} elsif ($e =~ /\.[pP][dD][fF]$/) {
# its an pdf file if filename is correct
} elsif ($e =~ /\.sch$/) {
} else {
# printf STDERR "FILE %s\n", $fe;
}
} elsif (-d
$fe) { # now its dir...
if ($e eq '.svn') { # if entry name is equal to svn
next; # go to next entry in foreach loop
}
next if ($e eq '.' or $e eq '..'); # skip to next if dir entry is . or ..
if ($opts{verbose
} >= 2+$depth) {
printf STDERR "Entering directory %s\n", substr($fe,length($opts{dir
})+1);
}
build_ifile_list
($fe,$depth+1);
} else {
# symlink or other myserius beast
}
}
closedir(DIR
);
}
}
Getopt
::Long::Configure("bundling");
my $result = Getopt
::Long::GetOptions (\%opts,
"dir|d=s",
"verbose|v+",
);
if (!$result) {
printf "Usage: %s [-d directory] [-v]\n",basename
($0);
exit;
}
$opts{dir
} =~ s/\/$//;
if ($opts{dir
} eq '.') {
$dirprintoffset = 2;
} else {
# i was thinking about some code which could shorten pathes in few cases but didnt created it yet
}
print Data
::Dumper::Dumper(\%opts);
build_ifile_list
($opts{dir
},0);