From 42fa759f7b4b8b71be1048e7da1870da7db17890 Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Mon, 2 Mar 2009 20:20:56 +0100 Subject: [PATCH] parse-wormedit: bytes declarable as non-capturing Parse::Binary::Nested format values containing only x/X (ie ignored) are detected and skipped during conversion. This allows for exact specifications instead of having to append to previous (defined) elements. --- Parse/Binary/Nested.pm | 3 +++ parse-wormedit | 17 +++++++++-------- t/parser.t | 10 +++++++++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Parse/Binary/Nested.pm b/Parse/Binary/Nested.pm index db5e208..e4cacc3 100644 --- a/Parse/Binary/Nested.pm +++ b/Parse/Binary/Nested.pm @@ -50,6 +50,9 @@ sub convert { elsif ($template =~ /^Ca/) { $data->[0] = unpack 'C/a', $data->[0]; } + elsif ($template =~ /^(?:[xX]\d*)*$/) { + next; # no values + } $res{$field} = shift @$data; } return \%res; diff --git a/parse-wormedit b/parse-wormedit index 3811863..81c0734 100755 --- a/parse-wormedit +++ b/parse-wormedit @@ -50,7 +50,8 @@ my @FORMAT = ( multifood => 'C', timematch => 'C', race => 'C', - ctf => 'Cx', + ctf => 'C', + reserved => 'x', ], ], sprite => ['8C', @@ -59,7 +60,8 @@ my @FORMAT = ( finish => [1, type => 's', message => 'Ca255', - code => 'Ca255x256', + code => 'Ca255', + reserved=> 'x256', ], hiname => 'a3', levels => ['*', # levelcount->total actually @@ -130,12 +132,11 @@ sub read { given ($fileversion) { when (153) { } # current @FORMAT $FORMAT[7] = 'Ca64'; # no reserved space after description - $FORMAT[15]->[-1] = 'Ca255'; # enddata + splice @{ $FORMAT[15] }, -2; # finish reserve $FORMAT[-1]->[-1]->[0] = '32C'; # less objects - when ($version == 96) { - ref $_ and $_->[-1] = 'C' for @{ $FORMAT[11] }; # 9 moderefs - } - ref $_ and pop @$_ for @{ $FORMAT[11] }; # only 8 moderefs + ref $_ and pop @$_ for @{ $FORMAT[11] }; # 9 moderefs + when ($version == 96) { } + ref $_ and pop @$_ for @{ $FORMAT[11] }; # only 8 moderefs (no ctf) splice @FORMAT, 6, 2 if $version <= 94; # earlier version without description when (95) { } splice @{ $FORMAT[7] }, 4, 2; # no race @@ -216,7 +217,7 @@ sub read { ) } [qw/single peaworm tron deathmatch foodmatch multifood timematch race ctf/] ], - theanswer => 'C', # 42 + theanswer => 'x', # 42 sprite => ['C', line => 'B8', ], diff --git a/t/parser.t b/t/parser.t index cebd099..5e53315 100644 --- a/t/parser.t +++ b/t/parser.t @@ -6,7 +6,7 @@ use warnings; use Test::More; use Data::Dumper; -plan tests => 5; +plan tests => 6; use_ok('Parse::Binary::Nested'); @@ -31,3 +31,11 @@ is_deeply( 'length string' ); +is_deeply( + Parse::Binary::Nested->new( + [ ignoreme => 'x2X', value => 'xC' ] + )->unpackf("\0\1\2"), + { value => 2 }, + 'empty values' +); + -- 2.30.0