--- deliantra/Deliantra/Deliantra.pm 2006/02/04 23:24:03 1.1 +++ deliantra/Deliantra/Deliantra.pm 2006/02/04 23:54:05 1.2 @@ -48,83 +48,72 @@ } sub read_arch($;$) { - my ($path, $cache) = @_; + my ($path) = @_; - eval { - $cache - && -M "$VARDIR/$path.pst" < -M $path - && Storable::retrieve "$VARDIR/$path.pst" - } or do { - my %arc; - my ($more, $prev); - - open my $fh, "<:raw", $path - or die "$path: $!"; - - my $parse_block; $parse_block = sub { - my %arc = @_; - - while (<$fh>) { - s/\s+$//; - if (/^end$/i) { - last; - } elsif (/^arch (\S+)$/) { - push @{ $arc{inventory} }, $parse_block->(_name => $1); - } elsif (/^lore$/) { - while (<$fh>) { - last if /^endlore\s*$/i; - $arc{lore} .= $_; - } - } elsif (/^msg$/) { - while (<$fh>) { - last if /^endmsg\s*$/i; - $arc{msg} .= $_; - } - } elsif (/^(\S+)\s*(.*)$/) { - $arc{lc $1} = $2; - } elsif (/^\s*($|#)/) { - # - } else { - warn "$path: unparsable line '$_' in arch $arc{_name}"; - } - } + my %arc; + my ($more, $prev); + + open my $fh, "<:raw", $path + or die "$path: $!"; - \%arc - }; + my $parse_block; $parse_block = sub { + my %arc = @_; while (<$fh>) { s/\s+$//; - if (/^more$/i) { - $more = $prev; - } elsif (/^object (\S+)$/i) { - my $name = $1; - my $arc = $parse_block->(_name => $name); - - if ($more) { - $more->{more} = $arc; - } else { - $arc{$name} = $arc; + if (/^end$/i) { + last; + } elsif (/^arch (\S+)$/) { + push @{ $arc{inventory} }, $parse_block->(_name => $1); + } elsif (/^lore$/) { + while (<$fh>) { + last if /^endlore\s*$/i; + $arc{lore} .= $_; } - $prev = $arc; - $more = undef; - } elsif (/^arch (\S+)$/i) { - push @{ $arc{arch} }, $parse_block->(_name => $1); + } elsif (/^msg$/) { + while (<$fh>) { + last if /^endmsg\s*$/i; + $arc{msg} .= $_; + } + } elsif (/^(\S+)\s*(.*)$/) { + $arc{lc $1} = $2; } elsif (/^\s*($|#)/) { # } else { - warn "$path: unparseable top-level line '$_'"; + warn "$path: unparsable line '$_' in arch $arc{_name}"; } } - undef $parse_block; # work around bug in perl not freeing $fh etc. + \%arc + }; - if ($cache) { - Storable::nstore \%arc, "$path.pst"; - utime +(stat $path)[8,9], "$path.pst"; - } + while (<$fh>) { + s/\s+$//; + if (/^more$/i) { + $more = $prev; + } elsif (/^object (\S+)$/i) { + my $name = $1; + my $arc = $parse_block->(_name => $name); - \%arc + if ($more) { + $more->{more} = $arc; + } else { + $arc{$name} = $arc; + } + $prev = $arc; + $more = undef; + } elsif (/^arch (\S+)$/i) { + push @{ $arc{arch} }, $parse_block->(_name => $1); + } elsif (/^\s*($|#)/) { + # + } else { + warn "$path: unparseable top-level line '$_'"; + } } + + undef $parse_block; # work around bug in perl not freeing $fh etc. + + \%arc } sub cfmap_meta($;$) {