From 5f543f9395f3a885ee9b751e98d069b9ed54f885 Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Tue, 3 Mar 2009 15:00:08 +0100 Subject: [PATCH] parse-wormedit: declare hardcoded bytes in unpackf template Recognise a new template value '=$N' (where $N is any number) in Parse::Binary::Nested to insert a hardcoded value instead of reading it. This allows object structures of v90 files without type declarations to be returned in the same format as newer versions. Still requires some custom merging of the multiple arrays afterwards, but this may be solved later on. --- Parse/Binary/Nested.pm | 22 +++++++++++++++++++++- parse-wormedit | 9 +++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Parse/Binary/Nested.pm b/Parse/Binary/Nested.pm index 9bac394..872ccaa 100644 --- a/Parse/Binary/Nested.pm +++ b/Parse/Binary/Nested.pm @@ -5,7 +5,7 @@ use warnings; use Carp; -our $VERSION = '1.00'; +our $VERSION = '1.01'; sub new { my ($class, $format) = @_; @@ -26,6 +26,7 @@ sub template { : $count."X[$count]$count/($value)"; } else { + $value =~ s/=\d*//g; # hardcoded values $value =~ s/^C(a)(\d+)/$1 . ($2 + 1)/e; # length prefix } $value; @@ -53,6 +54,10 @@ sub convert { elsif ($template =~ /^(?:[xX]\d*)*$/) { next; # no values } + elsif ($template =~ /=(\d+)?/) { + $res{$field} = $1; + next; + } $res{$field} = shift @$data; } return \%res; @@ -117,6 +122,21 @@ to its length. This behaviour is very similar to C<(C/a@x$length)>, except that it never reads more than the given number of bytes. +=item * + +Hardcoded values can be inserted using C<=$number> values. +This can for example be useful to retain forwards-compatibility: + + rows => ['C', + type => '=1', # nothing read + data => 'S', + ] + + rows => ['C', + type => 'C', + data => 'S', + ] + =back =head1 AUTHOR diff --git a/parse-wormedit b/parse-wormedit index 81c0734..5761a30 100755 --- a/parse-wormedit +++ b/parse-wormedit @@ -283,9 +283,10 @@ sub read { $_->[13] = $_->[15]; # ctf $_->[15] = 'domination'; } for @{ $FORMAT[9] }; # no multifood - push @LEVELFORM, "object$_" => ['C', + push @LEVELFORM, "objects$_" => ['C', + type => "=$_", map {$_ => 'C'} qw(x1 y1 x2 y2) - ] for qw(lines boxes); + ] for 2, 3; } default { die "Unsupported level version $version\n"; @@ -354,8 +355,8 @@ sub read { # add objects until terminator $level->{objects} = []; if ($version <= 91) { - push @{ $level->{objects} }, { %$_, type => 2 } for map { $level->{$_} ? @{ $level->{$_} } : () } qw(objectlines); - push @{ $level->{objects} }, { %$_, type => 3 } for map { $level->{$_} ? @{ $level->{$_} } : () } qw(objectboxes); + ref $_ eq 'ARRAY' and push @{ $level->{objects} }, @$_ + for map { delete $level->{"objects$_"} } 2, 3; $size += 1 + 4 * scalar @{ $level->{objects} }; } else { -- 2.30.0