Subversion Repositories OpenARM Single-board Computer

Rev

Rev 281 | Rev 318 | 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);