カーネルソースのhtml化
globalでhtml化すると、トップホルダーに3つのフレームを有するindex.htmlが作成され、関数/マクロ定義をアルファベットで参照するdefine.htmlがその一つに割り当てられのですが、あやふやな関数を参照するにはカーネルソースのトップホルダーからfindコマンドとgrepコマンドで検索しています。そこで、globalで作成されたhtmlファイルに検索機能を付加することにいたしました。
とりあえず私の場合、以下のオプションで作成しました。
globalで作成したhtmlファイルのトップホルダーのdefine.htmlにformタグでaction=gkernel_grep.pl,target="mains"として検索フォームを追加します。
grepでkernel_csvを検索しているため、3項目めの関数/マクロの項目だけでなく、2項目めのソースファイル名にもマッチしてしまいます。自分の環境ではMySqlの勉強もかねてこの部分をDBとして処理しています。
とりあえず私の場合、以下のオプションで作成しました。
[root@KURO-BOXHG test]# htags -gsaFまず、検索する関数/マクロ定義ファイルを作成します。defines/ホルダー下のhtmlファイルは<li>タグでソースhtmlファイル、ソースファイル名、関数/マクロ名となっていて、mkcsv.plで、defines/ホルダー下のすべてのhtmlから、上記3つの項目を抜き出したファイルを作成します。ちなにも600000行を超えていました。
<meta name='generator' content='GLOBAL-5.7.6'> </head> <body text='#191970' bgcolor='#f5f5dc' vlink='gray'> <h2>[u]</h2> <a href='../defines.html' title='Index Page'>[..]</a> <ol> <li><a href='../D/602711.html' target='mains' title='Multiple defined in 2 places.'>u</a> <li><a href='../S/1746.html#L54' target='mains' title='Defined at 54 in include/crypto/b128ops.h.'>u128</a> <li><a href='../S/1746.html#L64' target='mains' title='Defined at 64 in include/crypto/b128ops.h.'>u128_xor</a> : : <li><a href='../S/11538.html#L183' target='mains' title='Defined at 183 in drivers/usb/host/u132-hcd.c.'>u132</a> <li><a href='../S/11538.html#L124' target='mains' title='Defined at 124 in drivers/usb/host/u132-hcd.c.'>u132_addr</a>
mkcsv.pl
#!/usr/bin/perl use strict; my (@file,@sfile); use constant KERNEL_FILE => "/var/www/lighttpd/linux/defines/"; opendir(DIR,KERNEL_FILE); @file = readdir(DIR); closedir(DIR); @sfile = sort(@file); foreach (@sfile) { &mk_data($_); } sub mk_data { my $xx; if ($_ ne "." && $_ ne "..") { open(IN, KERNEL_FILE.$_); while ($xx = <IN>) { if ($xx =~ /<li>/) { $xx =~ /href='\.\.\/(.+?)'.*in\s(.*)\.'>(.*)<\/a>/; print $1.",".$2.",".$3."\n"; } } close(IN); } }
[root@localhost kitamura]# ./mkcsv.pl > kernel_func
kernel_func
D/1.html,15 places,A D/2.html,2 places,A0 S/26626.html#L376,arch/x86/kernel/visws_quirks.c,A01234 : : S/10789.html#L215,drivers/char/scc.h,A1CR_CLKMODE_x32 :カーネルソースの項目がplacesとなっているのは、その関数/マクロが複数定義されていることだそうです。
globalで作成したhtmlファイルのトップホルダーのdefine.htmlにformタグでaction=gkernel_grep.pl,target="mains"として検索フォームを追加します。
defines.html
<head> <title>DEFINITIONS</title> <meta name='robots' content='noindex,nofollow'> <meta name='generator' content='GLOBAL-5.7.6'> </head> <body text='#191970' bgcolor='#f5f5dc' vlink='gray'> <h2><a href='defines.html'>DEFINITIONS</a></h2> <form action="kernel_grep.pl" target="mains" method="post"> <=追加 <input type="text" name="name" size="15"> <=追加 <input type="submit" value="fnd"><input type="reset" value="rst"> <=追加 </form> <=追加 <a href='defines/A.html' title='26967 definitions'>[A]</a> <a href='defines/B.html' title='17668 definitions'>[B]</a> <a href='defines/C.html' title='27910 definitions'>[C]</a> : :
kernel_grep.pl
#!/usr/bin/perl use strict; my $KERNEL_URL = "http://192.168.200.150/linux/"; my $CSV_FILE= "/var/www/lighttpd/linux/kernel_csv"; my $PostData; print "Content-type: text/html\n\n"; read (STDIN, $PostData, $ENV{'CONTENT_LENGTH'}); my($name, $value) = split(/=/, $PostData); if (length($value)) { $value =~ tr/+/ /; my $grep =`grep '$value' '$CSV_FILE'`; if (length($grep)) { &mkhtml($grep); } else { print "NO FOUND"; } } else { print "NO KEY"; } sub mkhtml { my @strlist = split(/\n/, $_[0]); print "<table>"; foreach (@strlist) { my @line = split(/,/, $_); print "<tr>"; print "<td>$line[2]</td>"; print "<td><a href=\'$KERNEL_URL$line[0]\'>$line[1]</a></td>"; print "</tr>"; } print "</table>"; }
grepでkernel_csvを検索しているため、3項目めの関数/マクロの項目だけでなく、2項目めのソースファイル名にもマッチしてしまいます。自分の環境ではMySqlの勉強もかねてこの部分をDBとして処理しています。