1#!/usr/local/bin/perl
2#!%PERL_PATH%
3#
4# index.cgi as i system and i search system
5# 2001/02/28 0.9.10 kei-3, iouri-3 fix CR/LF bug
6# 2000/10/24 0.9.9 tokumi-3 piloweb 2days date bug fix
7#                  HyperNikkiSystem Project
8# 2000/10/20 0.9.8 masato-3 hikisu patch
9#                  yar-3 DIV
10# 2000/09/19 0.9.7 yar-3 for Palmscape Cruiser (tnx chig-3)
11# 2000/08/12 0.9.6 yar-3 today's plan, OK on CR/LF, SPAN
12#                  masato-3 user vars
13#                  chihalin-3 fix on no hnf day
14# 2000/07/17 0.9.5 yar-3 fix month bug
15# 2000/07/12 0.9.4 yar-3 fix date bug
16# 2000/07/06 0.9.3 tokumi-3 catprint on NEW
17# 2000/07/05 0.9.2 masato-3 jump patch
18#                  yar-3 fix fileprint charcode bug
19#                  yar-3 daystyle
20# 2000/07/02 0.9.1 masato-3 to=hoge patch
21#                  yar-3 CRLF, STRIKE, JSky
22# 2000/06/30 0.9.0 masato-3 rebuild parser
23# 2000/06/29 0.8.7 yar-3 LIMG
24# 2000/06/29 0.8.6 yar-3 fix cmd match, imodegw
25# 2000/06/28 0.8.5 masato-3,yar-3 hns & i system fusion, theme
26# 2000/06/22 0.8.4 yar-3 delete <br> about GRP
27# 2000/06/14 0.8.3 masato-3 search patch
28# 2000/06/12 0.8.2 chihalin-3 PDX bug fixed for ONC browser
29# 2000/06/12 0.8.1 masato-3 fixsearch bug
30# 2000/06/06 0.8.0 kei-3 fix schedule bug
31# see below...
32# ����cgi�ϲ�¤��ͳ�������ۼ�ͳ�Ǥ�����̵�ݾڤǤ���
33# ����cgi�� GPL �Ǥ���
34# ���Υե������config.ph��EUC�����ɡ�����LF�ǻ��Ѥ��Ƥ���������
35
36$out = ""; # ���������buffer
37#$o = ""; # parse buffer
38
39$ver = "0.9.10(Final��) 01/02/28 (C)yar-3,masato-3";
40#$ver = "0.4.8 with PDX G/W pl7 00/02/29 (C)yar-3,masato";
41# ��¤�����ҤȤϡ���������ؤ���������ȥ��ꥸ�ʥ�ƥ�up
42$isystem = "http://yar-3.net/isystem/";
43
44$strong = "<strong>";
45$strong2 = "</strong>";
46$strike = "<strike>";
47$strike2 = "</strike>";
48$sub_separator = " ";
49
50# �桼���ѿ�
51%UserVarTemplates = (
52	TENKI	=> "[ŷ��:%value]",
53	BASHO	=> "(%value)",
54	TAION	=> " �β�:%value��",
55	TAIJU	=> " �ν�:%value" . "Kg",
56	SUIMIN	=> " ��̲:%value����",
57	BGM	=> " BGM:%value",
58	HOSU	=> " %value��",
59	HON	=> " �ɽ�:%value",
60	KITAKU	=> " �������:%value",
61	WALK    => " ����:%value",
62	RUN     => " ���祮��:%value"
63
64);
65%UserVarAlias = (
66	WEATHER     => "TENKI",
67	LOCATION    => "BASHO",
68	WEIGHT      => "TAIJU",
69	TEMPERATURE => "TAION",
70	SLEEP       => "SUIMIN",
71	STEP        => "HOSU",
72	BOOK        => "HON",
73	HOMECOMING  => "KITAKU",
74);
75
76@color_imode_ua = qw(D502 F502 SH821 P209is D209 F209);
77
78unshift(@INC, ".");
79require 'config.ph';
80#����ե�����Ǥ���
81
82if ($use_onccnv) {	# HTML to ONC�����������
83	require 'onccnv.pl';
84	$ongw = "";
85} else {
86	# ���⤷�ʤ��Ƥ�����פ��⤷��ʤ���ǰ�Τ���
87	eval q{
88		sub conv_html2onc { $_[0]; }
89		sub onc_gateway {}
90	};
91}
92
93if ($nkf == 1) {
94	eval q(use NKF);
95	if (!defined(&main::nkf)) {
96		die "NKF.pm not found";
97	}
98	# ftp://ftp.ie.u-ryukyu.ac.jp/pub/software/kono/nkf192.shar ������Ǥ��ޤ�
99} elsif ($nkf == 2) {
100	require 'jcode.pl'; #jcode.pl�Ϻǿ���侩
101	# ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/ ��������Ǥ��ޤ�
102}
103
104
105
106@week  = ("��","��","��","��","��","��","��"); #���ܸ�
107#@week = ("Su","Mo","Tu","We","Th","Fr","Sa"); #English
108
109#������ masato-3
110if ($ARGV[0] eq '-t') {
111	# �ǥХå��ѥ��ץ���������Ȥä��¹�
112	#     ������ : ./index.cgi -t word=system
113	$query_string = $ARGV[1];
114	$log = 0;		# ���ϼ��ʤ�
115	splice(@ARGV, 0, 2);	# ���ץ������������
116} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
117	read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
118} else {
119	$query_string = $ENV{'QUERY_STRING'};
120}
121$jsky = 1 if $ENV{'HTTP_X_JPHONE_MSNAME'}; # j-skyweb
122
123@a = split(/&/, $query_string);
124foreach $a (@a) {
125	($name, $value) = split(/=/, $a);
126	if ($name =~ /^word$/i) { # word=hoge ���ä���URL encode���줿�ޤ��ݻ�
127		$origword = $value;
128	}
129	$value =~ tr/+/ /;
130	$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
131	$FORM{$name} = $value;
132}
133
134$ua = $ENV{'HTTP_USER_AGENT'};
135#$ua = "PDXGW"; # for testing (PDXGW)
136$ua = "PDXGW" if ($FORM{pdxdata} || $FORM{pdxsubj} || $FORM{pdxfrom});
137#$day = "SALL" if ($ua =~ /pilo/i); #for piloweb
138
139if ($ua =~ /^DoCoMo/i) { #iMODEü��
140	$imode = 1;
141#	if ($ua =~ /D502/i or $ua =~ /F502/i or $ua =~ /SH821/i) { # color iMODE?
142	if (grep($ua =~ /$_/i, @color_imode_ua)) { # color iMODE?
143		$colorimode = 1;
144		if ($head){
145			$head = "<font color=\"$headcolor\">$head</font>";
146		} else {
147			$head = "<font color=\"$headcolor\">$title</font>";
148		}
149		$newmark = "<font color=\"$newcolor\">$newmark";
150		$new2 = "$new2</font>";
151		$submark = "<font color=\"$subcolor\">$submark";
152		$sub2 = "$sub2</font>";
153		$strong = "<font color=\"$strongcolor\">$strong";
154		$strong2 = "$strong2</font>";
155	}
156} elsif ($ua =~ /^PDXGW/) { #������PmailDX
157	my $pdxdata = $FORM{pdxdata};
158	if ($pdxdata =~ /\s*(\S+)\s*/) {
159		$pdxdata = $1;
160	} else {
161		$pdxdata = $FORM{pdxsubj};
162		if ($pdxdata =~ /\s*(\S+)\s*/) {
163			$pdxdata = $1;
164		} else {
165			$pdxdata = '';
166		}
167	}
168	if ($ongw) { # t-saitoh������opennet CGI������
169		my $qbaseuri;
170
171		#print "Location: $ongw" . "?URL=$baseuri\n\n";
172		# Location�ϻȤ��ޤ���Ǥ���>PDX
173		print "content-type: text/plain\n\n"; # html header
174		print "From: $baseuri\n";
175		print "Content-Type: Text/X-PmailDX\n\n";
176		if ($pdxdata) {
177			$qbaseuri = "$baseuri?word=$pdxdata";
178		} else {
179			$qbaseuri = $baseuri;
180		}
181		$qbaseuri =~ s/([:?=&\/\.~])/sprintf("%%%2X",ord($1))/egi ;
182		print "<SEL=1;$ongw?URL=$qbaseuri>\n\n";
183		print "i system for PmailDX<br>\n";
184		if ($pdxdata) {
185			print "push 1 for search[$pdxdata].\n";
186		} else {
187			print "push 1.\n";
188		}
189		exit 0;
190	}
191	$pdx = 1;
192#	$section = "ALL"; #PmailDX�ΤȤ���15KB���餤�����Ǥ���Τ�1��ʬ��쵤��
193
194	# pdxdata(PmailDX��ɽ��or��ʸ)������Ф���Ǥ����ʤ긡��
195	$FORM{word} = $pdxdata if ($pdxdata ne '');
196
197	$baseuri =~ s/[?](.+)$//;
198} elsif ($ua =~ /^UP.Browser/) { # ezweb?
199    $ezweb = 1;
200}
201$use_onccnv = 0 if (!$pdx);
202
203if ($imode or $pdx or $ezweb or $jsky) {
204	$strike  = "[S:";
205	$strike2 = ":S]";
206	if ($colorimode) {
207                $strike = "<font color=\"$strikecolor\">$strike";
208                $strike2 = "$strike2</font>";
209	}
210}
211
212#$log = 1;�ǥ��μ衣0�Ǻμ褷�ʤ���ư���ʤ��Ȥ���0�ˤ���
213if ($log) { # logger on
214	# print "logging\n";
215	&logging;
216}
217
218if ($FORM{U} || $FORM{URL}) {		# ONC GWư��
219	&onc_gateway($FORM{U} || $FORM{URL}, $baseuri, $ref_max, $flag_maru);
220	exit 0;
221}
222
223
224#ɽ����������������
225if ($FORM{to} =~ /^(\d{8})(\d+)/) {
226    $day = "$1S$2";
227} else {
228    $day = $FORM{d} || $ARGV[0]; # ?20001031 �Ȥ���������
229}
230
231$tt = time;
232($sec, $min, $hour, $mday, $mon, $year,
233	$wday, $yday, $isdst) = localtime($tt);
234$year += 1900;
235$mon++;
236if ($mon < 10 ) { $mon = "0$mon"; } #0suppress
237if ($mday < 10 ) { $mday = "0$mday"; }
238$today = "$year$mon$mday"; #19991231 format
239if ($day =~ /^(\d{4})(\d{2})(\d*)/) { # ?09270111
240  if ($1 < 1970) {
241    $day = ""; # �ǿ�������
242  }
243}
244
245if ($day eq 'J') { #���հ�ư
246	&print_jump_form;
247	exit 0;
248}
249if ($day eq 'E') { #������˥塼
250	&print_search_form;
251	exit 0;
252}
253if ($day eq 'PL') { # today's Plan
254	$day = $today . "P";
255}
256if ($day eq 'P' or ($day eq "" and ($ua =~ /pilo/i or $ua =~ /pscruiser/i))) { #Piloweb and PSCruiser
257	$piloweb = 1; # piloweb flag
258	$section = "ALL";
259	$day = "";
260}
261
262if (length($day) > 8) { # ?20001031S2 �Ȥ�������
263	if ($day =~ /P$/i) { # ������P : plan�⡼��
264		$day =~ /(\d{8})P/i; #20001031 P ��ʬ����
265		$day = $1;
266		$plan = 1;
267	} elsif ($day =~ /T$/i) { # ������T : todo�⡼��
268		$day =~ /(\d{8})T/i; #20001031 P ��ʬ����
269		$day = $1;
270		$todo = 1;
271		$todof = "$diarydir/todo";
272	} else {
273		$day =~ /(\d{8})s(.+)/i; #20001031 S2 ��ʬ����
274		$day = $1;
275		$section = $2;
276	}
277}
278if ($day eq "") { # today
279#	$day = $today if (-e &make_hnf_fname($today));
280	if ($FORM{word}) { # ����ʸ������
281		&search_word($FORM{word});
282		exit 0;
283	}
284
285} else {
286	($year, $mon, $mday) = unpack("A4A2A2", $day);
287	$hnf = &make_hnf_fname($day);
288}
289
290$newcount = 0; #�����Ĥ��NEW��
291$subcount = 0; #�����Ĥ��SUB�� NEW���Ѥ���reset
292
293$ok = 0; # header���� OK �ޤǤ���ʬ�ϥ桼�����ѿ� i system�Ǥ�̵��
294
295#��ǯ������ǯ�ޤǤ�hnf�ե�����Υꥹ�Ȥ��������
296foreach my $y ($year-1..$year+1) {
297	opendir DIR, "$diarydir$y" || next;
298	push(@ddays, (sort grep s/^d(\d+)\.hnf$/$1/, readdir DIR));
299	closedir DIR;
300}
301#$day������äݤ�������hnf���ʤ��Ȥ��Ϻǿ���hnf������
302if ($day eq "") {
303	foreach my $d (reverse @ddays) {
304		$day = $d;
305		($year, $mon, $mday) = unpack("A4A2A2", $day);
306		$hnf = &make_hnf_fname($day);
307		last if &has_ok($hnf);
308	}
309}
310#�����������������ե������õ��
311for ($i = 0; $i <= $#ddays; $i++) {
312	last if ($ddays[$i] ge $day);
313}
314$j = ($ddays[$i] ge $day) ? $i-1 : $i;
315while ($j >= 0) {
316	my $f = &make_hnf_fname($ddays[$j]);
317	if (&has_ok($f)) {
318		$prevday = $ddays[$j];
319		last;
320	}
321	$j--;
322}
323$j = ($ddays[$i] ge $day) ? $i+1 : $i;
324while ($j <= $#ddays) {
325	my $f = &make_hnf_fname($ddays[$j]);
326	if (&has_ok($f)) {
327		$nextday = $ddays[$j];
328		last;
329	}
330	$j++;
331}
332
333if (!$use_onccnv) {
334	$out .= "content-type: text/html\n\n";	# content-type�����
335}
336$out .= "\n<html><head>\n";
337$out .= "<!-- �� -->\n" if (!$nkf); #nkf��jcode.pl���Ȥ��ʤ��Ȥ��ϡ֤�ץƥ�
338#�֤�ץƥ��Ȥϡ�iMODE���Ӥ�EUC�Υ����Ȥ�ɽ�����뵻��(��)
339# tnx 2 masato-3, ari-3
340$out .= "<title>$title</title>\n";
341$out .= "</head>\n";
342
343&make_body; #<body>��������������
344
345$out .= "</html>\n"; #html���������
346
347$out = &conv_html2onc($out, $baseuri, $baseuri, $ref_max, $flag_maru) if $use_onccnv;
348$out = &convert2sjis($out) if $nkf; 	#NKF,jcode.pl���ѻ���sjis�Ѵ�
349
350print $out; #����
351
352################################################################
353#
354# �����ޤ�
355#
356# ���Ȥ�subroutine
357#
358################################################################
359
360
361# �ե�������ɤ߽Ф���ɽ��
362sub fileprint {
363	my $tmpout;
364	open(IN, $_[0]);
365	while(<IN>) {
366		$tmpout .= "$_\n";
367	}
368	$tmpout = &convert2euc($tmpout) if $nkf;     #NKF,jcode.pl���ѻ���euc�Ѵ�
369	return $tmpout;
370}
371
372#���դ�ɽ��
373sub dayprint {
374	my $yyyy,$mm,$dd,$m,$d,$w,$tmpday;
375
376	#$daystyle = "<b>%yyyyǯ%mm��%dd��(%w)</b>" if (!$daystyle) ; #default
377
378        if ($daystyle) {
379                $tmpday = $daystyle;
380        } else {
381                $tmpday = "<b>%yyyyǯ%mm��%dd��(%w)</b>"; #default
382        }
383
384	# %yyyy 4������
385	# %mm   2���
386	# %dd   2����
387	# %m    ��(0���ץ쥹�ʤ�)
388	# %d    ��(0���ץ쥹�ʤ�)
389	# %w    ����
390
391	$day =~ /(\d\d\d\d)(\d\d)(\d\d)/;
392	$yyyy = $1;
393	$mm = $2;
394	$dd = $3;
395	$m = $mm; #0.9.5 fix
396	$m = sprintf("%1d", $mm) if ($mm < 10);
397	$d = $dd; #0.9.5 add
398	$d = sprintf("%1d", $dd) if ($dd < 10);
399	$w = getdayoftheweek( "$yyyy/$mm/$dd");
400
401#	$out .= "<br><b>$1ǯ$2��$3��</b>\n";
402#	$out .= "<b>$1ǯ$2��$3��</b>\n"; # br���ä�
403	$tmpday =~ s/%yyyy/$yyyy/;
404	$tmpday =~ s/%mm/$mm/;
405	$tmpday =~ s/%dd/$dd/;
406	$tmpday =~ s/%m/$m/;
407	$tmpday =~ s/%d/$d/;
408	$tmpday =~ s/%w/$w/;
409	$out .= "$tmpday\n";
410}
411
412#����
413sub parse {
414	$t = $_[0];
415	my $o = "";
416	$t =~ s/\r$//;
417	chomp($t); #����ϼ¤Ϥ���ʤ�?
418
419	if ( $t =~ /^OK$/ ) { #header����
420		$ok = 1;
421		return;
422	}
423
424	if ($ok == 0) { #header������
425		#$o .= $t; #for debugging
426		# �桼�����ѿ���ɽ��
427		my ($var, $value) = $t =~ /^(\S+)\s+(\S.*)/;
428		if ($UserVarAlias{$var}) {
429			$var = $UserVarAlias{$var};
430		}
431		my $v = $UserVarTemplates{$var};
432		if ($var ne '' && $v ne '') {
433			$v =~ s/%value/$value/e;
434			$o .= $v;
435		}
436		return;
437	}
438
439	if ($t =~ /^RL(NEW|SUB)\s(\S+)\s(\S+)\s(.+)/) { #RLNEW ����1 2 ����
440		$cmd = $1;
441		$orig = $2;
442		$url = $3;
443		$cmt = $4;
444		#$t = "cmd=$cmd orig=$orig url=$url $cmt";
445		open(RLINK, "$diarydir" . "conf/rlink.txt");
446		while($a = <RLINK>) {
447			$a =~ /^(\S+)\s(.*)/;
448			#$t .= "-$1- -$orig-";
449			if ( $1 eq $orig ) { # ���פ�����
450				$url = $2 . $url;
451				$t = "L$cmd $url $cmt"; #LNEW,LSUB���ִ����Ƥ��ޤ�!
452			}
453		}
454		close(RLINK);
455	}
456
457        # <,>,&���ִ����Ƥ���
458        if ($t =~ /^((LNEW|LSUB|LSTRIKE|LSTRONG|LINK|URL)\s+(\S+))(\s+.+)?/) {
459                $t = &html_escape($1) . &html_escape_zen($4);
460        } else {
461                $t = &html_escape_zen($t);
462        }
463
464        if ($t =~ /~$/) { #�����β��Ԥ��Ѵ�
465                $t =~ s/~$/<br>/;
466        }
467
468        if ($grp > 0) { #GRP��ǽ�б� kenji-3
469		if ($t =~ /^(NEW|LNEW|RLNEW|GRP)\s.*/) {
470                 # GRP����������ɽ���ˤ���
471		}
472		else {
473	                return;
474		}
475        }
476
477	my ($cmd, $p) = ($t =~ /^(\/?[A-Z]+)(?:(?:\s*)|(?:\s+(.*)))$/);
478	if ($cmd eq "CAT") { # CAT hoge
479		$cat = $cat . $p; #ʣ���Ԥ�CAT���б�
480	} elsif ($cmd eq "GRP") { # GRP��ǽ
481		$grp = 1; # grp mode on
482	} elsif ($cmd eq "NEW") { # NEW hogehoge
483		$newtopic = $2; # search�ǻȤ������new����Ȥ���¸
484	        if ($grp == 1) {
485			# GRP����������ɽ���ˤ���
486			$grp = 2;
487			return;
488		} elsif ($grp == 2) {
489			$grp = 0;
490		}
491
492		$newcount++;
493		#if ( $newcount != 1 and $imode != 1) {
494		if ( $imode != 1) { #��� $newline�Ƕ��ڤäƤߤ�
495			$o .= "$newline";
496		} else { #iMODE�ΤȤ���
497			$o .= "<br>"; #�Ȥꤢ��������
498		}
499		$subcount = 1;
500		$o .= "$newmark$newcount:";
501		$o .= "$new1$p";
502                if ($cat && $catprint ) { #cat ɽ����on/off��ǽ��
503                        $o .= "\n[$cat]\n";
504                        $cat = "";
505                }
506		$o .= "$new2";
507	} elsif ($cmd eq "LNEW" && $p =~ /(\S+)\s(.+)/) { # LNEW url hogehoge
508		#$newtopic = $2; # search�ǻȤ������new����Ȥ���¸
509                if ($grp == 1) {
510                        # GRP����������ɽ���ˤ���
511                        $grp = 2;
512                        return;
513                } elsif ($grp == 2) {
514                        $grp = 0;
515                }
516
517		$newcount++;
518		#if ( $newcount != 1 and $imode != 1) {
519		if ( $imode != 1) { #��� $newline�Ƕ��ڤäƤߤ�
520			$o .= $newline;
521		} else { #iMODE�ΤȤ���
522			$o .= "<br>"; #�Ȥꤢ��������
523		}
524		$subcount = 1;
525		$fncount = 1;
526		$fnmode = 0;
527		$fn = "";
528		$o .= "$newmark$newcount:";
529		$o .= $new1;
530		$o .= &make_link($1);
531		$o .= "$2</a>";
532		if ($cat && $catprint ) { #cat ɽ����on/off��ǽ��
533			#print "[$cat]\n";
534			$o .= "\n[$cat]\n";
535			$cat = "";
536		}
537		$o .= $new2;
538	} elsif ($cmd eq "SUB") { # SUB hogehoge
539		#$subtopic = $p; # search�ǻȤ������sub����Ȥ���¸
540		$o .= "$subline";
541		$o .= "$submark$subcount:";
542		$subcount++;
543		$o .= "$sub1$p$sub2";
544	} elsif ($cmd eq "LSUB" && $p =~ /(\S+)\s(.+)/) { # LSUB url hogehoge
545		#$subtopic = $2; # search�ǻȤ������sub����Ȥ���¸
546		$o .= "$subline";
547		$o .= "$submark$subcount:";
548		$subcount++;
549		$o .= &make_link($1);
550		$o .= "$sub1$2$sub2</a>";
551
552	} elsif ($cmd eq "LINK" && $p =~ /(\S+)\s(.+)/) { # LINK url hogehoge
553		$o .= &make_link($1);
554		$o .= "$2</a>";
555	} elsif ($cmd eq "URL" && $p =~ /(\S+)(\s(.+))?/) { # URL url hogehoge
556		$o .= &make_link($1);
557		$o .= "$3 ($1)</a>";
558	} elsif ( $cmd eq "UL" or $cmd eq "/UL" or
559		  $cmd eq "DL" or $cmd eq "/DL" or
560		  $cmd eq "OL" or $cmd eq "/OL") {
561		$cmd =~ tr/A-Z/a-z/;
562		$o .= "<$cmd>";
563
564	} elsif ( $cmd eq "/PRE") { # /PRE
565		$premode = 0;
566		$o .= "</pre>";
567	} elsif ( $cmd eq "PRE") { # PRE
568		if ($premode) {
569			$o .= "$1";
570		} else {
571			$o .= "<pre>";
572			$premode = 1;
573		}
574
575	} elsif ($cmd eq "CITE") {
576		$o .= "<blockquote>\n";
577	} elsif ($cmd eq "/CITE") {
578		$o .= "</blockquote>\n";
579	} elsif ($cmd eq "/BIG") {
580		# do nothing
581	} elsif ($cmd eq "/DIV") {
582		# do nothing
583	} elsif ($cmd eq "DIV") {
584		#do nothing
585	} elsif ($cmd eq "BIG" ) {
586		# do nothing
587	} elsif ($cmd eq "/SMALL") {
588		# do nothing
589	} elsif ($cmd eq "SMALL") {
590		# do nothing
591        } elsif ($cmd eq "LIMG" && $p =~ /(\S+)\s(\S+)\s(\S+)\s(.+)/) {
592                # LIMG url {r|l|n} �ե�����̾ ʸ����
593                $o .= "[LIMG $4]";
594	} elsif ($cmd eq "LI") { # LI hoge
595		$o .= "<li>$p";
596	} elsif ($cmd eq "DT") { #DT hoge
597		$o .= "<dt>$p";
598        } elsif ($cmd eq "DD") { #DD hoge
599	        $o .= "<dd>$p";
600	} elsif ($cmd eq "STRIKE") { # STRIKE hoge
601		$o .= "$strike$p$strike2";
602	} elsif ($cmd eq "LSTRIKE" && $p =~ /(\S+)\s(.*)/) { # LSTRIKE url hoge
603		$o .= $strike;
604		$o .= &make_link($1);
605		$o .= "$2</a>$strike2";
606	} elsif ($cmd eq "STRONG") { # STRONG hoge
607		$o .= "$strong$p$strong2";
608	} elsif ($cmd eq "LSTRONG" && $p =~ /(\S+)\s(.*)/) { #LSTRONG url hoge
609		$o .= $strong;
610		$o .= &make_link($1);
611		$0 .= "$2</a>$strong2";
612	} elsif ($cmd eq "SPAN" && $p =~ /(\S+)\s(.*)/) { #SPAN classname hoge
613		$o .= $2;
614	} elsif ($cmd eq "FONT" && $p =~ /(\S+)\s(\S+)\s(.+)/) { # FONT para value hoge
615		$o .= "<font $1=\"$2\">$3</font>";
616
617	} elsif ($cmd eq "IMG" && $p =~ /(\S+)\s(\S+)\s(.+)/) { # IMG para url alt
618		if ($1 eq "r") {
619			$aln = "align=\"right\"";
620		} elsif ($1 eq "l") {
621			$aln = "align=\"left\"";
622		} elsif ($1 eq "n") {
623			$aln = "";
624		}
625		#$o .= "<img src=\"$2\" $aln ALT=\"$3\"$1=\"$2\">$3</img>\n"; (23:22)
626		#iMODE�ʤΤǴ���Ū�˲�����ɽ�����ޤ���
627		$o .= "[IMG $3]";
628	} elsif ( $t =~ /^!(.*)/) { # ! hoge
629		#$o .= "<!-- $1 -->\n"; �̤�ɽ�����ʤ��Ƥ⤤�����
630	} elsif ( $t =~ /^!#(.*)/) { # !# hoge
631	} elsif ($cmd eq "FN") { # FN
632		$fnmode = 1;
633		$o .= "<font size=\"-1\" color=GREEN>(";
634	} elsif ($cmd eq "/FN") { # /FN
635		$fnmode = 0;
636		$fncount++;
637		$o .= ")</font>\n";
638	} elsif ($cmd eq "ALIAS") { # ALIAS ̤�б����ä�!!
639		#����Ū��aliasʸ�����Ф��Ƥ���
640		#$o .= "$p";
641		$orig = $p;
642		open(ALIAS, "$diarydir" ."conf/alias.txt");
643		while($a = <ALIAS>) {
644			$a =~ /^(\S+)\s(.*)/;
645			#print "$a,$1<br>";
646			if ( $1 eq $orig ) { # ���פ�����
647				$o .= "$2";
648			}
649		}
650		close(ALIAS);
651	} elsif ($cmd eq "RLINK" && $p =~ /(.+)\s(.+)\s(.+)/ ) { # RLINK ����1 ����2 ����ʸ��
652		$orig = $1;
653		$url = $2;
654		$cmt = $3;
655		open(RLINK, "$diarydir" . "conf/rlink.txt");
656		while($a = <RLINK>) {
657			$a =~ /^(\S+)\s(.*)/;
658			if ( $1 eq $orig ) { # ���פ�����
659				$url = $2 . $url;
660				$o .= &make_link($url);
661				$0 .= "$cmt</a>";
662			}
663		}
664		close(RLINK);
665	} elsif ($cmd eq "MARK") { #MARK���ޥ�ɼ�����˺��
666		$o .= $p;
667	} elsif ($cmd eq "P") { # P
668		$o .= "<p>";
669	} elsif ($cmd eq "/P") { # /P
670		$o .= "</p>";
671	} else {
672		    $o .= $t;
673	}
674	return $o;
675}
676
677#�����ȥ������ɽ������
678sub title {
679	#$out .= "<ol>\n";
680	my $ok;
681	my $uv, @sect;
682	while(<IN>) {
683		chomp;
684		s/\r$//;   #CR+LF to LF
685		$_ = convert2euc($_) if ($hnfconv and $nkf);
686		if (!$ok) { # header
687			if (/^OK$/) { #header����
688				$ok = 1;
689				$out .= $uv;
690				next;
691			}
692			if (/^(\S+)\s+(\S.*)/) {
693				my $var = $1;
694				if ($UserVarAlias{$var}) {
695					$var = $UserVarAlias{$var};
696				}
697				my $v = $UserVarTemplates{$var};
698				my $value = $2;
699				if ($v ne '' && $catprint) {
700					$v =~ s/%value/$value/e;
701					$uv .= $v;
702				}
703			}
704			next;
705		}
706		if (/^GRP/) { # GRP��ǽ kenji-3
707			$grp = 1; # grp mode on
708		}
709
710		if (/^NEW()$/ or /^NEW\s(.+)/ or /^LNEW\s\S+\s(.+)/ or /^RLNEW\s\S+\s\S+\s(.+)/){
711			if ($grp == 1) {
712				# GRP����������ɽ���ˤ���
713				$grp = 2;
714			} elsif ($grp == 2) {
715				$grp = 0;
716			}
717
718			$newcount++ unless ($grp);
719			#$out .= "<br>\n";
720			$sect[$newcount] .= "<br>\n" unless ($grp);
721			$uri = $day . "S$newcount";
722			my $t = &html_escape($1);
723			if ($t eq "") {
724				$t = "_";
725			}
726			#$out .= "$newmark$newcount:$new1" . make_self_link("?$uri") . "$t</a>$new2\n" unless ($grp);
727			$sect[$newcount] .= "$newmark$newcount:$new1" . make_self_link("?$uri") . "$t</a>$new2\n" unless ($grp);
728			# listing���᤿
729		} elsif (/^SUB()$/ or /^SUB\s(.+)/ or /^LSUB\s\S+\s(.+)/  or /^RLSUB\s\S+\s\S+\s(.+)/) {
730			my $t = &html_escape($1);
731			if ($t eq "") {
732				$t = "_";
733			}
734			#$out .= "$t$sub_separator\n" unless ($grp);
735			$sect[$newcount] .=  "$sub_separator$t\n" unless ($grp);
736		}
737	}
738
739if ($titlereverse) {
740	for( $xx = $newcount; $xx >=0; $xx--) {
741		$out .= $sect[$xx];
742	}
743} else {
744	for($xx = 0; $xx <= $newcount; $xx++) {
745		$out .= $sect[$xx];
746	}
747}
748
749$out .= "<hr>\n";
750	if ($prevday) {
751		$out .= make_self_link("?$prevday", "1") . "[������]</a>";
752	}
753	if ($nextday) {
754		$out .= make_self_link("?$nextday", "3") . "[������]</a>";
755	}
756	$up = "?$day" . "P";
757	$ut = "?$day" . "T";
758
759	$out .= make_self_link("?J", "5") . "[���հ�ư]</a>\n";
760
761	$out .= make_self_link("$up", "4") . "[ͽ��]</a>\n";
762	$out .= make_self_link("$ut", "6") . "[TODO]</a>\n";
763	$out .= make_self_link("?E", "8") . "[����]</a>\n"; #(5)
764	$out .= make_self_link("?${day}SALL") . "[����]</a>\n" unless ($imode);
765		#iMODE�Ǥϡ�������ɽ���Ϥ��ʤ�(ɽ���Ǥ��ʤ�����)
766	$out .= make_self_link("http://yar-3.net/mi/","0") . "[�ߤ�]</a>\n";
767
768	$out .= "<br><a href=$isystem>i system</a> ver $ver<br>\n";
769}
770
771# ͽ���ɽ������
772sub planprint {
773	my %abc = (A => 10.5, B => 20.5, C => 31.5,
774		   a => 10.5, b => 20.5, c => 31.5);
775	my %abcString = (A => '��', B => '��', C => '��',
776			 a => '��', b => '��', c => '��');
777	my %dowNum = ('sun', 0, 'mon', 1, 'tue', 2, 'wed', 3,
778		      'thu', 4, 'fri', 5, 'sat', 6,
779	              'su',  0, 'mo',  1, 'tu',  2, 'we', 3,
780		      'th',  4, 'fr',  5, 'sa',  6,
781		      '��', 0, '��', 1, '��', 2, '��', 3,
782		      '��', 4, '��', 5, '��', 6);
783	my @pp, @p, @repeats;
784	local (*PLAN);
785
786	$out .= "[ͽ��]<br>\n";
787
788	# �����֤�ͽ����ɤ߹���
789	my $planf = $diarydir . "repeat";
790	open(PLAN, $planf);
791	while(<PLAN>) {
792		$_ = convert2euc($_) if ($hnfconv and $nkf);
793		s/\r$//;
794		chomp;
795		next if /^\s*#/;	# �����ȹ�
796		next if /^\s*$/;	# ���Ԥ��ߤ������
797		if (/^([^\[\s]+)(?:\[([^\]]+)\])?\s+(.*)$/) {
798			my @range = parse_range($2);
799			push(@repeats, [$1, $3, @range]);	# [dp dsec begin end]
800		} elsif (/^\[([^\]]+)\]\s+(.*)$/) {
801			my @range = parse_range($1);
802			push(@repeats, ['', $2, @range]);	# ['' dsec begin end] �ϰ��դ�����ͽ��
803		}
804	}
805	close PLAN;
806
807	# ��������Σ������ͽ������
808	my ($ly, $lm) = ($year, $mon);
809	for (1 .. 2) {
810		my $me = &month_days($ly, $lm);
811
812		# �Ʒ��ͽ��
813		# ͽ��ե�����̾���� /home/hoge/diary/1999/y199902
814		$planf = "$diarydir$ly/y$ly$lm";
815		open(PLAN, $planf);
816		while(<PLAN>) {
817			$_ = convert2euc($_) if ($hnfconv and $nkf);
818			s/\r$//;
819			chomp;
820			my $d, $dd, $m;
821			if (/^((\d+)\/)?(\d+)\s/) {
822				# 18 �ǡ��� ���뤤�� 2/18 �뺧�� �ʤ� ari-3
823				# ����˳�Ǽ��������� ["19991231" "1999/12/31 �ۤ�"]
824				$m = $2;
825				$d = $3;
826				#$d = "0" . $d if ($d < 10);
827				$d = substr("0" . $d, -2);
828				$dd = $d;
829			} elsif (/^((\d+)\/)?([abcABC])\s/) {
830				# A �ǡ��� ���뤤�� 2/A �뺧�� �ʤ�
831				# ����˳�Ǽ��������� ["19991210.5" "1999/12/A �ۤ�"]
832				$m = $2;
833				$d = $abc{$3};
834				$dd = $3;
835			}
836			$m = $lm if ($m == 0);
837			if ($d && $m == $lm) {
838				push(@pp, ["$ly$lm$d", "$ly/$lm/$dd $'"]);
839			}
840		}
841		close PLAN;
842
843		# �����֤�ͽ��
844		foreach my $rplan (@repeats) {
845			my ($dp, $desc, $brng, $erng) = @$rplan;
846			my $m = $lm;
847			my $dd = '';
848			my $d;
849			if (@$rplan == 4 && $dp ne ''
850			 && ((sprintf("%04d%02d%02d", $ly, $lm, $me) < $brng)
851			  || (sprintf("%04d%02d%02d", $ly, $lm, 1) > $erng))) {
852				next;
853			}
854			if ($dp =~ m!^(\d+)/(\d+)$!) {  # ��ǯ�������
855				$m = $1;
856				$d = $2;
857			} elsif ($dp =~ m!^(\d+)/(-?\d+)([^\d].*)$!) { # ��ǯ�������n����
858				my $dow = $3;
859				$dow =~ tr/A-Z/a-z/;
860				if ($dowNum{$dow} eq '') {
861					$d = 0;
862					$dd = $dp . '?'
863				} else {
864					$m = $1;
865					$d = &get_nth_dow($ly, $lm, $2, $dowNum{$dow});
866				}
867			} elsif ($dp =~ m!^(\d+)/([abcABC])$!) { # ��ǯ������
868				$m = $1;
869				$d = $abc{$2};
870				$dd = $2;
871			} elsif ($dp=~ /^\d+$/) { # ��������
872				$d = $dp;
873			} elsif ($dp =~ /^[Ee]?(-\d+)?$/ && $dp ne '') { # ���E(����) ͽ��
874				$d = $1;
875				$d = $me + $1;
876			} elsif ($dp =~ /^(-?\d+)([^\d].+)$/) { # �����n����
877				my $dow = $2;
878				$dow =~ tr/A-Z/a-z/;
879				if ($dowNum{$dow} eq '') {
880					$d = 0;
881					$dd = $dp . '?'
882				} else {
883					$d = &get_nth_dow($ly, $lm, $1, $dowNum{$dow});
884					$d = 0 if ($d < 0 || $d > $me);
885				}
886			} elsif ($dp =~ /^[abcABC]$/) { # �������
887				$d = $abc{$dp};
888				$dd = $2;
889			} else {
890				my $dow = $dp;
891				$dow =~ tr/A-Z/a-z/;
892				if ($dowNum{$dow} ne '') { # �轵��������
893					# ʣ��push����ɬ�פ�����ΤǼ����ǽ���
894					for (my $i = 1; $i <= 5; $i++) {
895						$d = &get_nth_dow($ly, $lm, $i, $dowNum{$dp});
896						my $s = sprintf("%04d%02d%02d", $ly, $lm, $d);
897						if ($d >= 1 && $d <= $me
898						 && (@$rplan == 2 || ($s >= $brng && $s <= $erng))) {
899							$d = sprintf("%02d", $d);
900							push(@pp, [$s, "$ly/$lm/$d $desc"]);
901						}
902					}
903					# ���Ȥ��Τ���:-)
904					$d = 0;
905				} elsif (@$rplan == 4 && $dp eq '') {	# �ϰ��դ�����
906					for (my $i = 1; $i <= $me; $i++) {
907						my $s = sprintf("%04d%02d%02d", $ly, $lm, $i);
908						if ($s >= $brng && $s <= $erng) {
909							$d = sprintf("%02d", $i);
910							push(@pp, [$s, "$ly/$lm/$d $desc"]);
911						}
912					}
913					# ���Ȥ��Τ���:-)
914					$d = 0;
915				} else { # otherwise
916					$d = 32;
917					$dd = $dp . '?'
918				}
919			}
920			$m = sprintf("%02d", $m) if ($m ne '');
921			if ($d && $m == $lm) {
922				my $s = sprintf("%04d%02d%02d", $ly, $m, $d);
923				if ((@$rplan == 2) || ($s >= $brng) && ($s <= $erng)) {
924					#$d =  "0$d" if ($d < 10);
925					$d = substr("0". $d, -2);
926					$dd = $d if ($dd eq '');
927					push(@pp, [$s, "$ly/$m/$dd $desc"]);
928				}
929			}
930		}
931
932		($ly, $lm) = &next_month($ly, $lm);
933	}
934
935#print "** pp start **\n", join("\n", map("$_->[0], $_->[1]", @pp)), "\n** pp end **\n";
936
937	#����κ����ʹߤΤ�Τ������Ф��ƥ�����
938	my $today = "$year$mon$mday";
939	@p = sort { $a->[0] <=> $b->[0] ||
940	    $a->[1] cmp $b->[1] } grep($_->[0] >= $today, @pp);
941	#@p = sort { $a->[0] <=> $b->[0] } grep($_->[0] >= $today, @pp);
942	if (!$maxplan) {
943		$maxplan = 10; # ̤������κ������10��
944	}
945	if ($#p < $maxplan) { # ���ʤ��Ȥ�
946		$maxplan = $#p + 1;
947	}
948
949	for ($i = 0 ; $i < $maxplan ; $i++){
950		if ($p[$i]->[1] =~ /^(\d\d\d\d\/\d\d\/\d\d)\s/) {
951			$d = $1;
952			$d =~ /\d\d\d\d\/(\d\d)\/(\d\d)/;
953			$mm = $1; $dd = $2;
954			$d = "$mm/$dd(" . &getdayoftheweek($d) . ")";
955		} elsif ($p[$i]->[1] =~ /^\d\d\d\d\/(\d\d\/)([abcABC])\s/) {
956			$d = $1 . $abcString{$2};
957			$d = "$d   ";
958		} elsif ($p[$i]->[1] =~ /^\d\d\d\d\/(\d\d)\s/) {
959			$d = "$1   ";
960		} else {
961			$d = "??";
962		}
963		$a = $';
964#print $1;
965		$out .= "��$d $a<br>\n"; # ������plan�θ����ܤ��ѹ���ǽ
966	}
967	$out .= "<hr>\n";
968	#LINKɽ��
969	&ichiran;
970}
971
972#���������!
973sub getdayoftheweek {
974	my ($y, $m, $d) = ($_[0] =~ /(\d\d\d\d)\/(\d\d)\/(\d\d)/);
975#	return "$m/$d(" . $week[&get_dow($y,$m,$d)] . ")";
976	return $week[&get_dow($y,$m,$d)];
977}
978
979#���������(0:��, 1:��, ..., 6:��)
980sub get_dow {
981	# hns��Date.pm���ͤ˽������ޤ���
982	# �����timelocal()��Ȥ鷺�ˤ��ߤޤ��衣
983	my ($y, $m, $d) = @_;
984	$y = $y + 399 if ($m < 3);
985	($y + int($y/4) - int($y/100) + int($y/400) +
986	 (0, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4)[$m] + $d
987	) % 7;
988}
989
990#����ǯ�����$n$dow����($n<0�ʤ�������������, $n=-1�ʤ�ǽ�)
991sub get_nth_dow {
992	my ($y, $m, $n, $dow) = @_;
993#print "get_nth_dow: y=$y, m=$m, n=$n, dow=$dow\n";
994	my $days = &month_days($y, $m);
995	my $d;
996	if ($n > 0) {
997		my $first = &get_dow($y, $m, 1);
998		if ($dow >= $first) {
999			$d = ($n-1)*7 + $dow - $first + 1;
1000		} else {
1001			$d = $n*7 + $dow - $first + 1;
1002		}
1003	} elsif($n < 0) {
1004		my $last = &get_dow($y, $m, $days);
1005		if ($dow <= $last) {
1006			$d = $days - ($last - $dow) + ($n+1)*7;
1007		} else {
1008			$d = $days - ($last - $dow) + $n*7;
1009		}
1010	}
1011	if ($d < 1 || $d > $days) {
1012		return 0;
1013	}
1014	return $d;
1015}
1016
1017# repeat���ϰϻ����parse����
1018# �����: ()                       : �ϰϻ���ʤ�
1019#         ('yyyymmdd', 'yyyymmdd') : �ϰϤκǽ�ȺǸ����
1020sub parse_range($) {
1021	my ($spec) = @_;
1022	my @ba = (0, 1, 1);
1023	my @ea = (9999, 12, 31);
1024	return () if ($spec eq '');
1025	if ($spec =~ /^([^-]*)-(.*)$/) {
1026		my ($b, $e) = ($1, $2);
1027		if ($b eq '') {
1028#			@ba = (0, 1, 1);
1029		} elsif ($b =~ /^\d{4}$/) {
1030			@ba = ($b, 1, 1);
1031		} elsif ($b =~ m!^(\d{4})/(\d+)$!) {
1032			@ba = ($1, $2, 1);
1033		} elsif ($b =~ m!^(\d{4})/(\d+)/(\d+)$!) {
1034			@ba = ($1, $2, $3);
1035		}
1036		if ($e eq '') {
1037#			@ea = (9999, 12, 31);
1038		} elsif ($e =~ /^\d{4}$/) {
1039			@ea = ($e, 12, 31);
1040		} elsif ($e =~ m!^(\d{4})/(\d+)$!) {
1041#			my $dmonth = &month_days($1, $2);
1042#			@ea = ($1, $2, $dmonth);
1043			@ea = ($1, $2, 31);
1044		} elsif ($e =~ m!^(\d{4})/(\d+)/(\d+)$!) {
1045			@ea = ($1, $2, $3);
1046		}
1047	} else {
1048		# illegal format
1049	}
1050	return (sprintf("%04d%02d%02d", @ba), sprintf("%04d%02d%02d", @ea));
1051}
1052
1053# TODO��ɽ������
1054sub todoprint {
1055	my (@num);
1056	$out .= "[TODO]<br>\n";
1057	open(TODO, $todof);
1058	while(<TODO>) {
1059		$_ = convert2euc($_) if ($hnfconv and $nkf);
1060		if (/^(\d+)\s/) { # 99 ������³���� �ʤ�
1061			push(@num, [$1, $']); # ̵̾����[����, ����]�������
1062		}
1063	}
1064	close TODO;
1065
1066	# ���������ˤ��ƾ���ǥ�����
1067	@num =	sort { $b->[0] <=> $a->[0] } @num;
1068
1069	if (!$maxtodo) {
1070		$maxtodo = 10; # ̤������κ������10��
1071	}
1072	if ($#num < $maxtodo) { # ���ʤ��Ȥ�
1073		$maxtodo = $#num + 1;
1074	}
1075
1076	for ($i = 0 ; $i < $maxtodo ; $i++){
1077		$out .= "#$num[$i]->[0] $num[$i]->[1]<br>\n"; #������TODO�θ����ܤ��ѹ���ǽ
1078	}
1079	$out .= "<hr>\n";
1080	#LINKɽ��
1081	&ichiran;
1082}
1083
1084#[��][��]�äƤ�Ĥ�
1085sub section_jump {
1086	if ($section > 1) { # ���Υ��������¸��
1087		$sec = $section - 1;
1088		$u = "?$day" . "S$sec";
1089		$out .= make_self_link("$u", "1") . "[��]</a>";
1090	}
1091	if ($newcount > $section) { # ��Υ��������¸��
1092		$sec = $section + 1;
1093		$u = "?$day" . "S$sec";
1094		$out .= make_self_link("$u", "3") . "[��]</a>";
1095	}
1096	#����
1097	&ichiran;
1098}
1099
1100#���հ�ư
1101sub print_jump_form {
1102if (!$use_onccnv) {
1103	$out .= "content-type: text/html\n\n";
1104}
1105$out .= "<html><head>\n";
1106$out .= "<!-- �� -->\n" if (!$nkf);
1107$out .= "</head>\n";
1108$out .= "<title>i system jump</title>\n";
1109$out .= "<body>\n";
1110$out .= "<b>i system jump</b><p>\n";
1111$out .= "Ǥ�դ����դ˥����פ��ޤ���<br>\n";
1112$out .= "3.���������ܥ�������Ʋ�������<br>\n";
1113
1114	if ($baseuri && $ezweb) { #ezweb�к� ari-3
1115		$out .= qq(<form method="GET" action="$baseuri">\n);
1116	} else {
1117		$out .= qq(<form method="GET" action="./">\n);
1118	}
1119
1120	$out .= qq(<input type="text" name="d" value="$today" size=10 maxsize="8" istyle="4">\n); # istyle is 502 tag
1121	$out .= qq(<input type="submit" name="g" value="" accesskey="3">\n);
1122    $out .= "</form>\n";
1123
1124$out .= "��19990801�פΤ褦��8��ο����ǻ��ꤷ�Ʋ�������\n";
1125$out .= "<br>\n";
1126$out .= "</body></html>\n";
1127
1128
1129$out = &conv_html2onc($out, $baseuri, $baseuri, $ref_max, $flag_maru) if $use_onccnv;
1130$out = &convert2sjis($out) if $nkf; 	#NKF,jcode.pl���ѻ���sjis�Ѵ�
1131print $out;
1132}
1133
1134#�����ե������ɽ��
1135sub print_search_form {
1136if (!$use_onccnv) {
1137	$out .= "content-type: text/html\n\n";
1138}
1139$out .= "<html><head>\n";
1140$out .= "<!-- �� -->\n" if (!$nkf);
1141$out .= "</head>\n";
1142$out .= "<title>i search system</title>\n";
1143$out .= "<body>\n";
1144$out .= "<b>i search system</b><br>\n";
1145$out .= "Ǥ�դ�ñ��������ޤ���<br>\n";
1146
1147	if ($baseuri) {
1148		$out .= qq(<form method="GET" action="$baseuri">\n);
1149	} else {
1150		$out .= qq(<form method="GET" action="./">\n);
1151	}
1152
1153	$out .= qq(<input type="text" name="word" size=16>\n);
1154	$out .= qq(<input type="submit" name="g" value="" accesskey="3">\n);
1155    $out .= "</form>\n";
1156
1157$out .= "ñ������Ϥ���\n";
1158$out .= "3.���������ܥ�������Ʋ�������<br>\n";
1159
1160$out .= "<br>\n";
1161$out .= "����ɽ����Ȥ��ޤ�\n";
1162$out .= "</body></html>\n";
1163
1164$out = &conv_html2onc($out, $baseuri, $baseuri, $ref_max, $flag_maru) if $use_onccnv;
1165$out = &convert2sjis($out) if $nkf; 	#NKF,jcode.pl���ѻ���sjis�Ѵ�
1166print $out;
1167}
1168
1169#
1170# log����
1171#
1172sub logging {
1173# logging subroutine is based on
1174# tohoho wwwwcounter
1175# http://wakusei.cplaza.ne.jp/twn/wwwcount.htm
1176# thanks 2 tohoho
1177
1178# server setup
1179#
1180# $ mkdir lock
1181# $ touch isystem.cnt
1182# $ touch isystem.dat
1183# $ touch isystem.acc
1184# $ chmod 777 lock
1185# $ chmod 666 isystem.*
1186
1187# from 0.6.8
1188my $logdir, $count_name, $file_count, $file_date, $file_access, $file_lock;
1189
1190$logdir = $diarydir . "log/"; #hns�ξ��Ϥ����OK�ΤϤ�
1191
1192$count_name = "isystem";
1193$file_count  = $logdir . "$count_name" . ".cnt";
1194$file_date   = $logdir . "$count_name" . ".dat";
1195$file_access = $logdir . "$count_name" . ".acc";
1196# tnx 2 chihalin-3
1197$file_lock   = $logdir . "lock/isystem.loc";
1198
1199
1200#
1201# �Ķ��ѿ�TZ�����ܻ��֤����ꤹ��
1202#
1203$ENV{'TZ'} = "JST-9";
1204
1205#
1206# ����������
1207#
1208if ($do_file_lock) {
1209	foreach $i ( 1, 2, 3, 4, 5, 6 ) {
1210		if (mkdir("$file_lock", 0755)) {
1211			# ��å����������ν����ء�
1212			last;
1213		} elsif ($i == 1) {
1214			# 10ʬ�ʾ�Ť���å��ե�����Ϻ�����롣
1215			($mtime) = (stat($file_lock))[9];
1216			if ($mtime < time() - 600) {
1217				rmdir($file_lock);
1218			}
1219		} elsif ($i < 6) {
1220			# ��å����ԡ�1���Ԥäƺƥȥ饤��
1221			sleep(1);
1222		} else {
1223			# ���٤�äƤ��å����ԡ��������롣
1224			exit(1);
1225		}
1226	}
1227}
1228
1229#
1230# ����ǽ�λ���Ƥ��å��ե����뤬�Ĥ�ʤ��褦�ˤ���
1231#
1232$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";
1233
1234#
1235# ���������ե����뤫�饫�������ͤ��ɤ߽Ф���
1236#
1237if (open(IN, "< $file_count")) {
1238	$count = <IN>;
1239	close(IN);
1240} else {
1241	$count = -1;
1242}
1243
1244#print "count=$count\n";
1245#
1246# ���եե����뤫��ǽ������������դ��ɤ߽Ф���
1247#
1248if (open(IN, "< $file_date")) {
1249	$date_log = <IN>;
1250	close(IN);
1251} else {
1252	$date_log = "";
1253}
1254
1255#
1256# ���������դ�����
1257#
1258($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
1259$date_now = sprintf("%04d/%02d/%02d", 1900 + $year, $mon + 1, $mday);
1260$time_now = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
1261#print "$time_now\n";
1262
1263#
1264# ���դ��ۤʤ롢�Ĥޤꡢ�������ƤΥ��������Ǥ����
1265#
1266if ($date_log ne $date_now) {
1267#print "mail log\n";
1268
1269	#
1270	# ������������᡼�����������
1271	#
1272	if ($mailto ne "") {
1273		$tmp_count = 0;
1274		open(IN, "< $file_access");
1275		while (<IN>) {
1276			if (/^COUNT/) {
1277				$tmp_count++;
1278			}
1279		}
1280		close(IN);
1281		$msg = "";
1282		$msg .= "To: $mailto\n";
1283		$msg .= "From: $count_name\n";
1284		$msg .= "Subject: ACCESS $date_log $tmp_count\n";
1285		$msg .= "\n";
1286		if ($account_detail) {
1287			open(IN, "< $file_access");
1288			while (<IN>) {
1289				$msg .= $_;
1290			}
1291			close(IN);
1292		} else {
1293			$msg .= "Access = $tmp_count\n";
1294		}
1295		open(OUT, "| $sendmail $mailto");
1296		print OUT $msg;
1297		close(OUT);
1298	}
1299
1300	#
1301	# ��������������������
1302	#
1303	open(OUT, "> $file_access");
1304	close(OUT);
1305
1306	#
1307	# ���������դ����ե��ե�����˽��Ф�
1308	#
1309	open(OUT, "> $file_date");
1310	print(OUT "$date_now");
1311	close(OUT);
1312}
1313#
1314# ������ȥ��å׽���
1315#
1316#print "count up mae\n";
1317if ($count >= 0) {
1318#print "count up\n";
1319
1320	#
1321	# ��������ҤȤĥ�������Ȥ���
1322	#
1323	$count++;
1324
1325	#
1326	# %7E �� \~ �ʤɤ��������
1327	#
1328	$referer = $ENV{'HTTP_REFERER'};
1329	$referer =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
1330	$reffile =~ s/\\//g;
1331
1332	#
1333	# ������������Ͽ����
1334	#
1335	open(OUT, ">> $file_access");
1336	print(OUT "COUNT = [ $count ]\n");
1337	print(OUT "TIME  = [ $time_now ]\n");
1338	#print(OUT "ADDR  = [ $ENV{'REMOTE_ADDR'} ]\n");
1339	#if ($ENV{'REMOTE_HOST'} ne $ENV{'REMOTE_ADDR'}) {
1340		print(OUT "HOST  = [ $ENV{'REMOTE_HOST'} ]\n");
1341	#}
1342	print(OUT "AGENT = [ $ENV{'HTTP_USER_AGENT'} ]\n");
1343	# print(OUT "REFER = [ $referer ]\n");
1344	if ($reffile && (!$my_url || ($reffile !~ /$my_url/))) {
1345		print(OUT "FROM  = [ $reffile ]\n");
1346	}
1347	print(OUT "\n");
1348	close(OUT);
1349
1350	#
1351	# �������������ե�����˽��᤹
1352	#
1353	if (open(OUT, "> $file_count")) {
1354		print(OUT "$count");
1355		close(OUT);
1356	}
1357}
1358#
1359# ������������
1360#
1361if ($do_file_lock) {
1362	rmdir($file_lock);
1363}
1364
1365
1366
1367}
1368
1369# log�� lockfile����롼����
1370sub sigexit { rmdir($file_lock); exit(0); }
1371
1372
1373#�������ޤ���
1374sub search_word { # ����
1375	my ($word) = @_; #������
1376	my $hitcount = 0; #hit��
1377	my $bgncount = $FORM{b};	# �����ɽ�����Ϸ��
1378	my $totalhit = $FORM{h};	# ����������Ƚ��������Hit��
1379	my $bgnday = $FORM{t};		# ���������κǽ���
1380	my $bgnhit = $FORM{th};		# ���������κǽ����ޤǤΥҥåȿ�
1381
1382	if (!$use_onccnv) {
1383		$out .= "content-type: text/html\n\n"; #apache�к�? ari-3
1384	}
1385	$out .= "<html><head>\n";
1386	$out .= "<!-- �� -->\n" if (!$nkf);
1387	$out .= "</head>\n";
1388	$out .= "<title>result</title>\n";
1389	$out .= "<body>\n";
1390	$out .= "<b>�������</b><br>\n";
1391
1392	$word = convert2euc($word) if ($nkf); # EUC���Ѵ�����
1393	#���졩jcode.pl��ȤäƤʤ��Ȥ��Ϥɤ���������????
1394
1395#	print $word;
1396
1397	# �ե������pick up masato-3
1398	my @a;
1399	for my $y ($year-1..$year) {	# ��ǯ�ȵ�ǯ���������о�
1400		opendir DIR, "$diarydir$y" || next;
1401		push(@a, (sort grep s/^(d\d+\.hnf)$/$diarydir$y\/$1/, readdir DIR));
1402		closedir DIR;
1403	}
1404	@a = sort { $b cmp $a } @a;	# �¤��ؤ�(�߽�)
1405	#����ǡ��ǿ���hnf�������¤�Ǥ���Ϥ���
1406
1407	if (!$maxday) {
1408		$maxday = 60;	  #�ǥե���ȤǺ���60������
1409	}
1410	if ($#a < $maxday) {	  #���ʤ��Ȥ�
1411		$maxday = $#a + 1;
1412	}
1413	@a = @a[0 .. $maxday-1];  #��������ʬ�����ˤ���
1414	if (!$maxresult) {	  #�ǥե���Ȥ�10�鷺��ɽ��
1415		$maxresult = 10;
1416	}
1417
1418	if ($bgnday ne '') {	# ���������˴��˸��������������Ф�
1419		my $f;
1420	    while ($f = shift(@a)) {
1421			if (($f =~ /d(\d{8})\.hnf/) && ($1 le $bgnday)) {
1422				unshift(@a, $f);
1423				last;
1424			}
1425		}
1426	    $hitcount = $bgnhit;	# �ҥåȿ���Ĵ��(^^)
1427	}
1428
1429	my $day;
1430	my $day2;
1431	my $lastdday;
1432	my $lastdhit;
1433	SEARCH: foreach my $f (@a) {
1434	  $ok = 0; #�桼���ѿ��������ʤ��褦�˽����
1435	  $newcount = 0;
1436	  $subcount = 0;
1437	  if ($f =~ /d(\d{8})\.hnf/) {
1438		$day = $day2 = $1;
1439	  } else {
1440	    next;
1441	  }
1442	  $day2 =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1\/$2\/$3/;
1443	  open(IN, $f); # �ǿ��Υե����뤫���˳���
1444	  while(<IN>) {
1445	    $_ = convert2euc($_) if ($hnfconv and $nkf);
1446	    s/\r$//;
1447	    chomp;			 # ���Խ���
1448	    $o = &parse($_); # ����
1449	    next if ($o !~ /$word/i); #���פ��ʤ��ΤǼ��ι�
1450	    #$out .= $o; # for debug
1451	    $u = "?$day" . "S" . "$newcount";
1452	    next if ($u eq $lastu); #��ۤɤ�url(NEW,SUB)��Ʊ���ʤΤǥȥХ�
1453
1454	    if ($bgncount <= $hitcount && $hitcount < $bgncount+$maxresult) {
1455	      #$out .= "��<a href=$u>$day2:$newtopic:$subtopic</a> \n";
1456	      $out .= "��" . make_self_link("$u") . "$day2:$newcount:$subcount</a> \n";
1457	      s/($word)/<b>$1<\/b>/ig;
1458	      s/^(LNEW|LSUB|LSTRIKE|LSTRONG|LINK|URL|RLNEW|RLSUB)\s\S+//;
1459	      # LNEW, LSUB, LSTRIKE, LSTRONG �ʤ���uri�������ޤ���
1460	      s/^[A-Z]+\s//; # hnf���ޥ�ɤ�����
1461	      s/~$//;		 # ���Ԥ�'~'�����
1462	      $out .= "$_<br>\n";
1463	      $lastvc = $hitcount;
1464		  if ($lastdday ne $day) {
1465		    $lastdhit = $hitcount;
1466		  }
1467		  $lastdday = $day;
1468	    }
1469	    $lastu = $u;
1470	    $lastc = $hitcount;
1471	    $hitcount++;
1472		if ($totalhit && ($hitcount >= $maxresult+$bgncount)) {
1473		  # ���٤�ɽ���Ǥ�������ã�����Τ���ҥåȿ���
1474		  # ����������������ҥåȿ����ִ����ƥ��
1475		  $hitcount = $totalhit;
1476	      last SEARCH;
1477		}
1478	  }
1479	  close(IN);
1480	}
1481
1482	$out .= sprintf("<hr>$hitcount����(%d��%d)<br>\n", $bgncount+1, $lastvc+1);
1483
1484	# ����$maxresult��
1485	if ($bgncount >= $maxresult) {
1486	  $u = sprintf("?word=%s&b=%d&h=%d", $origword, $bgncount-$maxresult, $hitcount);
1487	  $out .= make_self_link("$u", "1") . "[��$maxresult��]</a>\n";
1488	}
1489	# ����
1490	&ichiran;
1491	# ����$maxresult��
1492	if ($bgncount < $hitcount - $maxresult) {
1493#	  $u = sprintf("?word=%s&b=%d&h=%d", $origword, $bgncount+$maxresult, $hitcount);
1494	  $u = sprintf("?word=%s&b=%d&h=%d&t=%s&th=%d", $origword, $bgncount+$maxresult, $hitcount, $lastdday, $lastdhit);
1495	  # URI�Ȥ����Ϥ�word��URL encode����Ƥ��ʤ��ƤϤʤ�ʤ�!
1496	  $out .= make_self_link("$u", "3") . "[��$maxresult��]</a>\n";
1497	}
1498	$out .= "</body></html>\n";
1499
1500	$out = &conv_html2onc($out, $baseuri, $baseuri, $ref_max, $flag_maru) if $use_onccnv;
1501	$out = &convert2sjis($out) if $nkf; 	#NKF,jcode.pl���ѻ���sjis�Ѵ�
1502	print $out;
1503
1504}
1505
1506#[����]��ɽ������
1507sub ichiran {
1508	$u = "?$day";
1509	$out .= make_self_link("$u", "2") . "[����]</a>\n";
1510}
1511
1512# HTML��ǥ��������פ���ʸ�����Ѵ�
1513sub html_escape {
1514	my ($t) = @_;
1515	my %cv = ('&' => '&amp;', '"' => '&quot;',
1516		  '<' => '&lt;',  '>' => '&gt;');
1517	$t =~ s/([&<>"])/$cv{$1}||$1/ge;
1518	$t;
1519}
1520
1521# HTML��ǥ��������פ���ʸ��������ʸ�����Ѵ�
1522sub html_escape_zen {
1523	my ($t) = @_;
1524	my %zcv = ('&' => '��', '"' => '��',
1525		   '<' => '��', '>' => '��');
1526	$t =~ s/([&<>"])/$zcv{$1}||$1/ge;
1527	$t;
1528}
1529
1530# ���������ɤ�EUC���Ѵ�
1531sub convert2euc {
1532	my ($tmp) = @_;
1533	if ($nkf == 1) {
1534		$tmp = nkf('-e', $tmp);
1535	} elsif ($nkf == 2) {
1536		jcode::convert(\$tmp, "euc");
1537	}
1538	$tmp;
1539}
1540
1541# ���������ɤ�Shift JIS���Ѵ�
1542sub convert2sjis {
1543	my ($tmp) = @_;
1544	if ($nkf == 1) {
1545		$tmp = nkf('-s', $tmp);
1546	} elsif ($nkf == 2) {
1547		jcode::convert(\$tmp, "sjis");
1548	}
1549	$tmp;
1550}
1551
1552# ����ǯ�������
1553sub month_days {
1554	# hns��Date.pm���ͤ˽�ľ��
1555	my ($y, $m) = @_;
1556	my @days = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
1557	if ($m == 2 && (($y%4==0 && $y%100) || ($y==400))) {
1558		return 29;
1559	} else {
1560		return $days[$m];
1561	}
1562}
1563
1564# ���
1565sub next_month {
1566	my ($y, $m) = @_;
1567	$m++;
1568	if ($m > 12) {
1569		$m = 1;
1570		$y++;
1571	}
1572	$m = sprintf("%02d", $m);
1573	return ($y, $m);
1574}
1575
1576# hnf�ե�����Υե�ѥ�̾����
1577sub make_hnf_fname {
1578	my ($f) = @_;
1579    my ($day, $year);
1580	if ($f =~ /d((\d{4})\d\d\d\d)\.hnf/) {	# ������ d19991231.hnf �Ȥ�
1581		$day = $1;
1582		$year = $2;
1583	} elsif ($f =~ /^((\d{4})\d\d\d\d)$/) {	# ������ 19991231 �Ȥ�
1584		$day = $1;
1585		$year = $2;
1586	}
1587	return "$diarydir$year/d$day.hnf";
1588}
1589
1590sub make_self_link {
1591	my ($u, $accesskey) = @_;
1592	# $accesskey = 0 ���б� (00/7/5 yar-3)
1593	my @IGraph = ("&#63888;", #0,1,2,3,..�Ȥʤ��Ǥ���
1594		"&#63879;", "&#63880;", "&#63881;", "&#63882;",
1595	      "&#63883;", "&#63884;", "&#63885;", "&#63886;", "&#63887;");
1596	if ($imode) {
1597		if ($accesskey ne "") {
1598			qq(<a href="$u" accesskey="$accesskey">$IGraph[$accesskey]);
1599		} else {
1600			qq(<a href="$u">$imode_graphic);
1601		}
1602	} elsif ($ezweb && $baseuri) {
1603		qq(<a href="$baseuri$u">);
1604	} else {
1605		qq(<a href="$u">);
1606	}
1607}
1608sub make_link {
1609	my ($u) = @_;
1610# $imodegw ��������Ƥ����ȡ������ͳ�ǥ�����������褦�ˤʤ롣
1611
1612	qq(<a href="$imodegw$u">);
1613}
1614
1615# hnf�ե������OK�����뤫�ɤ��������å�
1616sub has_ok {
1617	my ($file) = @_;
1618	local (*F);
1619	open (F, $file);
1620    while (<F>) {
1621		s/\r$//;
1622		chomp;
1623		if (/^OK$/ ) {
1624			close F;
1625			return 1;
1626		}
1627	}
1628	close F;
1629	return 0;
1630}
1631
1632
1633#<body>��������������
1634sub make_body {
1635	$out .= "<body>\n";
1636	#print "day=$day\n";
1637
1638	$imark = "";
1639	if ($imode) { #iMODE���Ӥǥ������������iMODE mark���Ǥ�
1640		$imark = "&#63862;"; #iMODE mark
1641	} #�ۤ��δĶ���iMODE��ʸ����ɽ�������ʸ���������ޤ�
1642	if (!$section) { # title�⡼�ɤΤȤ����������ȥ��ɽ��
1643		if ($head eq ""){   # h1�����Ǥ�������
1644			$out .= "<h1>$imark$title</h1>\n";
1645		} else {
1646			$out .= "<h1>$imark$head</h1>\n";
1647		}
1648		$out .= "<hr>\n";
1649	}
1650
1651	$out .= "$head\n" if ($pdx); #PmailDX�λ���$head��ɽ��
1652	$out .= "$header\n"; #ʸƬ
1653
1654	if ($section eq "ALL") { #������(C)tokumi-3 �ΤȤ�
1655		$out .= &fileprint($confdir . $titleheadfile) if ($titleheadfile);
1656	} elsif ($section) { #���������ɽ���ΤȤ���
1657		$out .= &fileprint($confdir . $headfile) if ($headfile);
1658	} else { #�����ȥ�⡼��
1659		$out .= &fileprint($confdir . $titleheadfile) if ($titleheadfile);
1660	}
1661
1662	&make_diary_body; #������������������
1663	if ($piloweb and $piloweb_2days) { #piloweb�ǤΥ��������Ǥ��ģ���ɽ��
1664		$hnf = make_hnf_fname($prevday); #���������ե�����ˤ���
1665		$day = $prevday;
1666		&make_diary_body;
1667	}
1668
1669	if ($footfile ne ""){
1670		$path = $confdir . $footfile;
1671		$out .= &fileprint($path); #ʸ���β���
1672	}
1673
1674	if ($address ne "") {
1675		$out .= "<br>" if $use_onccnv;
1676		$out .= "<address><a href=mailto:$address>$address</a></address>\n"; #�ᥤ�륢�ɥ쥹
1677	}
1678	$out .= "</body>\n";
1679}
1680
1681
1682sub make_diary_body {
1683	my $tmp, $i, @sect, $o;
1684	@sect = ();
1685	$newcount = 0;
1686
1687	&dayprint; #���դ�ɽ��
1688
1689	open(IN, $hnf); #����hnf����
1690	$ok = 0; #�桼���ѿ���ɽ�����ʤ��褦��
1691
1692	if ($section) { #������titleɽ���ǤϤʤ�
1693		while($tmp = <IN>) {
1694			$tmp = convert2euc($tmp) if ($hnfconv and $nkf); #hnf��EUC�ʳ��ǽ���Ƥ����
1695			$tmp =~ s/\r$//;
1696			chomp($tmp); #���Ԥ���Ȥ�
1697			$o = &parse($tmp); #��᤹��
1698			$sect[$newcount] .= "$o\n" unless ($grp);
1699		}
1700		if ($section eq "ALL") { # �����������ɽ��
1701			if ($reverse) { #�ս�
1702				for($i=$newcount; $i >=0; $i--) {
1703					$out .= "$sect[$i]\n";
1704				}
1705			} else { # �̾�
1706				for($i=0; $i <=$newcount; $i++) {
1707					$out .= "$sect[$i]\n";
1708				}
1709			}
1710		} else { #���ꥻ�������Τ�
1711			$out .= "$sect[$section]\n";
1712		}
1713		# ɽ�������
1714		$out .= "<hr>\n"; #���ڤ�
1715		&section_jump() if ($section ne "ALL"); #����ɽ���λ��ʳ���jump�������ɽ��
1716	} else { # ������titleɽ���ʤ�
1717		if ($plan) {
1718			&planprint(); #ͽ��
1719		} elsif ($todo) {
1720			&todoprint(); #TODO
1721		} else {
1722			&title(); #�����ȥ����
1723		}
1724	}
1725	close(IN);
1726}
1727
1728
1729# i system history
1730# yns(1999/9) > mns(1999/10) > mns for iMODE(2000/1) > i system(2000/2)
1731# yns: yar-3 nikki system
1732# mns: MIOMIO nikki system
1733#
1734# version up list
1735#                     with many users.......
1736# 2000/05/26 0.7.4 yar-3 fix list.cgi mode
1737# 2000/05/26 0.7.3 yar-3 fix SALL
1738# 2000/05/16 0.7.2 yar-3 show titleheadfile when SALL and piloweb
1739# 2000/05/16 0.7.1 masato-3 repeat plan with range
1740# 2000/05/15 0.7.0 yar-3 RIS reverse, piloweb_2days
1741# 2000/05/15 0.6.9 chihalin-3 fix NEW bug, no caption section
1742# 2000/05/12 0.6.8 yar-3 fix ichiran bug
1743# 2000/05/12 0.6.7 chihalin-3 maenohi bug fixed
1744# 2000/05/11 0.6.6 tagoh-3 title, color bug fixed
1745# 2000/05/10 0.6.5 tagoh-3 RLNEW,RLSUB problem fixed
1746# 2000/05/10 0.6.4 ari-3 TSUGI problem fixed
1747# 2000/04/23 0.6.3 yar-3 cat on/off
1748# 2000/04/10 0.6.2 yar-3 use istyle tag
1749# 2000/04/10 0.6.1 chihalin-3 patched
1750# 2000/04/10 0.6.0 masato-3 default day user var
1751# 2000/04/09 0.5.9 yar-3 fix color imode bug
1752# 2000/04/06 0.5.8 yar-3,masato-3 pilo ua, fix default day
1753# 2000/04/06 0.5.7 yar-3 default day, Piloweb(P option)
1754# 2000/03/31 0.5.6 yar-3 BIG
1755# 2000/03/30 0.5.5 yar-3,masato-3 small, plan sort
1756# 2000/03/28 0.5.4 yar-3 title modify
1757# 2000/03/28 0.5.3 yar-3 color iMODE
1758# 2000/03/27 0.5.2 yar-3 MARK cmd
1759# 2000/03/24 0.5.1 masato-3 repeat plan
1760# 2000/03/15 0.5   masato-3 new generation monthly, yearly
1761# 2000/03/13 0.4.13 yar-3,masato-3 yearly plan
1762# 2000/03/10 0.4.12 masato-3 fix monthly plan bug
1763# 2000/03/08 0.4.11 masato-3 fix monthly plan bug, modify getdayoftheweek
1764#                   month-end plan support
1765# 2000/03/06 0.4.10 yar-3 monthly plan
1766# 2000/03/06 0.4.9 masato-3 NKF.pm
1767# 2000/03/02 0.4.8 northeye-3,masato-3 quote, counter file, PDXGW
1768# 2000/03/01 0.4.7 yar-3 RLNEW,RLSUB support, faster search
1769# 2000/03/01 0.4.6 masato-3 many bugs fixed and add new functions
1770#                  onccnv.pl plan(ABC), &, glob, capital
1771# 2000/02/25 0.4.5 yar-3 fix user-var search bug
1772# 2000/02/24 0.4.4 chihalin-3 lock file fixed(logging)
1773# 2000/02/24 0.4.3 masato-3 patched(maxresult,fix LI,DT,DD etc)
1774#                  yar-3 fix <> bug, maxresult bug(url encode)
1775# 2000/02/23 0.4.2 masato-3 patched(smarten,plan bug,search print)
1776#                  yar-3 support {jis|sjis} hnf
1777# 2000/02/22 0.4.1 masato-3 patched(sort,todo,dayoftheweek)
1778# 2000/02/22 0.4.0 yar-3 brush up
1779# 2000/02/22 0.3.5 ari-3 patched
1780# 2000/02/21 0.3.4 yar-3 search bug fix(regexp etc...)
1781# 2000/02/21 0.3.3 yar-3 i search system
1782# 2000/02/21 0.3.2 yar-3 with jcode.pl
1783# 2000/02/18 0.3.1 yar-3 PLAN,TODO
1784# 2000/02/17 0.3.0 yar-3 ez logger
1785# 2000/02/17 0.2.9 yar-3 jump refined $baseuri set
1786# 2000/02/17 0.2.8 yar-3 P fixed
1787# 2000/02/15 0.2.7 yar-3 ALL sections show
1788# 2000/02/15 0.2.6 ari-3 Lynx patched (SUB on title)
1789# 2000/02/15 0.2.5 yar-3 PDXGW(-H") patched
1790# 2000/02/15 0.2.4 key-3 iMODE char accesskey patched
1791# 2000/02/15 0.2.3 yar-3 RLINK
1792# 2000/02/15 0.2.2 yar-3 ALIAS problem fixed
1793# 2000/02/14 0.2.1 ari-3 patched (headfile, URL problem, SJIS)
1794# 2000/02/13 0.2.0 yar-3 (NEW fixed)
1795# 2000/02/13 0.1.7 key-3 patched (title,author, SUB problem)
1796# 2000/02/13 0.1.6 kenji-3 patched (GRP)
1797# 2000/02/13 0.1.5 masato-3 patched (without CGI.pm)
1798# 2000/02/04 by yar-3
1799# original 1999/10/06 by yar-3
1800#
1801#
1802# thanks 2 all users.
1803#                          1999,2000,2001 (C)yar-3 All rights reserved.
1804
1805
1806
1807
1808
1809
1810