rcsを使う(その4)

アニメ『終わりのセラフ』(2015)

吸血鬼アニメです。敵対する立場になっても互いの友情は変わらない。友情と立場のジレンマが見てて辛いのですが、面白いところでもあります。日本帝鬼軍側の女子キャラはすごく可愛いのですが、吸血鬼勢を見ると美男子で女性向けなんだろうかとも思えます。両方に受けるようにしてるのでしょうか。

rcsの管理ファイルを解析して、rcs log表示ができるようにスクリプトを変更してみます。
変更前スクリプト。

takk@deb9:~/tmp$ cat -n my-rcs.pl
     1	open(IN,"<RCS/$ARGV[0],v");
     2	while(<IN>){
     3		chomp;
     4		if(/^head\t(\d+\.\d+);/){
     5			$head = $1;
     6			next;
     7		}
     8		if(/^(\d+\.\d+)$/){
     9			$rev = $1;
    10			next;
    11		}
    12		if(/^(date\t\d\d\d\d\..*)$/){
    13			$date = $1;
    14			if($rev eq $head){
    15				print "$date\n";
    16			}
    17		}
    18	
    19	}
    20	close(IN);
takk@deb9:~/tmp$ 

すぐにprintせずに、ハッシュ変数に格納してから後でsplitで取り出すように修正。普通に使われる文字を区切り文字にしてしまわないように、特殊な文字列(:SEP:)を決めておいて、それをで区切り文字列とします。

    12		if(/^(date\t\d\d\d\d\..*)$/){
    13			$date = $1;
    14			$hist{$rev} .= ":SEP:" . $date;
    15			next;
    16		}

logの部分は、複数行あるので、状態変数を使って処理します。

    17		if(/^log$/){
    18			$sts = "log-start";	
    19			next;
    20		}
    21		if($sts eq "log-start"){
    22			if(/^\@/){
    23				s/^\@//;	
    24				$hist{$rev} .= ":SEP:" . $_;
    25				$sts = "log";	
    26			}
    27			next;
    28		}
    29		if($sts eq "log"){
    30			if(/\@$/){
    31				s/\@$//;	
    32				$hist{$rev} .= $_ . ":SEP:";
    33				$sts = "";	
    34				next;
    35			}
    36			$hist{$rev} .= $_;
    37		}

あとは、これに全ハッシュをソートして一つずつsplitする処理をすればできあがり。

使ってみます。

takk@deb9:~/tmp$ perl my-rcs.pl test.c
----------------------------
revision 1.1
date	2018.09.12.11.49.34;	author takk;	state Exp;
Initial revision
----------------------------
revision 1.2
date	2018.09.12.11.58.02;	author takk;	state Exp;
2nd Check in
----------------------------
revision 1.3
date	2018.09.13.11.00.44;	author takk;	state Exp;
TEST
=============================================================================
takk@deb9:~/tmp$ 

ん~。revisionがさかさまに表示している気がしますが。まあいいか。

修正後の全ソースです。

     1	open(IN,"<RCS/$ARGV[0],v");
     2	while(<IN>){
     3		chomp;
     4		if(/^head\t(\d+\.\d+);/){
     5			$head = $1;
     6			next;
     7		}
     8		if(/^(\d+\.\d+)$/){
     9			$rev = $1;
    10			next;
    11		}
    12		if(/^(date\t\d\d\d\d\..*)$/){
    13			$date = $1;
    14			$hist{$rev} .= ":SEP:" . $date;
    15			next;
    16		}
    17		if(/^log$/){
    18			$sts = "log-start";	
    19			next;
    20		}
    21		if($sts eq "log-start"){
    22			if(/^\@/){
    23				s/^\@//;	
    24				$hist{$rev} .= ":SEP:" . $_;
    25				$sts = "log";	
    26			}
    27			next;
    28		}
    29		if($sts eq "log"){
    30			if(/\@$/){
    31				s/\@$//;	
    32				$hist{$rev} .= $_ . ":SEP:";
    33				$sts = "";	
    34				next;
    35			}
    36			$hist{$rev} .= $_;
    37		}
    38	}
    39	close(IN);
    40	
    41	@all = sort keys %hist;
    42	foreach(@all){
    43		my $rev = $_;
    44		my $line = $hist{$rev};
    45		my ($tmp,$date,$log) = split /:SEP:/,$line;
    46	
    47		print "----------------------------\n";
    48	
    49		print"revision $rev\n";
    50		print"$date\n";
    51		print"$log\n";
    52	}
    53	print"=============================================================================\n";
    54	
    55	

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA