Subversion Repositories OpenARM Single-board Computer

Rev

Rev 281 | Rev 313 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
280 agaran 1
#!/usr/bin/perl -w
2
use strict;
293 agaran 3
# $Id: inventory.pl 293 2008-11-18 22:52:14Z agaran $
280 agaran 4
# Thu, 13 Nov 2008 21:06:23 +0100
5
# Maciej 'agaran' Pijanka <agaran@pld-linux.org>
6
# for OpenARM SBC Project
7
# license: gpl v3
8
 
293 agaran 9
 
280 agaran 10
use Getopt::Long qw//;
293 agaran 11
use File::Basename qw/basename/;
280 agaran 12
 
293 agaran 13
my %opts;
280 agaran 14
 
293 agaran 15
$opts{dir} = '.';
16
$opts{verbose} = 1;
280 agaran 17
 
293 agaran 18
my $dirprintoffset = 0;
280 agaran 19
 
293 agaran 20
sub err_printf($@) {
21
        my ($format, @args) = @_;
280 agaran 22
 
293 agaran 23
        printf STDERR "\n-E- ".$format."\n\n", @args;
280 agaran 24
}
25
 
293 agaran 26
sub wrn_printf($@) {
27
        my ($format, @args) = @_;
28
 
29
        printf STDERR "-W- ".$format."\n", @args;
30
}
31
 
32
sub inf_printf($@) {
33
        my ($format, @args) = @_;
34
 
35
        printf STDERR "-I- ".$format."\n", @args;
36
}
37
 
280 agaran 38
sub parse_ifile($) {
293 agaran 39
        my ($filepath) = @_;
280 agaran 40
 
293 agaran 41
        open(IN, $filepath) or return 1;
280 agaran 42
 
293 agaran 43
        my %data;
280 agaran 44
 
293 agaran 45
        while (not eof IN) {
46
                my $line = <IN>;
280 agaran 47
 
293 agaran 48
                chomp $line;
280 agaran 49
 
293 agaran 50
                next if ($line =~ /^[   ]*$/);
51
                next if ($line =~ /^;/);
52
 
53
                last if ($line =~ /^--/);
54
 
55
                if ($line =~ /^([A-Za-z ]+):(.*)$/) {
56
                        my ($name,$value) = ($1,$2);
57
 
58
                        $name =~ s/^[   ]+//;
59
                        $value =~ s/^[  ]+//;
60
 
61
                        $name =~ s/[    ]+$//;
62
                        $value =~ s/[   ]+$//;
63
 
64
                        $name = lc $name;
65
 
66
                        if ($name =~ /^price$/) {
67
                                $value =~ s/[^0-9\.\,]//g;
68
                                if ($value =~ s/^([0-9]+)[,.]([0-9]+)$/$1.$2/) {
69
                                        # printf STDERR "Price %.3f\n", $value;
70
                                        if (!defined($data{price})) {
71
                                                $data{price} = $value;
72
                                        } else {
73
                                                wrn_printf("Duplicated price field in file %s",
74
                                                        substr($filepath, $dirprintoffset));
75
                                        }
76
                                } else {
77
                                        err_printf("Bad price field in file %s",
78
                                                substr($filepath, $dirprintoffset));
79
                                }
80
                        } elsif ($name =~ /^manufacturer$/i) {
81
                                # printf STDERR "Manufacturer %s\n", $value;
82
                                if (!defined($data{manufacturer})) {
83
                                        $data{manufacturer} = $value;
84
                                } else {
85
                                        wrn_printf("Duplicated manufacturer field in file %s",
86
                                                substr($filepath, $dirprintoffset));
87
                                }
88
                        } elsif ($name =~ /^manufacturer part no$/ ) {
89
                                # printf STDERR "ManPartNo %s\n", $value;
90
                                if (!defined($data{manufact_partno})) {
91
                                        $data{manufact_partno} = $value;
92
                                } else {
93
                                        wrn_printf("Duplicated manufacturer part no field in file %s",
94
                                                substr($filepath, $dirprintoffset));
95
                                }
96
                        } elsif ($name =~ /^description$/i) {
97
                                # printf STDERR "Desc %s\n", $value;
98
                                $data{desc} = [] unless defined $data{desc};
99
                                push @{$data{desc}}, $value;
100
                        } elsif ($name =~ /^datasheet$/i) {
101
                                $data{datasheet} = [] unless defined $data{datasheet};
102
                                push @{$data{datasheet}}, $value;
103
                                # printf STDERR "Datasheet %s\n", $value;
104
                        } elsif ($name =~ /^supplier$/i) {
105
                                # printf STDERR "Supplier %s\n", $value;
106
                                if (!defined($data{supplier})) {
107
                                        $data{supplier} = $value;
108
                                } else {
109
                                        wrn_printf("Duplicated supplier field in file %s",
110
                                                substr($filepath, $dirprintoffset));
111
                                }
112
                        } elsif ($name =~ /^order code$/) {
113
                                # printf STDERR "Order Code %s\n", $value;
114
                                if (!defined($data{ordercode})) {
115
                                        $data{ordercode} = $value;
116
                                } else {
117
                                        wrn_printf("Duplicated order code field in file %s",
118
                                                substr($filepath, $dirprintoffset));
119
                                }
120
                                #push @DATA, { $name => $value };
121
                        } elsif ($name =~ /^url .*$/) {
122
                                # printf STDERR "URL %s\n", $value;
123
                        } elsif ($name =~ /^catalog(ue|) page$/) {
124
                                # printf STDERR "Catalogue Page %s\n", $value;
125
                        } else {
126
                                err_printf("Unhandled field %s in file %s", $name,
127
                                        substr($filepath, $dirprintoffset));
128
                        }
129
 
130
                } else {
131
                        wrn_printf("Unparseable line `%s', forgot ; to set it as comment in file %s\n", $line,
132
                                substr($filepath, $dirprintoffset));
133
                }
134
        }
135
        close(IN);
136
 
137
        if (scalar keys %data == 0) {
138
                inf_printf("Skipping file %s because contain no data for me",
139
                        substr($filepath, $dirprintoffset));
140
                return;
141
        }
142
 
143
        unless (defined ($data{price}) && $data{price} != 0) {
144
                wrn_printf("Missing Price in file %s",
145
                        substr($filepath, $dirprintoffset));
146
        }
147
 
148
        unless (defined($data{manufact_partno})) {
149
                inf_printf("Missing Manufacturer Part No in file %s",
150
                        substr($filepath, $dirprintoffset));
151
        }
152
 
153
        unless (defined($data{ordercode})) {
154
                wrn_printf("Missing Order Code in file %s",
155
                        substr($filepath, $dirprintoffset));
156
        }
157
 
158
        use Data::Dumper qw/Dumper/;
159
 
160
        #print Dumper(\%data);
280 agaran 161
}
162
 
