2006/07/04(火) [n年前の日記]
#1 [iappli] スクラッチパッドサイズ
ADF中のスクラッチパッドサイズ指定が大きすぎる、という話があったので、適切なサイズを概算・jamファイルを更新するスクリプトを作成。その時々の概算サイズをログに残し、それと比較して、値が大きくなっていたら更新するように。
#!/usr/bin/perl
#
# スクラッチパッド(SP)のサイズ(概算)を求める。
#
# usage : perl getspsize.pl [DIR\HOGE.jam] [DIR2\HOGE.jam]
#
#
# * jam ファイルのパスを与えると、該当 jam の SPsize を書き換える。
# 何も指定がなければ、概算値の表示のみ行う。
#
# * 概算したサイズ値は、'getspsize.log' に記録される。
# 既に記録されたサイズ値と比較して、増えているときだけ更新。
#
# * 概算したサイズ値は、1024 byte 単位で切り上げをした値。
#
#
# ◎ 前提・仮定条件:
#
# * ハイスコア等情報 / 画像データ / サウンドデータ の順でSPに記録。
#
# * ハイスコア・その他の記録は、0x0100 byte 使う。
#
# * 画像データとサウンドデータの間には、0 が 0x010 byte 入る。
#
# * SPの最後には、0 が 0x010 byte 入る。
#
# * 画像データ(.res)は、'data' ディレクトリ内にある。
#
# * サウンドデータ(.res)は、'sound' ディレクトリ以下に
# 「端末別」で、ディレクトリを分けて入ってるものとする。
#
use strict;
# ハイスコアその他の記録に使ってるサイズ
my $etcinfosize = 0x0100;
# 画像データとサウンドデータの間に入る 0x00 のサイズ
my $imgsndsepsize = 0x010;
# 最後に取る 0x00 のサイズ
my $lastnullsize = 0x010;
# 画像データ拡張子
my $imgext = '.res';
# 画像データフォルダ
my $imgdir = 'data';
# サウンドデータ拡張子
my $sndext = '.res';
# サウンドデータフォルダ
my $snddir = 'sound';
# ログファイル
my $logfile = 'getspsize.log';
# ----------------------------------------
print "\n --- SPsize の概算値を求めます ---\n\n";
my $old_spsize = 0;
# 既にログファイルがあるなら読み込んでおく
if ( -f $logfile ) {
open(IN,$logfile) || die "Can't read open $logfile : $!";
my @l = <IN>;
close(IN);
$old_spsize = $l[0];
} else {
print "not found log. ($logfile)\n";
}
# 画像データファイル名の取得
my @img_res_list = ();
opendir(DH, $imgdir) || die "Can't open dir $imgdir : $!";
while ( my $f = readdir DH ) {
next if $f =~ /^\.{1,2}$/;
next unless $f =~ /$imgext$/;
push(@img_res_list, $f) if -f "$imgdir/$f";
}
closedir(DH);
# 画像データファイルの総サイズを取得
my $imgsize = 0;
foreach (@img_res_list) {
# print $_ , "\n";
$imgsize += -s "$imgdir/$_";
}
print "$imgdir/*$imgext\t", $imgsize, " byte ... image .res total size.\n\n";
# サウンドデータファイル名の取得
my %snd_resdir_size_list = ();
read_dir_snd_res($snddir, $sndext);
foreach ( sort keys(%snd_resdir_size_list) ) {
print $_, "\t", $snd_resdir_size_list{$_}, " byte\n";
}
print "\n";
# サウンドデータサイズをソート
my @keys = sort {
$snd_resdir_size_list{$b} <=> $snd_resdir_size_list{$a}
} keys %snd_resdir_size_list;
# サウンドデータ最大値を取得
my $max_snddir = $keys[0];
my $max_sndsize = $snd_resdir_size_list{$max_snddir};
print "MAX\n", $max_snddir, "\t", $max_sndsize, " byte\n\n";
# SPsize を計算
my $true_spsize = $imgsize + $max_sndsize + $etcinfosize + $imgsndsepsize + $lastnullsize;
my $new_spsize = ((int ( $true_spsize / 1024 )) + 1) * 1024;
printf("OLD SPsize = %8d (0x%08X)\n", $old_spsize, $old_spsize );
printf("NEW SPsize(true) = %8d (0x%08X)\n", $true_spsize, $true_spsize );
printf("NEW SPsize = %8d (0x%08X)\n", $new_spsize, $new_spsize);
print "\n";
if ( $new_spsize > $old_spsize ) {
# 新SPsize のほうが値が大きい。ログを更新。
open(OUT,">$logfile") || die "Can't write open $logfile : $!";
print OUT $new_spsize;
close(OUT);
print "log update. ( NEW SPsize > OLD SPsize)\n\n";
# jam ファイル更新
foreach my $jamfile (@ARGV) {
if ( -f $jamfile ) {
print "found $jamfile\n";
# jam ファイル読み込み
my @l = ();
open(IN,$jamfile) || die "Can't read open $jamfile : $!";
while(<IN>) {
chomp;
push(@l,$_);
}
close(IN);
# jam ファイル更新
open(OUT,">$jamfile") || die "Can't write oprn $jamfile : $!";
foreach(@l) {
if ( /SPsize = / ) {
$_ = "SPsize = ". $new_spsize;
}
print OUT $_, "\n";
}
close(OUT);
print "update $jamfile\n\n";
}
}
} else {
# 更新無し。
print "not update. ( NEW SPsize <= OLD SPsize)\n";
}
exit;
# ----------------------------------------
# サウンドデータディレクトリを辿って .res があればサイズを取得・記録
sub read_dir_snd_res {
my($dirname, $extname) = @_;
my @list = ();
my @flist = ();
# ディレクトリ中のファイル名 or ディレクトリ名の一覧を取得
opendir(DH, $dirname) || die "Can't open dir $snddir : $!";
@flist = readdir DH;
closedir(DH);
foreach my $f (@flist) {
next if $f =~ /^\.{1,2}$/;
if ( $f =~ /$extname$/ && -f "$dirname/$f") {
# データファイルを見つけたので記録
push(@list, $f);
} elsif ( -d "$dirname/$f" ) {
# ディレクトリを見つけたので辿る
read_dir_snd_res("$dirname/$f", $extname);
}
}
# .res があったらディレクトリ中の総サイズを求めてハッシュに記録
unless ( $#list < 0 ) {
my $size = 0;
foreach (@list) {
$size += -s "$dirname/$_";
}
$snd_resdir_size_list{$dirname} = $size;
}
}
◎ 画像の追加・差し替えが頻繁にあったものだから :
その都度 SPsize を求めなおす・指定し直すのが面倒で。
また、最初の頃は、最終的にどの程度画像・サウンドをSPに入れることになるのか、まったく見当もつかなくて。
さらに、DoJa 3.0 の PDF を読むと、「後からSPsizeを増やす分には構わない」「減らすのはマズイです」と書いてあったりもして。
てなモロモロがあったので、「最大値を入れておけば問題は起きないだろう」と安易に指定しちゃってたという。…早い段階からこういうスクリプトを作っておけば良かったのだな。失敗した。
また、最初の頃は、最終的にどの程度画像・サウンドをSPに入れることになるのか、まったく見当もつかなくて。
さらに、DoJa 3.0 の PDF を読むと、「後からSPsizeを増やす分には構わない」「減らすのはマズイです」と書いてあったりもして。
てなモロモロがあったので、「最大値を入れておけば問題は起きないだろう」と安易に指定しちゃってたという。…早い段階からこういうスクリプトを作っておけば良かったのだな。失敗した。
◎ 全然関係ないけど Perl って :
printf() が使えたのだな。知らなかった。…アレ? Perl は元々あったんだっけか。何かの言語は無かったような記憶が…。
[ ツッコむ ]
以上です。