) {
                print OUT;
            }
            close(IN);
            close(OUT);
            if ((-s "$g_dirname/$file") == (-s "$dir/$file")) {
                unlink("$g_dirname/$file");
            }
            next;
        }
        # 1行分のエントリを作成する
        if ($listmode eq "manage") {
            $item =
                ""
              . "| $date"
              . " | "
              . " | $file"
              . " | $solved"
              . " | 削"
              . " | 送"
              . " | $title ($count件)"
              . " | 
\n";
         } else {
            if ($listmode eq "hist") {
                $file = substr("$dirname/$file", 7);
            }
            $item = 
                ""
              . "| $date"
              . " | "
              . " | $from"
              . " | $solved"
              . " | $title ($count件)"
              . " | 
\n";
        }
        push(@items, $item);
    }
    # ソートする
    @items = sort { $b cmp $a; } @items;
    @dirs = sort { $b cmp $a; } @dirs;
    # 50件以上古いものを過去の履歴にほうり込む
#    if ($listmode ne "hist") {
#        @logs = splice(@items, 50);
#        foreach $_ (@logs) {
#            $_ =~ /([0-9][0-9]\/[0-9][0-9]\/[0-9][0-9])/;
#            $date = $1;
#            $_ =~ /print\+([0-9]*.txt)/i;
#            $file = $1;
#            $dir = "$g_dirname/lng" . substr($date, 0, 2) . substr($date, 3, 2);
#            mkdir($dir, 0777);
#            open(IN, "$g_dirname/$file");
#            open(OUT, "> $dir/$file");
#            while () {
#                print OUT;
#            }
#            close(IN);
#            close(OUT);
#            if ((-s "$g_dirname/$file") == (-s "$dir/$file")) {
#                unlink("$g_dirname/$file");
#            }
#        }
#    }
 
    # 書き出す
    print "\n";
    print "  Low Rider's ラウンジ\n";
    if ($listmode ne "hist") {
        print "Low Rider とDYNAのラウンジです。誰でも自由に書き込んでください。\n";
        print "テクニカル、ノンテクニカル、雑談、何でもOKです。\n";
        print "気になったテーマを話題にして話し合うもよし。質問するもよし。\n";
        print "そふていら〜、ろうきんなども歓迎します。\n";
        print "\n";
        if ($return_url ne "") {
            print "[戻る]\n";
        }
        print "[新規質問]\n";
        print "[過去の履歴]\n";
    }
    print " \n";
    print "質問の一覧\n";
    print "\n";
    print "
 \n";
    if ($listmode eq "hist") {
        return;
    }
    print " \n";
    print "";
    print "新しい質問を書き込む";
    print "\n";
    print "
 \n";
    print "\n";
    print "\n";
    print "誰でも自由に質問/投稿できます。\n";
    print "質問の場合は質問形式で、それ以外は自由形式\n";
    print "名前、メールアドレス、URLは匿名(空欄)でもかまいません。\n";
    print "終了したらお礼を書き込んで[解決]をチェックしてください。\n";
    print "HTMLのタグは使えません。そのまま表\示されます。\n";
    print "再表\示を行うと発言が重複する事があります。注意してください。";
    print " \n";
    print "過去の履歴";
    print "
 \n";
    print @dirs;
    print "\n";
}
#
# 発言を追加する
#
sub writeMessage {
    #
    # 空発言は無視する
    #
    if ($FORM{'MESSAGE'} eq "") {
        return(1);
    }
    #
    # 名前無記入は「匿名希望」とする
    #
    if ($FORM{'FROM'} eq "") {
        $FORM{'FROM'} = "匿名希望";
    }
    #
    # ラウンジファイルに発言を追加する
    #
    open(OUT, ">> $g_dirname/$g_filename");
    print OUT "========================================\n";
    print OUT "From: $FORM{'FROM'}\n";
    if ($FORM{'EMAIL'} ne "") {
        print OUT "E-Mail: $FORM{'EMAIL'}\n";
    }
    if ($FORM{'HPAGE'} ne "") {
        print OUT "HomePage: $FORM{'HPAGE'}\n";
    }
    ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime();
    $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d",
        $year + 1900, $mon + 1, $mday, $g_wdays[$wday], $hour, $min, $sec);
    print OUT "Date: $date\n";
    if ($FORM{'SOLVED'} eq "on") {
        print OUT "Solved: $FORM{'SOLVED'}\n";
    }
    print OUT "\n";
    print OUT "$FORM{'MESSAGE'}\n";
    close(OUT);
    #
    # 質問者にメールで知らせる
    #
    $mailto = "";
    open(IN, "$g_dirname/$g_filename");
    while () {
        if (/^Reply-To:/) {
            chop($_);
            $mailto = $_;
            $mailto =~ s/^Reply-To: //;
        }
        if (/^========/) {
            last;
        }
    }
    if ($mailto ne "") {
        seek(IN, 0, 0);
        open(OUT, "| $nkf -j | $sendmail $mailto");
        print OUT "To: $mailto\n";
        print OUT "Subject: Tohoho Lounge\n";
        print OUT "\n";
        while () {
            $_ =~ s/<//g;
            $_ =~ s/&/&/g;
            print OUT;
        }
        close(OUT);
    }
    close(IN);
    return(true);
}
#
# 過去n日分を表示する
#
sub printList {
    $nowtime = time();
    $limittime = $nowtime - ($days * 3600 * 24);
    opendir(DIR, "wwwlng");
    @filelist = readdir(DIR);
    closedir(DIR);
    foreach $file (@filelist) {
        if ($file !~ /.txt$/) {
            next;
        }
        $mtime = (stat("wwwlng/$file"))[9];
        if ($mtime >= $limittime) {
            push(@filelist2, "$mtime $file");
        }
    }
    @filelist2 = sort { $b cmp $a; } @filelist2;
    foreach $g_filename (@filelist2) {
        $g_filename =~ s/^[0-9]+ //;
        &printFile($g_filename);
    }
}
sub printFile {
    $g_filename = $_[0];
    $subject = "";
    open(IN, "wwwlng/$g_filename") || print "Can't open $g_filename \n";
    $subject = ;
    $subject =~ s/^Subject: //;
    $subject =~ s/[\r\n]$//;
    print "
 ■ $subject\n";
    while () {
        chop($_);
        if ($_ =~ /^Reply-To: /) {
            next;
        } elsif ($head && $_ =~ /^From: /) {
            $_ =~ s/^From: //;
            print "$_\n";
        } elsif ($head && $_ =~ /^E-Mail: /) {
            $_ =~ s/^E-Mail: //;
            print "Mail\n";
        } elsif ($head && $_ =~ /^HomePage: /) {
            $_ =~ s/^HomePage: //;
            print "HomePage\n";
        } elsif ($head && $_ =~ /^Date: /) {
            $_ =~ s/^Date: //;
            print "$_\n";
        } elsif ($head && $_ =~ /^Solved: /) {
            print "[[解決]]
 \n";
        } elsif ($_ eq "========================================") {
            print "
 \n";
            $head = 1;
        } elsif ($_ eq "") {
            $head = 0;
        } else {
            $_ =~ s/(http:\/\/[a-zA-Z0-9\.\/\-+#_?~&%=^\@:]+)/$1<\/A>/g;
            print "$_
 ";
        }
    }
    print "
 \n";
    print "[↑の記事に追加発言]\n";
    print "
 \n";
    close(IN);
}
#
# サブジェクトを表示する
#
sub printSubject {
    #
    # 既存の発言を表示する
    #
    open(IN, "$g_dirname/$g_filename");
    $_ = ;
    $_ =~ s/^Subject: //;
    $subject = 1;
    print "Content-type: text/html\n";
    print "\n";
    print "\n";
    print "\n";
    print "$_\n";
    print "\n";
    print "\n";
    print "
 $_\n";
    while () {
        chop($_);
        if ($subject && $_ =~ /^Reply-To: /) {
            next;
        } elsif ($head && $_ =~ /^From: /) {
            $_ =~ s/^From: //;
            print "$_\n";
        } elsif ($head && $_ =~ /^E-Mail: /) {
            $_ =~ s/^E-Mail: //;
            print "Mail\n";
        } elsif ($head && $_ =~ /^HomePage: /) {
            $_ =~ s/^HomePage: //;
            print "HomePage\n";
        } elsif ($head && $_ =~ /^Date: /) {
            $_ =~ s/^Date: //;
            print "$_\n";
        } elsif ($head && $_ =~ /^Solved: /) {
            print "[[解決]]
 \n";
        } elsif ($_ eq "========================================") {
            print "
 \n";
            $head = 1;
            $subject = 0;
        } elsif ($_ eq "") {
            $head = 0;
        } else {
            $_ =~ s/(http:\/\/[a-zA-Z0-9\.\/\-+#_?~&%=^\@:]+)/$1<\/A>/g;
            print "$_
 ";
        }
    }
    close(IN);
    #
    # 発言追加フォームを表示する
    #
    if ($g_filename =~ /^lng/) {
        return;
    }
    print "
 \n";
    print "追加発言\n";
    print "\n";
    print "\n";
    print "
 \n";
    print "\n";
    print "\n";
}
#
# サブジェクトを管理者にメールで送信する
#
sub sendMail {
    open(OUT, "| $nkf -j | $sendmail $mailto");
    print OUT "To: $mailto\n";
    print OUT "Subject: $_[0]\n";
    print OUT "\n";
    open(IN, "$g_dirname/$_[0]");
    while () {
        print OUT $_;
    }
    close(IN);
    close(OUT);
    print "メール送信を完了しました。";
}
#
# サブジェクトを削除する
#
sub deleteSubject {
    unlink("$g_dirname/$_[0]");
    print "削除完了しました。";
}
#
# 自己テスト
#
sub localTest {
    print "誰でも自由に発言を追加してください。\n";
    print "名前、メール、URLは省略してもかまいません。\n";
    print "HTMLのタグは使えません。そのまま表\示されます。\n";
    print "再表\示を行うと発言が重複する事があります。\n";
    print " OK. CGIは正常に動作しています。\n";
    if (-d $lock_file) {
        print "
 NG. ロックファイル($lock_file)が残っています。\n";
        print "rmdir で削除してください。\n";
    }
    if ($manage ne "") {
        print "
 OK. 管理者モードが有効です。\n";
    }
    if ($mailto ne "") {
        print "
 OK. メール送信機能が有効です。\n";
        if (! -f $nkf) {
            print "
 NG. $nkfが存在しません。\n";
        }
        if (! -f $sendmail) {
            print "
 NG. $sendmailが存在しません。\n";
        }
    }
}
#
# フォームに入力されたデータを読みこむ
#
sub readParam {
    read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
    @a = split(/&/, $query_string);
    foreach $x (@a) {
        ($name, $value) = split(/=/, $x);
        $value =~ tr/+/ /;
        $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
        $value =~ s/&/&/g;
        $value =~ s/</g;
        $value =~ s/>/>/g;
        $value =~ s/\n$//;
        &jcode'convert(*value, $kanji_code);
        $FORM{$name} = $value;
    }
}
#
# 管理者用パスワードのチェック
#
sub passwdCheck {
    if ($_[0] ne $password) {
        print "管理者用パスワードが不正です。\n";
        return(0);
    } else {
        return(1);
    }
}
#
# ファイルロック開始
#
sub fileLock {
    if ($file_lock_flag) {
        for ($i = 1; $i <= 6; $i++) {
            if (mkdir($lock_file, 755)) {
                last;
            } elsif ($i < 6) {
                sleep(2);
            } else {
                return(undef);
            }
        }
    }
    return(true);
}
#
# ファイルロック解除
#
sub fileUnlock {
    if ($file_lock_flag) {
        for ($i = 1; $i <= 4; $i++) {
            if (rmdir($lock_file) == 0) {
                last;
            } elsif ($i < 4) {
                sleep(1);
            } else {
                return(undef);
            }
        }
    }
    return(true);
}
#
# プログラム中断時の処理
#
sub sigexit {
    rmdir($lock_file);
    exit(0);
}
#=======================================================================
#
# 検索
#
sub searchKeyword {
    #
    # 複数のワードを分割する
    #
    @words = split(/ +/, $FORM{'WORD'});
    #
    # メタ文字を無効化する
    #
    for ($i = 0; $i <= $#words; $i++) {
        $words[$i] =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;
    }
    #
    # HTML文書を書き出す
    #
    print "
 Low Rider's ラウンジ(検索結果)\n";
    print "\n";
    if (defined($FORM{'WORD'})) {
        print "
 \n";
        &search1($target_dir);
        print "\n";
        print " \n";
        print "検索が完了しました。\n";
    }
    print "\n";
    print "\n";
}
#
# すべてのファイルをなめ回す
#
sub search1 {
    local(@filelist, $dir);
    $dir = $_[0];
    opendir(DIR, $dir);
    @filelist = readdir(DIR);
    closedir(DIR);
    foreach $file (@filelist) {
        if ($file eq ".") { next; }
        if ($file eq "..") { next; }
        $g_filename = "$dir/$file";
        if (-d $g_filename) {
            &search1($g_filename);
        } else {
            &search2($g_filename);
        }
    }
}
#
# ファイルの中身を検索する
#
sub search2 {
    local($target);
    $target = $_[0];
    undef %wordflag;
    undef %wordtext;
    $title = "";
    $match_count = 0;
    open(IN, $target);
    loop: while () {
        chop($_);
        if (($title eq "") && ($_ =~ /^Subject:/)) {
            $title = substr($_, 9);
        }
        foreach $word (@words) {
            if ($wordflag{$word} == 1) { next; }
            if (!($_ =~ /$word/i)) { next; }
            $_ =~ s/<[^>]*>//g;
            $wordtext{$word} = $_;
            if (($FORM{'ANDOR'} eq "or") ||
                    (++$match_count == $#words + 1)) {
                if ($title eq "") {
                    $title = $target;
                }
                $target =~ s/wwwlng\///;
                print "
 \n";
                print "";
                print "$title\n";
                print "";
                foreach $wd (@words) {
                    print "$wordtext{$wd} ";
                }
                print "\n";
                last loop;
            }
            $wordflag{$word} = 1;
        }
    }
    undef @lines;
    close(IN);
} |