#!/usr/local/bin/perl
# ▼ 設定諸々
$logfile     = 'log.txt';
$enumfile    = 'enum.txt';
$includefile = 'include.txt';
$reservfile  = '/tmp_mnt/hosts/srd038J/DISK08/export/project_forest/data/shape/DMA_MAKE/SUBMENU/MAP/map_pos_list.c';
# ▲ 設定ここまで

if ($ARGV[0]) {
    @log     = ReadFile($logfile);
    @include = ReadFile($includefile);
    @enum    = ReadFile($enumfile);
    @reserv  = ReadFile($reservfile);
    
    $time = &FormatDate();

       
    foreach (@ARGV) {
	&edit_file($_);
	&make_enum_list();
	&make_include_list();
	&make_resv_list($_);
    } 

    if (@templog[0]) {
	unshift @templog, "▼ $timeに追加\n";
	push    @templog, "▲ ここまで前回の追加\n";
    }

    push @log, @templog;

    &WriteFile($enumfile, @enum);
    print "\033[32m$enumfile\033[mを作成しました\n";  
    &WriteFile($includefile, @include);
    print "\033[32m$includefile\033[mを作成しました\n";  
    &WriteFile($logfile, @log);
    print "\033[32m$logfile\033[mを作成しました\n";  
    &WriteFile($reservfile, @reserv);
    print "\033[32m$reservfile\033[mを作成しました\n";  
} else {
    print("[file] : 変換元となる .ffo ファイル\n");
}
exit(1);
#==============================================================================
#  RESV用ファイルの作成  
#==============================================================================
sub make_resv_list
{
    my ($file) = @_;
   
    my @base = ReadFile($file);
    
    my $max = 4; #いらないデータ行
    if ($base[0] =~ m/FFI DATA Ver/) {
	$max = 6;
    }
    
    @printresv = ('{255,255,255}','{255,255,255}','{255,255,255}');
    my $resvcount = 0;
    my $count = 0;
    my $cellcount = 0;
    my $z_count = 0;
    foreach (@base) {
	chomp;
	if ($count < $max) {
	    # 何もしない
	} else {
	    # RESV000以外をRESV000に変換
	    if ($_ =~ /RESV/) {
		my $map = $_;
		$map =~ s/RESV//;
		$map =~ s/,//;
		my $test = sprintf("%3d",$map);
		my $x = sprintf("%3d", $cellcount);
		my $z = sprintf("%3d", $z_count);
		$printresv[$resvcount++] = "\{$x,$z,$test\}";
	    }
	    if ($cellcount == 0) {
		$cellcount++;
	    } elsif ($cellcount == 15) {
		$cellcount = 0;
		$z_count++;
	    } else {	
		$cellcount++;
	    }
	    
	}
	$count++;
    }

    my $printenum = sprintf("%20s", $enum);
    
    my $printresv = join(',', @printresv);
    $printresv = "\t\{$printenum, \{$printresv\}\},\n";
   
    my $writeflag = 1;
    
    foreach (@reserv) {
	if (/$enum/) {
	    $_ = $printresv;
	    $writeflag = 0;
	}
    }

    if ($writeflag) {
	push @reserv,  $printresv;
    }
}
#==============================================================================
#  Cファイル作成
#==============================================================================
sub edit_file
{
    my ($file) = @_;

    my @base    = ReadFile($file);
    
    my $max = 4; #いらないデータ行
    if ($base[0] =~ m/FFI DATA Ver/) {
	$max = 6;
    }

    $file =~ s/\_0\.ffo//;
    $file =~ s/\.ffo//;

    $file =~ s/FFO\///;
    $file =~ s/grd/grd_s/;

    $enum = $file;
    $enum =~ tr/a-z/A-Z/;
    $enum = "FG_$enum\_0\_e";
    $cfile = "C/$file\_0.c";

     
    $head = "{ $enum,\n\t{\n";
    $foot = "\t}\n},\n";
    
    my $write1;
    my $write2;
   
    my $cellcount = 0;
    my $count = 0;
  
    foreach (@base) {
	chomp;
	if ($count < $max) {
	    # 何もしない
	} else {
	    # RESV000以外をRESV000に変換
	    if ($_ =~ /RESV/) {
		$_ = "RESV000,";
	    }
	    if ($cellcount == 0) {
		$write1 .= "\t$_";
		$cellcount++;
	    } elsif ($cellcount == 15) {
		$write1 .= "$_\n";
		$cellcount = 0;
	    } else {	
		$write1 .= "$_";
		$cellcount++;
	    }
	    
	}
	$count++;
    }

    my $write = "$head$write1$foot";
     

    &WriteFile($cfile, $write);
    print "\033[32m$cfile\033[mを作成しました\n";
}
#==============================================================================
#  enumlistの作成 loglistの作成
#==============================================================================
sub make_enum_list
{
    my $writeflag = 1;
    
    foreach (@enum) {
	if (/$enum/) {
	    $writeflag = 0;
	}
    }
    my $num = sprintf("%03d", $#enum+1);

    if ($writeflag) {
	push @enum, "\t$enum,\t/* GRD $num */\n";
	push @templog, "GRD$num番目に $enum で $cfile を作成\n";
    }
}
#==============================================================================
#  includelistの作成
#==============================================================================
sub make_include_list
{
    my $writeflag = 1;
    
    foreach (@include) {
	if (/$cfile/) {
	    $writeflag = 0;
	}
    }
    my $num = sprintf("%03d", $#include+1);
	
    if ($writeflag) {
	push @include, "#include \"./FG/$cfile\"\t/* GRD $num */\n";
    }
    
}

#==============================================================================
#  デバッグメッセージ
#==============================================================================
sub Debug
{ 
    print "#=============================================#\n";
    print "# Debug Message                               #\n";
    print "#=============================================#\n";
    print @_;
    exit(0);
}
#==============================================================================
#  エラーメッセージの出力、エラー終了
#==============================================================================
sub PrintError
{ 
    print @_;
    exit(0);
}
#------------------------------------------------------------------------------
#  ファイルからデータを読み込み変数に格納する
#  出力 @lines   : 一行づつ格納した配列
#------------------------------------------------------------------------------
sub ReadFile
{
    local(@lines);    
    
    open(FILE, "<@_") || &PrintError("@_の読み込みに失敗しました。\n");
    @lines = <FILE>;
    close(FILE);
    return @lines;
}
#------------------------------------------------------------------------------
#  ファイルにデータを書き込む
#------------------------------------------------------------------------------
sub WriteFile
{
    local($file, @lines) = @_; 

    open(FILE, "+>$file") || &PrintError("$fileへの書き込みができません。");
    print FILE @lines;
    close(FILE);
}
#==============================================================================
#  ◆ 時間を整形
#     ● 入力  $time : 整形したい時間 （1970年からの秒）
#     ○ 出力  $timefmt形式で取得した時間を返す（初期設定参照）
#==============================================================================
##  初期設定変数
sub FormatDate
{
    $timefmt  = "year/month/date ( day ) hour:min:sec";
    @monthfmt = ("1","2","3","4","5","6","7","8","9","10","11","12");
    @dayfmt   = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
    my($sec, $min, $hour, $date, $month, $year, $day) = localtime(time);
    my($rettime) = $timefmt;

    $rettime =~ s/year/$year += 1900/eg;
    $rettime =~ s/month/$monthfmt[$month]/g;
    $rettime =~ s/date/$date/g;
    $rettime =~ s/day/$dayfmt[$day]/g;
    $rettime =~ s/hour/sprintf("%02d", $hour)/eg;
    $rettime =~ s/min/sprintf("%02d", $min)/eg;
    $rettime =~ s/sec/sprintf("%02d", $sec)/eg;
 
    return $rettime;
}