293 agaran 163
sub build_ifile_list($$);
164
sub build_ifile_list($$) {
165
        my ($dir,$depth) = @_;
280 agaran 166
 
167
 
293 agaran 168
        if ( -d $dir) {
169
                opendir(DIR, $dir) or return 1;
170
                foreach my $e (readdir(DIR)) {
171
                        my $fe = $dir .'/'. $e;
172
                        if ( -f $fe) {
173
                                # Whoo file we have
174
                                if ($e eq 'information.txt') {
175
                                        # we found an information.txt file
176
                                        parse_ifile($fe);
177
                                } elsif ($e =~ /\.[pP][dD][fF]$/) {
178
                                        # its an pdf file if filename is correct
179
                                } elsif ($e =~ /\.sch$/) {
180
                                } else {
181
#                                       printf STDERR "FILE %s\n", $fe;
182
                                }
183
                        } elsif (-d $fe) { # now its dir...
184
                                if ($e eq '.svn') { # if entry name is equal to svn
185
                                        next; # go to next entry in foreach loop
186
                                }
187
                                next if ($e eq '.' or $e eq '..'); # skip to next if dir entry is . or ..
281 jelle 188
 
293 agaran 189
                                if ($opts{verbose} >= 2+$depth) {
190
                                        printf STDERR "Entering directory %s\n", substr($fe,length($opts{dir})+1);
191
                                }
192
                                build_ifile_list($fe,$depth+1);
193
                        } else {
194
                                # symlink or other myserius beast
195
                        }
196
                }
197
                closedir(DIR);
198
        }
280 agaran 199
}
200
 
293 agaran 201
Getopt::Long::Configure("bundling");
280 agaran 202
 
293 agaran 203
my $result = Getopt::Long::GetOptions (\%opts,
204
        "dir|d=s",
205
        "verbose|v+",
206
);
207
if (!$result) {
208
        printf "Usage: %s [-d directory] [-v]\n",basename($0);
209
        exit;
210
}
211
$opts{dir} =~ s/\/$//;
212
if ($opts{dir} eq '.') {
213
        $dirprintoffset = 2;
214
} else {
215
        # i was thinking about some code which could shorten pathes in few cases but didnt created it yet
216
}
217
 
218
print Data::Dumper::Dumper(\%opts);
219
 
220
build_ifile_list($opts{dir},0);