%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+)$/) {
$commods{$ucname}{Srcs} .= $ss;
my $c= $commods{$ucname};
$c->{Volume}= 1000;
+ $c->{Flags}= '';
my ($ordval, $ordclassval);
foreach my $prop (defined $props ? split /\s+/, $props : ()) {
if ($prop =~ m/^([1-9]\d*)(k?)g$/) {
$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;
} elsif ($prop =~ m/^\@(\d+\+?)$/) {
$ordval= $1;
$ordval =~ s/^(\d+)\+$/ $1 + $lnoix * 10 /e;
+ } elsif ($prop =~ m/^\!([a-z]+)$/) {
+ $c->{Flags} .= $1;
} else {
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]"); };
chomp($l) or &$bad_data('missing end-of-line');
- $l !~ m/\P{IsPrint}/ or &$bad_data('nonprinting char(s)');
+ $l =~ m/[\t [:graph:]]/ or &$bad_data('nonprinting char(s) '.sprintf "%#x", ord $&);
my @v= split /\t/, $l, -1;
@v==6 or &$bad_data('wrong number of fields');
+ $v[1] =~ s/^\s+//; $v[1] =~ s/\s+$//; # ooo don't check :-(
my ($commod,$stall) = @v;
!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{IsAlnum}/ or
+ &$bad_data("stall does not start with alphanumeric ".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) {