%oceans %commods %clients %commodclasses
%vessels %shotname2damage
&parse_pctb_commodmap %pctb_commodmap @pctb_commodmap
- &get_our_version &check_tsv_line
+ &get_our_version &check_tsv_line &errsan
&pipethrough_prep &pipethrough_run
&pipethrough_run_along &pipethrough_run_finish
&pipethrough_run_gzip &http_useragent &version_core
my (@rawcm, @nocm); # eg $rawcm[0]='fine rum'; $rawcm[1]='fine %c cloth'
my %colour_ordvals; # $colour_ordvals{'c'}{'green'}= '30';
-my %commodclasses; # $commodclasses{'dye'}= '3';
+our %commodclasses; # $commodclasses{'dye'}= '3';
# IMPORTANT
# when extending the format of source-info in a non-backward
@ctx= (sub { push @nocm, lc $_; });
} elsif (m/^commodclasses$/) {
@ctx= (sub {
- die unless m/^\*([-a-z]+)$/;
+ die unless m/^\*([_a-z]+)$/;
$commodclasses{$1}= scalar keys %commodclasses;
});
} elsif (m/^ocean (\w+)$/) {
$c->{Mass}= $1 * ($2 ? 1000 : 1);
} elsif ($prop =~ m/^([1-9]\d*)l$/) {
$c->{Volume}= $1 * 1000;
- } elsif ($prop =~ m/^\*([-a-z]+)$/) {
+ } elsif ($prop =~ m/^\*([_a-z]+)$/) {
$c->{Class}= $1;
die "$1" unless exists $commodclasses{$1};
$ordclassval= 1e7 + $commodclasses{$1} * 1e7;
die "unknown property $prop for $ucname";
}
}
+ $c->{ClassOrdval}= $ordclassval;
if (defined $ordbase && defined $ordval && defined $ordclassval) {
my $ordvalout= $ordbase + $ordval + $ordclassval;
$c->{Ordval}= $ordvalout;
our %check_tsv_done;
+sub errsan ($) {
+ my ($value) = @_;
+ $value =~ s/[^-+\'. A-Za-z0-9]/ sprintf "\\x%02x",ord $& /ge;
+ return "\"$value\"";
+}
+
sub check_tsv_line ($$) {
my ($l, $bad_data_callback) = @_;
my $bad_data= sub { &$bad_data_callback("bad data: line $.: $_[0]"); };
!keys %commods or
defined $commods{$commod} or
- &$bad_data("unknown commodity \`$commod'");
+ &$bad_data("unknown commodity ".errsan($commod));
- $stall =~ m/^\p{IsUpper}|^[0-9]/ or &$bad_data("stall not capitalised");
- !exists $check_tsv_done{$commod,$stall} or &$bad_data("repeated data");
+ $stall =~ m/^\p{IsUpper}|^[0-9]/ or
+ &$bad_data("stall not capitalised ".errsan($stall));
+ !exists $check_tsv_done{$commod,$stall} or
+ &$bad_data("repeated data ".errsan($commod).",".errsan($stall));
$check_tsv_done{$commod,$stall}= 1;
foreach my $i (2..5) {
my $f= $v[$i];
- $f =~ m/^(|0|[1-9][0-9]{0,5}|\>1000)$/ or &$bad_data("bad field $i");
- ($i % 2) or ($f !~ m/\>/) or &$bad_data("> in field $i price");
+ $f =~ m/^(|0|[1-9][0-9]{0,5}|\>1000)$/ or
+ &$bad_data("bad field $i ".errsan($f));
+ ($i % 2) or ($f !~ m/\>/) or
+ &$bad_data("> in field $i price ".errsan($f));
}
foreach my $i (2,4) {