#!/usr/local/bin/perl

;# 画像一体型ＳＳＩ式グラフィックカウンタ with LOCK
;# (c)rescue.ne.jp

# index.html(ホームページ)にカウンタを表示させる例
#  <別段理由がない場合はこの構成で施工すれば下記初期設定を全くいじらずに済みます>
#
#    |                    ( )内はパーミッション
#    |-- index.html
#    |      あなたは<!--#exec cmd="./xxx/gdcount.pl"-->番目の訪問者です.
#    |      本日は<!--#exec cmd="cat ./xxx/day.dat"-->カウントです.
#    |      昨日は<!--#exec cmd="cat ./xxx/kinou.dat"-->カウントありました.
#    |
#    |-- xxx/ (777)
#    |    |
#    |    |-- count.dat <累計カウント数>
#    |    |-- day.dat <日計カウント数>
#    |    |-- kinou.dat <昨日のカウント数>
#    |    |-- date.dat <今日の日付> *月15日なら'15'
#    |    |-- fly <画像合成インターフェース> (755)
#    |    |-- gdcount.pl (755) <実行スクリプト>
#    |    |
#    |    |   以下3ファイルは用意する必要はありません！
#    |    |-- fly.$$ <これは画像合成中間ファイルで、自動生成/削除される>
#    |    |-- count.lock <これはロックファイル(使用中の看板)で、自動生成/削除される>
#    |    |-- temp.gif <これは表示画像で、自動生成される>
#    |
#    |-- images/
#         |
#         |   以下は画像合成に利用する数字画像！
#         |-- 0.gif
#         |-- 1.gif
#         |-- 2.gif から 8.gif
#         |-- 9.gif
#
# 特定のディレクトリ(cgi-binやcgi-local等)にしかCGIスクリプトを施工できない
# 特別のサーバの場合は、説明に従って慎重に位置設定をしてください。この位置設定の
# ミスで動作不良になる事例が殆どです。

#--初期設定--#
#
# 注意！以下のパス設定はＳＳＩ記述するindex.htmlから見た位置関係を指定します.
# (シェルテストを行う場合は、gdcount.plから見た位置関係に設定し直さなければなりません.)
# (*)印のファイルは必ずパーミッションが777のディレクトリ内に施工します.

#ロックファイル (*)
$lockfile ="./xxx/count.lock"; #LOCK#

#累計カウント数ファイル (*)
$file     ="./xxx/count.dat";

#日計カウント数ファイル (*)
$file_day ="./xxx/day.dat";

#本日の日(1から31) (*)
$file_dmy ="./xxx/date.dat";

#昨日のカウント数ファイル (*)
$file_reg ="./xxx/kinou.dat";

#画像合成インターフェース
$flyprog = "./xxx/fly";

#画像合成中間ファイル (*)
$infile = "./xxx/fly.$$";

#表示画像 (*)
$outfile = "./xxx/temp.gif";

#合成元画像ファイル
$digit_dir = "./images";

#合成元画像１つのサイズ(x:幅 y:高さ) 単位:ピクセル
$width = "24"; $height = "28";

#表示桁数(カウント数1234の場合に6桁に設定すると001234となる)
$wd = 8;

#表示画像を透過ＧＩＦにする (0:しない 1:する)
$transparent = 0;

#透過ＧＩＦにする場合に透過させる色(R,G,B)
$transparent_color = '0,0,0';

#表示画像をインタレース表示にする (0:しない 1:する)
$interlace = 1;

#--------------------------------------------------------------------------------------
# symlink()が利用できない一部のサーバではロック機構が機能せず、常にBUSYと表示されます.
# その場合はスクリプト中の #LOCK# の付いている行を全て削除して使用してください.
#--------------------------------------------------------------------------------------

&file_lock; #LOCK#
&main;
unlink($lockfile); #LOCK#
exit;

sub main {

	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

	if (!open(DATA,"$file_dmy")) { &error(1); }
	$_ = <DATA>;
	close(DATA);

	if ($_ != $mday) { ;&countreg; }
	&countup;
}

sub file_lock { #LOCK#

	local($retry) = 3; #LOCK#
	while (!symlink(".", $lockfile)) { #LOCK#
		if (--$retry <= 0) { print "BUSY"; unlink($lockfile); exit; } #LOCK#
		sleep(1); #LOCK#
	} #LOCK#
} #LOCK#

sub countreg {

	if (!open(DATA,"$file_day")) { &error(2); }
	$count2 = <DATA>;
	close(DATA);

	if (!open(DATA,">$file_day")) { &error(3); }
	print DATA "0";
	close(DATA);

	if (!open(DATA,"$file")) { &error(4); }
	$count = <DATA>;
	close(DATA);

	if (!open(DATA,">$file_reg")) { &error(5); }
	print DATA "$count2";
	close(DATA);

	if (!open(DATA,">$file_dmy")) { &error(6); }
	print DATA "$mday";
	close(DATA);
}

sub countup {

	if (!open(DATA,"$file")) { &error(7); }
	$count = <DATA>; $count++;
	close(DATA);

	if (!open(DATA,">$file")) { &error(8); }
	print DATA "$count";
	close(DATA);

	if (!open(DATA,"$file_day")) { &error(9); }
	$count2 = <DATA>; $count2++;
	close(DATA);

	if (!open(DATA,">$file_day")) { &error(10); }
	print DATA "$count2";
	close(DATA);

	$cl = length($count);
	if ($cl < $wd) {

		$zero = '0' x ($wd - $cl);
		$count = "$zero$count";
	}

	$xxx = $count;

	$num = $length = length($count);
	while ($num > 0) {

		$CHAR{$num} = chop($count);
		$num--;
	}

	$img_width = ($width * $length);
	$img_height = $height;

	open(FLY,"> $infile");

	print FLY "new\n";
	print FLY "size $img_width,$img_height\n";

	$insert_width = $insert_height = 0;
	$insert_frame = 0;

	while ($insert_frame < 0) {

		$current_width = ($img_width - $insert_frame);
		$current_height = ($img_height - $insert_frame);
		print FLY "line 0,$insert_frame,$img_width,$insert_frame\n";
		print FLY "line $insert_frame,0,$insert_frame,$img_height\n";
		print FLY "line $current_width,0,$current_width,$img_height\n";
		print FLY "line $current_height,0,$current_height,$img_width\n";
		$insert_frame++;
	}

	$j = 1;
	while ($j <= $length) {

		# Reference = http://worldwidemart.com/scripts/
		print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir/$CHAR{$j}\.gif\n";
		$insert_width = ($insert_width + $width); 
		$j++;
	}

	if ($transparent) { print FLY "transparent $transparent_color\n"; }
	if ($interlace) { print FLY "interlace\n"; }

	close(FLY);

	unlink($outfile);

	open(FOO,"$flyprog -q -i $infile -o $outfile |");
	while(<FOO>) { print; }
	close(FOO);

	unlink($infile);

	print "<img src=\"$outfile\" alt=\"$xxx\" border=0 width=$img_width height=$img_height>";
}

sub error {

	unlink($lockfile); #LOCK#
	print "ERROR($_[0])";
	exit;
}
