diff -u -r ../freepwing-1.5.org/src/BaseWord.pm ./src/BaseWord.pm --- ../freepwing-1.5.org/src/BaseWord.pm 2008-06-07 13:04:50.000000000 +0900 +++ ./src/BaseWord.pm 2008-10-15 21:44:47.140625000 +0900 @@ -269,7 +269,7 @@ # 単語エントリをファイルへ書き込む。 # if (!$self->{'handle'} - ->printf("%s\t%08x\t%s\t%08x\t%s\n", $fixed_word, $heading_position, + ->printf("%s\t%010x\t%s\t%010x\t%s\n", $fixed_word, $heading_position, $heading_file_name, $text_position, $text_file_name)) { $self->{'error_message'} = "failed to write the file, $ERRNO: " . $self->{'file_name'}; @@ -299,7 +299,7 @@ if ($katakana_flag) { $fixed_word = pack("C*", @unpacked_fixed_word); if (!$self->{'handle'} - ->printf("%s\t%08x\t%s\t%08x\t%s\n", $fixed_word, + ->printf("%s\t%010x\t%s\t%010x\t%s\n", $fixed_word, $heading_position, $heading_file_name, $text_position, $text_file_name)) { $self->{'error_message'} = diff -u -r ../freepwing-1.5.org/src/Link.pm ./src/Link.pm --- ../freepwing-1.5.org/src/Link.pm 2008-06-07 13:04:50.000000000 +0900 +++ ./src/Link.pm 2008-10-23 19:14:21.546875000 +0900 @@ -25,6 +25,9 @@ use strict; use integer; +use DB_File; +use Fcntl; + use vars qw(@ISA @EXPORT @EXPORT_OK @@ -66,6 +69,12 @@ # 出力ファイル名 'output_file_name' => '', + # タグの情報を収納するファイル名 + 'tag_file_name' => '', + + # タグの情報を収納するハッシュ + 'tag_table' => {}, + # 連結する各ファイルのオフセット 'offset_table' => {}, @@ -107,6 +116,10 @@ } binmode($self->{'output_handle'}); + $self->{'tag_file_name'} = "$output_file_name.tag"; + tie(%{$self->{'tag_table'}}, 'DB_File', $self->{'tag_file_name'}, + O_CREAT | O_RDWR | O_TRUNC, 0644, $DB_HASH); + return 1; } @@ -139,7 +152,6 @@ # # input_file_trios に登録された個々のタグファイルを処理する。 # - my $tag_table = {}; my $file_trio; foreach $file_trio (@{$self->{'input_file_trios'}}) { my ($file_name, $reference_file_name, $tag_file_name) = @{$file_trio}; @@ -171,13 +183,13 @@ } chomp $line; @line_fields = split(/\t/, $line); - if (defined($tag_table->{$line_fields[0]})) { + if (defined($self->{'tag_table'}->{$line_fields[0]})) { $self->{'error_message'} = "redefined tag, $line_fields[0]: line $NR, $tag_file_name"; $self->close_internal(); return 0; } - $tag_table->{$line_fields[0]} = [hex($line_fields[1]), $file_name]; + $self->{'tag_table'}->{$line_fields[0]} = $line_fields[1]."\t".$file_name; } # @@ -241,15 +253,15 @@ $target_position = hex($line_fields[2]); $target_file_name = $line_fields[3]; } elsif ($line_fields[0] eq 'tag') { - if (!defined($tag_table->{$line_fields[2]})) { + if (!defined($self->{'tag_table'}->{$line_fields[2]})) { $self->{'error_message'} = "unknown tag name, $line_fields[2]: line $NR, $reference_file_name"; $self->close_internal(); return 0; } $reference_type = $tag_reference; $source_position = hex($line_fields[1]); - $target_position = $tag_table->{$line_fields[2]}->[0]; - $target_file_name = $tag_table->{$line_fields[2]}->[1]; + ($target_position, $target_file_name) = split(/\t/, $self->{'tag_table'}->{$line_fields[2]}); + $target_position = hex($target_position); } else { $self->{'error_message'} = "invalid line: line $NR, $reference_file_name"; @@ -286,10 +298,10 @@ $self->{'error_message'} = "failed to seek or write the file, $ERRNO: " . $self->{'output_file_name'}; - $handle->close(); - $self->close_internal(); - return 0; - } + $handle->close(); + $self->close_internal(); + return 0; + } # $buffer_position += length($buffer); $buffer = ''; } @@ -430,6 +442,9 @@ if ($self->{'output_handle'}->fileno()) { $self->{'output_handle'}->close(); } + + untie($self->{'tag_table'}); + unlink($self->{'tag_file_name'}); } # diff -u -r ../freepwing-1.5.org/src/Reference.pm ./src/Reference.pm --- ../freepwing-1.5.org/src/Reference.pm 2008-06-07 13:04:50.000000000 +0900 +++ ./src/Reference.pm 2008-10-15 21:44:47.156250000 +0900 @@ -141,7 +141,7 @@ my ($source_position, $target_position, $target_file_name) = @ARG; - if (!$self->{'handle'}->printf("block\t%08x\t%08x\t%s\n", + if (!$self->{'handle'}->printf("block\t%010x\t%010x\t%s\n", $source_position, $target_position, $target_file_name)) { $self->{'error_message'} = @@ -174,7 +174,7 @@ my ($source_position, $target_position, $target_file_name) = @ARG; - if (!$self->{'handle'}->printf("position\t%08x\t%08x\t%s\n", + if (!$self->{'handle'}->printf("position\t%010x\t%010x\t%s\n", $source_position, $target_position, $target_file_name)) { $self->{'error_message'} = @@ -203,7 +203,7 @@ my $self = shift; my ($source_position, $target_tag) = @ARG; - if (!$self->{'handle'}->printf("tag\t%08x\t%s\n", $source_position, + if (!$self->{'handle'}->printf("tag\t%010x\t%s\n", $source_position, $target_tag)) { $self->{'error_message'} = "failed to write the file, $ERRNO: " . $self->{'file_name'}; diff -u -r ../freepwing-1.5.org/src/Sort.pm.in ./src/Sort.pm.in --- ../freepwing-1.5.org/src/Sort.pm.in 2008-06-07 13:04:50.000000000 +0900 +++ ./src/Sort.pm.in 2008-10-15 21:44:47.171875000 +0900 @@ -260,7 +260,7 @@ $text_file_name) = @ARG; if (!$self->{'handle'} - ->printf("%s\t%08x\t%s\t%08x\t%s\n", $word, $heading_position, + ->printf("%s\t%010x\t%s\t%010x\t%s\n", $word, $heading_position, $heading_file_name, $text_position, $text_file_name)) { $self->{'error_message'} = "failed to write the file, $ERRNO: " . $self->{'file_name'}; diff -u -r ../freepwing-1.5.org/src/Tag.pm ./src/Tag.pm --- ../freepwing-1.5.org/src/Tag.pm 2008-06-07 13:04:50.000000000 +0900 +++ ./src/Tag.pm 2008-10-15 21:44:47.187500000 +0900 @@ -144,7 +144,7 @@ $self->close_internal(); return 0; } - if (!$self->{'handle'}->printf("\%s\t%08x\n", $tag_name, $position)) { + if (!$self->{'handle'}->printf("\%s\t%010x\n", $tag_name, $position)) { $self->{'error_message'} = "failed to write the file, $ERRNO: " . $self->{'file_name'}; $self->close_internal();