カーネルソースのhtml化


globalでhtml化すると、トップホルダーに3つのフレームを有するindex.htmlが作成され、関数/マクロ定義をアルファベットで参照するdefine.htmlがその一つに割り当てられのですが、あやふやな関数を参照するにはカーネルソースのトップホルダーからfindコマンドとgrepコマンドで検索しています。そこで、globalで作成されたhtmlファイルに検索機能を付加することにいたしました。

とりあえず私の場合、以下のオプションで作成しました。
[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として処理しています。


最終更新 2011/02/04 01:41:01 - north
(2010/11/10 01:58:23 作成)


検索

アクセス数
3689219
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。