X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=yarrg%2FCommods.pm;h=bce9a8e13b2cb33afd05feb7ada3d2410aa5ea02;hp=c6ed2536399a8e713efce419bf04e3d052678b68;hb=3ece24832da57c70c4ca1c745d6dd79227447322;hpb=e353043ae5bf5a7df54f650c51f00d6c3b862ba9 diff --git a/yarrg/Commods.pm b/yarrg/Commods.pm index c6ed253..bce9a8e 100644 --- a/yarrg/Commods.pm +++ b/yarrg/Commods.pm @@ -40,7 +40,7 @@ BEGIN { %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 @@ -102,7 +102,7 @@ my %colours; # eg $colours{'c'}{'black'}= $sources 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 @@ -137,7 +137,7 @@ sub parse_info1 ($$$) { @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+)$/) { @@ -207,23 +207,27 @@ sub parse_info1 ($$$) { $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; @@ -406,6 +410,12 @@ sub cgipostform ($$$) { 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]"); }; @@ -419,15 +429,19 @@ sub check_tsv_line ($$) { !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) {