📄 kernel-doc
字号:
#!/usr/bin/perl## Copyright (c) 1998 Michael Zucchi, All Rights Reserved #### Copyright (C) 2000 Tim Waugh <twaugh@redhat.com> #### #### This software falls under the GNU General Public License. #### Please read the COPYING file for more information #### This will read a 'c' file and scan for embedded comments in the# style of gnome comments (+minor extensions - see below).## Note: This only supports 'c'.# usage:# kerneldoc [ -docbook | -html | -text | -man ]# [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile# or# [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile## Set output format using one of -docbook -html -text or -man. Default is man.## -function funcname# If set, then only generate documentation for the given function(s). All# other functions are ignored.## -nofunction funcname# If set, then only generate documentation for the other function(s). All# other functions are ignored. Cannot be used with -function together# (yes thats a bug - perl hackers can fix it 8))## c files - list of 'c' files to process## All output goes to stdout, with errors to stderr.## format of comments.# In the following table, (...)? signifies optional structure.# (...)* signifies 0 or more structure elements# /**# * function_name(:)? (- short description)?# (* @parameterx: (description of parameter x)?)*# (* a blank line)?# * (Description:)? (Description of function)?# * (section header: (section description)? )*# (*)?*/## So .. the trivial example would be:## /**# * my_function# **/## If the Description: header tag is ommitted, then there must be a blank line# after the last parameter specification.# e.g.# /**# * my_function - does my stuff# * @my_arg: its mine damnit# *# * Does my stuff explained. # */## or, could also use:# /**# * my_function - does my stuff# * @my_arg: its mine damnit# * Description: Does my stuff explained. # */# etc.## All descriptions can be multiline, apart from the short function description.## All descriptive text is further processed, scanning for the following special# patterns, which are highlighted appropriately.## 'funcname()' - function# '$ENVVAR' - environmental variable# '&struct_name' - name of a structure (up to two words including 'struct')# '@parameter' - name of a parameter# '%CONST' - name of a constant.# match expressions used to find embedded type information$type_constant = "\\\%([-_\\w]+)";$type_func = "(\\w+)\\(\\)";$type_param = "\\\@(\\w+)";$type_struct = "\\\&((struct\\s*)?\\w+)";$type_env = "(\\\$\\w+)";# Output conversion substitutions.# One for each output format# these work fairly well%highlights_html = ( $type_constant, "<i>\$1</i>", $type_func, "<b>\$1</b>", $type_struct, "<i>\$1</i>", $type_param, "<tt><b>\$1</b></tt>" );$blankline_html = "<p>";# sgml, docbook format%highlights_sgml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>", $type_constant, "<constant>\$1</constant>", $type_func, "<function>\$1</function>", $type_struct, "<structname>\$1</structname>", $type_env, "<envar>\$1</envar>", $type_param, "<parameter>\$1</parameter>" );$blankline_sgml = "</para><para>\n";# gnome, docbook format%highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>", $type_func, "<function>\$1</function>", $type_struct, "<structname>\$1</structname>", $type_env, "<envar>\$1</envar>", $type_param, "<parameter>\$1</parameter>" );$blankline_gnome = "</para><para>\n";# these are pretty rough%highlights_man = ( $type_constant, "\$1", $type_func, "\\\\fB\$1\\\\fP", $type_struct, "\\\\fI\$1\\\\fP", $type_param, "\\\\fI\$1\\\\fP" );$blankline_man = "";# text-mode%highlights_text = ( $type_constant, "\$1", $type_func, "\$1", $type_struct, "\$1", $type_param, "\$1" );$blankline_text = "";sub usage { print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man ]\n"; print " [ -function funcname [ -function funcname ...] ]\n"; print " [ -nofunction funcname [ -nofunction funcname ...] ]\n"; print " c source file(s) > outputfile\n"; exit 1;}# read argumentsif ($#ARGV==-1) { usage();}$verbose = 0;$output_mode = "man";%highlights = %highlights_man;$blankline = $blankline_man;$modulename = "API Documentation";$function_only = 0;while ($ARGV[0] =~ m/^-(.*)/) { $cmd = shift @ARGV; if ($cmd eq "-html") { $output_mode = "html"; %highlights = %highlights_html; $blankline = $blankline_html; } elsif ($cmd eq "-man") { $output_mode = "man"; %highlights = %highlights_man; $blankline = $blankline_man; } elsif ($cmd eq "-text") { $output_mode = "text"; %highlights = %highlights_text; $blankline = $blankline_text; } elsif ($cmd eq "-docbook") { $output_mode = "sgml"; %highlights = %highlights_sgml; $blankline = $blankline_sgml; } elsif ($cmd eq "-gnome") { $output_mode = "gnome"; %highlights = %highlights_gnome; $blankline = $blankline_gnome; } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling document $modulename = shift @ARGV; } elsif ($cmd eq "-function") { # to only output specific functions $function_only = 1; $function = shift @ARGV; $function_table{$function} = 1; } elsif ($cmd eq "-nofunction") { # to only output specific functions $function_only = 2; $function = shift @ARGV; $function_table{$function} = 1; } elsif ($cmd eq "-v") { $verbose = 1; } elsif (($cmd eq "-h") || ($cmd eq "--help")) { usage(); }}# generate a sequence of code that will splice in highlighting information# using the s// operator.$dohighlight = "";foreach $pattern (keys %highlights) {# print "scanning pattern $pattern ($highlights{$pattern})\n"; $dohighlight .= "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n";}### dumps section contents to arrays/hashes intended for that purpose.#sub dump_section { my $name = shift @_; my $contents = join "\n", @_; if ($name =~ m/$type_constant/) { $name = $1;# print STDERR "constant section '$1' = '$contents'\n"; $constants{$name} = $contents; } elsif ($name =~ m/$type_param/) {# print STDERR "parameter def '$1' = '$contents'\n"; $name = $1; $parameters{$name} = $contents; } else {# print STDERR "other section '$name' = '$contents'\n"; $sections{$name} = $contents; push @sectionlist, $name; }}### output function## parameters, a hash.# function => "function name"# parameterlist => @list of parameters# parameters => %parameter descriptions# sectionlist => @list of sections# sections => %descriont descriptions# sub output_highlight { my $contents = join "\n", @_; my $line; eval $dohighlight; foreach $line (split "\n", $contents) { if ($line eq ""){ print $lineprefix, $blankline; } else { $line =~ s/\\\\\\/\&/g; print $lineprefix, $line; } print "\n"; }}# output in htmlsub output_html { my %args = %{$_[0]}; my ($parameter, $section); my $count; print "<h2>Function</h2>\n"; print "<i>".$args{'functiontype'}."</i>\n"; print "<b>".$args{'function'}."</b>\n"; print "("; $count = 0; foreach $parameter (@{$args{'parameterlist'}}) { $type = $args{'parametertypes'}{$parameter}; if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { # pointer-to-function print "<i>$1</i><b>$parameter</b>) <i>($2)</i>"; } else { print "<i>".$type."</i> <b>".$parameter."</b>"; } if ($count != $#{$args{'parameterlist'}}) { $count++; print ",\n"; } } print ")\n"; print "<h3>Arguments</h3>\n"; print "<dl>\n"; foreach $parameter (@{$args{'parameterlist'}}) { print "<dt><b>".$parameter."</b>\n"; print "<dd>"; output_highlight($args{'parameters'}{$parameter}); } print "</dl>\n"; foreach $section (@{$args{'sectionlist'}}) { print "<h3>$section</h3>\n"; print "<blockquote>\n"; output_highlight($args{'sections'}{$section}); print "</blockquote>\n"; } print "<hr>\n";}# output in htmlsub output_intro_html { my %args = %{$_[0]}; my ($parameter, $section); my $count; foreach $section (@{$args{'sectionlist'}}) { print "<h3>$section</h3>\n"; print "<ul>\n"; output_highlight($args{'sections'}{$section}); print "</ul>\n"; } print "<hr>\n";}# output in sgml DocBooksub output_sgml { my %args = %{$_[0]}; my ($parameter, $section); my $count; my $id; $id = "API-".$args{'function'}; $id =~ s/[^A-Za-z0-9]/-/g; print "<refentry>\n"; print "<refmeta>\n"; print "<refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></refentrytitle>\n"; print "</refmeta>\n"; print "<refnamediv>\n"; print " <refname>".$args{'function'}."</refname>\n"; print " <refpurpose>\n"; print " ".$args{'purpose'}."\n"; print " </refpurpose>\n"; print "</refnamediv>\n"; print "<refsynopsisdiv>\n"; print " <title>Synopsis</title>\n"; print " <funcsynopsis>\n"; print " <funcdef>".$args{'functiontype'}." "; print "<function>".$args{'function'}." "; print "</function></funcdef>\n";# print "<refsect1>\n";# print " <title>Synopsis</title>\n";# print " <funcsynopsis>\n";# print " <funcdef>".$args{'functiontype'}." ";# print "<function>".$args{'function'}." ";# print "</function></funcdef>\n"; $count = 0; if ($#{$args{'parameterlist'}} >= 0) { foreach $parameter (@{$args{'parameterlist'}}) { $type = $args{'parametertypes'}{$parameter}; if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { # pointer-to-function print " <paramdef>$1<parameter>$parameter</parameter>)\n"; print " <funcparams>$2</funcparams></paramdef>\n"; } else { print " <paramdef>".$type; print " <parameter>$parameter</parameter></paramdef>\n"; } } } else { print " <void>\n"; } print " </funcsynopsis>\n"; print "</refsynopsisdiv>\n";# print "</refsect1>\n"; # print parameters print "<refsect1>\n <title>Arguments</title>\n";# print "<para>\nArguments\n"; if ($#{$args{'parameterlist'}} >= 0) { print " <variablelist>\n"; foreach $parameter (@{$args{'parameterlist'}}) { print " <varlistentry>\n <term><parameter>$parameter</parameter></term>\n"; print " <listitem>\n <para>\n"; $lineprefix=" "; output_highlight($args{'parameters'}{$parameter}); print " </para>\n </listitem>\n </varlistentry>\n"; } print " </variablelist>\n"; } else { print " <para>\n None\n </para>\n"; } print "</refsect1>\n"; # print out each section $lineprefix=" "; foreach $section (@{$args{'sectionlist'}}) { print "<refsect1>\n <title>$section</title>\n <para>\n";# print "<para>\n$section\n"; if ($section =~ m/EXAMPLE/i) { print "<example><para>\n"; } output_highlight($args{'sections'}{$section});# print "</para>"; if ($section =~ m/EXAMPLE/i) { print "</para></example>\n"; } print " </para>\n</refsect1>\n"; } print "</refentry>\n\n";}# output in sgml DocBooksub output_intro_sgml { my %args = %{$_[0]}; my ($parameter, $section); my $count; my $id; $id = $args{'module'}; $id =~ s/[^A-Za-z0-9]/-/g; # print out each section $lineprefix=" "; foreach $section (@{$args{'sectionlist'}}) { print "<refsect1>\n <title>$section</title>\n <para>\n";# print "<para>\n$section\n"; if ($section =~ m/EXAMPLE/i) { print "<example><para>\n"; } output_highlight($args{'sections'}{$section});# print "</para>"; if ($section =~ m/EXAMPLE/i) { print "</para></example>\n"; } print " </para>\n</refsect1>\n"; } print "\n\n";}# output in sgml DocBooksub output_gnome { my %args = %{$_[0]}; my ($parameter, $section); my $count; my $id; $id = $args{'module'}."-".$args{'function'}; $id =~ s/[^A-Za-z0-9]/-/g; print "<sect2>\n"; print " <title id=\"$id\">".$args{'function'}."</title>\n";# print "<simplesect>\n";# print " <title>Synopsis</title>\n"; print " <funcsynopsis>\n"; print " <funcdef>".$args{'functiontype'}." "; print "<function>".$args{'function'}." "; print "</function></funcdef>\n"; $count = 0; if ($#{$args{'parameterlist'}} >= 0) { foreach $parameter (@{$args{'parameterlist'}}) { $type = $args{'parametertypes'}{$parameter}; if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { # pointer-to-function print " <paramdef>$1 <parameter>$parameter</parameter>)\n"; print " <funcparams>$2</funcparams></paramdef>\n"; } else { print " <paramdef>".$type; print " <parameter>$parameter</parameter></paramdef>\n"; } } } else { print " <void>\n"; } print " </funcsynopsis>\n";# print "</simplesect>\n";# print "</refsect1>\n"; # print parameters# print "<simplesect>\n <title>Arguments</title>\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -