parse-wormedit: bytes declarable as non-capturing
authorMischa Poslawsky <wormy@shiar.org>
Mon, 2 Mar 2009 19:20:56 +0000 (20:20 +0100)
committerMischa Poslawsky <wormy@shiar.org>
Wed, 4 Mar 2009 14:28:20 +0000 (15:28 +0100)
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
parse-wormedit
t/parser.t

index db5e2080eaec8187b65ae785b42b3a8175ca5a8c..e4cacc3b759e9eda84e26c73fad7cd80b58bf335 100644 (file)
@@ -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;
index 3811863103ea42ea4719a1310eca52e4852b89b1..81c073418c9d1c11f86e956867ec1bba20e9ed9e 100755 (executable)
@@ -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',
                ],
index cebd099291bd59b2c22e67cfb4bc24968f167e5f..5e53315d69f7fa99977e4a5f59c42df051a2ef61 100644 (file)
@@ -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'
+);
+