]>
git.ipfire.org Git - thirdparty/bird.git/blob - doc/kernel-doc
3 ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ##
5 ## This software falls under the GNU Public License. Please read ##
6 ## the COPYING file for more information ##
9 # This will read a 'c' file and scan for embedded comments in the
10 # style of gnome comments (+minor extensions - see below).
13 # Note: This only supports 'c'.
16 # kerneldoc [ -docbook | -html | -text | -man | -gnome | -bird ]
17 # [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile
19 # [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile
21 # Set output format using one of -docbook -html -text -man -gnome or -bird. Default is man.
24 # If set, then only generate documentation for the given function(s). All
25 # other functions are ignored.
27 # -nofunction funcname
28 # If set, then only generate documentation for the other function(s). All
29 # other functions are ignored. Cannot be used with -function together
30 # (yes thats a bug - perl hackers can fix it 8))
32 # c files - list of 'c' files to process
34 # All output goes to stdout, with errors to stderr.
38 # In the following table, (...)? signifies optional structure.
39 # (...)* signifies 0 or more structure elements
41 # * function_name(:)? (- short description)?
42 # (* @parameterx: (description of parameter x)?)*
44 # * (Description:)? (Description of function)?
45 # * (section header: (section description)? )*
48 # So .. the trivial example would be:
54 # If the Description: header tag is ommitted, then there must be a blank line
55 # after the last parameter specification.
58 # * my_function - does my stuff
59 # * @my_arg: its mine damnit
61 # * Does my stuff explained.
66 # * my_function - does my stuff
67 # * @my_arg: its mine damnit
68 # * Description: Does my stuff explained.
72 # All descriptions can be multiline, apart from the short function description.
74 # All descriptive text is further processed, scanning for the following special
75 # patterns, which are highlighted appropriately.
77 # 'funcname()' - function
78 # '$ENVVAR' - environmental variable
79 # '&struct_name' - name of a structure or a type
80 # '@parameter' - name of a parameter
81 # '%CONST' - name of a constant.
82 # '|code|' - literal string
84 # match expressions used to find embedded type information
85 $type_constant = "\\\%(\\w+)";
86 $type_func = "(\\w+\\(\\))";
87 $type_param = "\\\@(\\w+)";
88 $type_struct = "\\\&(\\w+)";
89 $type_env = "(\\\$\\w+)";
90 $type_code = "\\|([^|]*)\\|";
93 # Output conversion substitutions.
94 # One for each output format
96 # these work fairly well
97 %highlights_html = ( $type_constant, "<i>\$1</i>",
98 $type_func, "<b>\$1</b>",
99 $type_struct, "<i>\$1</i>",
100 $type_param, "<tt><b>\$1</b></tt>" );
101 $blankline_html = "<p>";
103 # sgml, docbook format
104 %highlights_sgml = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>",
105 $type_func, "<function>\$1</function>",
106 $type_struct, "<structname>\$1</structname>",
107 $type_env, "<envar>\$1</envar>",
108 $type_param, "<parameter>\$1</parameter>" );
109 $blankline_sgml = "</para><para>\n";
111 # gnome, docbook format
112 %highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>",
113 $type_func, "<function>\$1</function>",
114 $type_struct, "<structname>\$1</structname>",
115 $type_env, "<envar>\$1</envar>",
116 $type_param, "<parameter>\$1</parameter>" );
117 $blankline_gnome = "</para><para>\n";
120 %highlights_bird = ( $type_constant, "<const/\$1/",
121 $type_func, "<func/\$1/",
122 $type_struct, "<struct/\$1/",
123 $type_param, "<param/\$1/",
124 $type_code, "<tt>\$1</tt>");
125 $blankline_bird = "<p>";
127 # these are pretty rough
128 %highlights_man = ( $type_constant, "\\n.I \\\"\$1\\\"\\n",
129 $type_func, "\\n.B \\\"\$1\\\"\\n",
130 $type_struct, "\\n.I \\\"\$1\\\"\\n",
131 $type_param."([\.\, ]*)\n?", "\\n.I \\\"\$1\$2\\\"\\n" );
135 %highlights_text = ( $type_constant, "\$1",
138 $type_param, "\$1" );
139 $blankline_text = "";
143 print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man ]\n";
144 print " [ -function funcname [ -function funcname ...] ]\n";
145 print " [ -nofunction funcname [ -nofunction funcname ...] ]\n";
146 print " c source file(s) > outputfile\n";
156 $output_mode = "man";
157 %highlights = %highlights_man;
158 $blankline = $blankline_man;
159 $modulename = "API Documentation";
161 while ($ARGV[0] =~ m/^-(.*)/) {
163 if ($cmd eq "-html") {
164 $output_mode = "html";
165 %highlights = %highlights_html;
166 $blankline = $blankline_html;
167 } elsif ($cmd eq "-man") {
168 $output_mode = "man";
169 %highlights = %highlights_man;
170 $blankline = $blankline_man;
171 } elsif ($cmd eq "-text") {
172 $output_mode = "text";
173 %highlights = %highlights_text;
174 $blankline = $blankline_text;
175 } elsif ($cmd eq "-docbook") {
176 $output_mode = "sgml";
177 %highlights = %highlights_sgml;
178 $blankline = $blankline_sgml;
179 } elsif ($cmd eq "-gnome") {
180 $output_mode = "gnome";
181 %highlights = %highlights_gnome;
182 $blankline = $blankline_gnome;
183 } elsif ($cmd eq "-bird") {
184 $output_mode = "bird";
185 %highlights = %highlights_bird;
186 $blankline = $blankline_bird;
187 } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling document
188 $modulename = shift @ARGV;
189 } elsif ($cmd eq "-function") { # to only output specific functions
191 $function = shift @ARGV;
192 $function_table{$function} = 1;
193 } elsif ($cmd eq "-nofunction") { # to only output specific functions
195 $function = shift @ARGV;
196 $function_table{$function} = 1;
197 } elsif ($cmd eq "-v") {
199 } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
205 # generate a sequence of code that will splice in highlighting information
206 # using the s// operator.
208 foreach $pattern (keys %highlights) {
209 # print "scanning pattern $pattern ($highlights{$pattern})\n";
210 $dohighlight .= "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n";
214 # dumps section contents to arrays/hashes intended for that purpose.
218 my $contents = join "\n", @_;
220 if ($name =~ m/$type_constant/) {
222 # print STDERR "constant section '$1' = '$contents'\n";
223 $constants{$name} = $contents;
224 } elsif ($name =~ m/$type_param/) {
225 # print STDERR "parameter def '$1' = '$contents'\n";
227 $parameters{$name} = $contents;
229 # print STDERR "other section '$name' = '$contents'\n";
230 $sections{$name} = $contents;
231 push @sectionlist, $name;
238 # parameters, a hash.
239 # function => "function name"
240 # parameterlist => @list of parameters
241 # parameters => %parameter descriptions
242 # sectionlist => @list of sections
243 # sections => %descriont descriptions
246 sub output_highlight
{
247 my $contents = join "\n", @_;
251 foreach $line (split "\n", $contents) {
253 print $lineprefix, $blankline;
255 $line =~ s/\\\\\\/\&/g;
256 print $lineprefix, $line;
266 my ($parameter, $section);
268 print "<h2>Function</h2>\n";
270 print "<i>".$args{'functiontype'}."</i>\n";
271 print "<b>".$args{'function'}."</b>\n";
274 foreach $parameter (@
{$args{'parameterlist'}}) {
275 print "<i>".$args{'parametertypes'}{$parameter}."</i> <b>".$parameter."</b>\n";
276 if ($count != $#{$args{'parameterlist'}}) {
283 print "<h3>Arguments</h3>\n";
285 foreach $parameter (@
{$args{'parameterlist'}}) {
286 print "<dt><i>".$args{'parametertypes'}{$parameter}."</i> <b>".$parameter."</b>\n";
288 output_highlight
($args{'parameters'}{$parameter});
291 foreach $section (@
{$args{'sectionlist'}}) {
292 print "<h1>$section</h1>\n";
294 output_highlight
($args{'sections'}{$section});
302 sub output_intro_html
{
304 my ($parameter, $section);
307 foreach $section (@
{$args{'sectionlist'}}) {
308 print "<h1>$section</h1>\n";
310 output_highlight
($args{'sections'}{$section});
318 # output in sgml DocBook
321 my ($parameter, $section);
325 $id = $args{'module'}."-".$args{'function'};
326 $id =~ s/[^A-Za-z0-9]/-/g;
328 print "<refentry>\n";
330 print "<refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></refentrytitle>\n";
331 print "</refmeta>\n";
332 print "<refnamediv>\n";
333 print " <refname>".$args{'function'}."</refname>\n";
334 print " <refpurpose>\n";
335 print " ".$args{'purpose'}."\n";
336 print " </refpurpose>\n";
337 print "</refnamediv>\n";
339 print "<refsynopsisdiv>\n";
340 print " <title>Synopsis</title>\n";
341 print " <funcsynopsis>\n";
342 print " <funcdef>".$args{'functiontype'}." ";
343 print "<function>".$args{'function'}." ";
344 print "</function></funcdef>\n";
346 # print "<refsect1>\n";
347 # print " <title>Synopsis</title>\n";
348 # print " <funcsynopsis>\n";
349 # print " <funcdef>".$args{'functiontype'}." ";
350 # print "<function>".$args{'function'}." ";
351 # print "</function></funcdef>\n";
354 if ($#{$args{'parameterlist'}} >= 0) {
355 foreach $parameter (@
{$args{'parameterlist'}}) {
356 print " <paramdef>".$args{'parametertypes'}{$parameter};
357 print " <parameter>$parameter</parameter></paramdef>\n";
362 print " </funcsynopsis>\n";
363 print "</refsynopsisdiv>\n";
364 # print "</refsect1>\n";
367 print "<refsect1>\n <title>Arguments</title>\n";
368 # print "<para>\nArguments\n";
369 if ($#{$args{'parameterlist'}} >= 0) {
370 print " <variablelist>\n";
371 foreach $parameter (@
{$args{'parameterlist'}}) {
372 print " <varlistentry>\n <term><parameter>$parameter</parameter></term>\n";
373 print " <listitem>\n <para>\n";
375 output_highlight
($args{'parameters'}{$parameter});
376 print " </para>\n </listitem>\n </varlistentry>\n";
378 print " </variablelist>\n";
380 print " <para>\n None\n </para>\n";
382 print "</refsect1>\n";
384 # print out each section
386 foreach $section (@
{$args{'sectionlist'}}) {
387 print "<refsect1>\n <title>$section</title>\n <para>\n";
388 # print "<para>\n$section\n";
389 if ($section =~ m/EXAMPLE/i) {
390 print "<example><para>\n";
392 output_highlight
($args{'sections'}{$section});
394 if ($section =~ m/EXAMPLE/i) {
395 print "</para></example>\n";
397 print " </para>\n</refsect1>\n";
400 print "</refentry>\n\n";
403 # output in sgml DocBook
404 sub output_intro_sgml
{
406 my ($parameter, $section);
410 $id = $args{'module'};
411 $id =~ s/[^A-Za-z0-9]/-/g;
413 # print out each section
415 foreach $section (@
{$args{'sectionlist'}}) {
416 print "<refsect1>\n <title>$section</title>\n <para>\n";
417 # print "<para>\n$section\n";
418 if ($section =~ m/EXAMPLE/i) {
419 print "<example><para>\n";
421 output_highlight
($args{'sections'}{$section});
423 if ($section =~ m/EXAMPLE/i) {
424 print "</para></example>\n";
426 print " </para>\n</refsect1>\n";
432 # output in sgml DocBook
435 my ($parameter, $section);
439 $id = $args{'module'}."-".$args{'function'};
440 $id =~ s/[^A-Za-z0-9]/-/g;
443 print " <title id=\"$id\">".$args{'function'}."</title>\n";
445 # print "<simplesect>\n";
446 # print " <title>Synopsis</title>\n";
447 print " <funcsynopsis>\n";
448 print " <funcdef>".$args{'functiontype'}." ";
449 print "<function>".$args{'function'}." ";
450 print "</function></funcdef>\n";
453 if ($#{$args{'parameterlist'}} >= 0) {
454 foreach $parameter (@
{$args{'parameterlist'}}) {
455 print " <paramdef>".$args{'parametertypes'}{$parameter};
456 print " <parameter>$parameter</parameter></paramdef>\n";
461 print " </funcsynopsis>\n";
462 # print "</simplesect>\n";
463 # print "</refsect1>\n";
466 # print "<simplesect>\n <title>Arguments</title>\n";
467 # if ($#{$args{'parameterlist'}} >= 0) {
468 # print " <variablelist>\n";
469 # foreach $parameter (@{$args{'parameterlist'}}) {
470 # print " <varlistentry>\n <term><parameter>$parameter</parameter></term>\n";
471 # print " <listitem>\n <para>\n";
473 # output_highlight($args{'parameters'}{$parameter});
474 # print " </para>\n </listitem>\n </varlistentry>\n";
476 # print " </variablelist>\n";
478 # print " <para>\n None\n </para>\n";
480 # print "</simplesect>\n";
482 # print "<simplesect>\n <title>Arguments</title>\n";
483 if ($#{$args{'parameterlist'}} >= 0) {
484 print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">\n";
485 print "<tgroup cols=\"2\">\n";
486 print "<colspec colwidth=\"2*\">\n";
487 print "<colspec colwidth=\"8*\">\n";
489 foreach $parameter (@
{$args{'parameterlist'}}) {
490 print " <row><entry align=\"right\"><parameter>$parameter</parameter></entry>\n";
493 output_highlight
($args{'parameters'}{$parameter});
494 print " </entry></row>\n";
496 print " </tbody></tgroup></informaltable>\n";
498 print " <para>\n None\n </para>\n";
500 # print "</simplesect>\n";
502 # print out each section
504 foreach $section (@
{$args{'sectionlist'}}) {
505 print "<simplesect>\n <title>$section</title>\n";
506 # print "<para>\n$section\n";
507 if ($section =~ m/EXAMPLE/i) {
508 print "<example><programlisting>\n";
512 output_highlight
($args{'sections'}{$section});
515 if ($section =~ m/EXAMPLE/i) {
516 print "</programlisting></example>\n";
519 print " </simplesect>\n";
522 print "</sect2>\n\n";
528 my ($parameter, $section);
530 print "<function><p><type>".$args{'functiontype'}."</type>\n";
531 print "<funcdef>".$args{'function'}."</funcdef>\n";
535 foreach $parameter (@
{$args{'parameterlist'}}) {
536 if ($args{'parametertypes'}{$parameter} ne "") {
537 print "<type>".$args{'parametertypes'}{$parameter}."</type> ";
540 print "<param>".$parameter."</param>";
541 if ($count != $#{$args{'parameterlist'}}) {
547 if ($args{'purpose'} ne "") {
549 output_highlight
($args{'purpose'});
554 print "<funcsect>Arguments\n";
555 print "<p><descrip>\n";
556 foreach $parameter (@
{$args{'parameterlist'}}) {
557 print "<tagp><type>".$args{'parametertypes'}{$parameter}."</type> <param>".$parameter."</param></tagp>\n";
558 output_highlight
($args{'parameters'}{$parameter});
560 print "</descrip>\n";
562 foreach $section (@
{$args{'sectionlist'}}) {
563 print "<funcsect>$section\n";
565 output_highlight
($args{'sections'}{$section});
567 print "</function>\n";
571 sub output_intro_bird
{
573 my ($parameter, $section);
577 $id = $args{'module'};
578 $id =~ s/[^A-Za-z0-9]/-/g;
580 # print out each section
582 foreach $section (@
{$args{'sectionlist'}}) {
583 print "<sect>$section\n<p>\n";
584 output_highlight
($args{'sections'}{$section});
594 my ($parameter, $section);
597 print ".TH \"$args{'module'}\" \"$args{'function'}\" \"25 May 1998\" \"API Manual\" LINUX\n";
599 print ".SH Function\n";
601 print ".I \"".$args{'functiontype'}."\"\n";
602 print ".B \"".$args{'function'}."\"\n";
605 foreach $parameter (@
{$args{'parameterlist'}}) {
606 print ".I \"".$args{'parametertypes'}{$parameter}."\"\n.B \"".$parameter."\"\n";
607 if ($count != $#{$args{'parameterlist'}}) {
614 print ".SH Arguments\n";
615 foreach $parameter (@
{$args{'parameterlist'}}) {
616 print ".IP \"".$args{'parametertypes'}{$parameter}." ".$parameter."\" 12\n";
617 output_highlight
($args{'parameters'}{$parameter});
619 foreach $section (@
{$args{'sectionlist'}}) {
620 print ".SH \"$section\"\n";
621 output_highlight
($args{'sections'}{$section});
625 sub output_intro_man
{
627 my ($parameter, $section);
630 print ".TH \"$args{'module'}\" \"$args{'module'}\" \"25 May 1998\" \"API Manual\" LINUX\n";
632 foreach $section (@
{$args{'sectionlist'}}) {
633 print ".SH \"$section\"\n";
634 output_highlight
($args{'sections'}{$section});
642 my ($parameter, $section);
644 print "Function = ".$args{'function'}."\n";
645 print " return type: ".$args{'functiontype'}."\n\n";
646 foreach $parameter (@
{$args{'parameterlist'}}) {
647 print " ".$args{'parametertypes'}{$parameter}." ".$parameter."\n";
648 print " -> ".$args{'parameters'}{$parameter}."\n";
650 foreach $section (@
{$args{'sectionlist'}}) {
651 print " $section:\n";
653 output_highlight
($args{'sections'}{$section});
657 sub output_intro_text
{
659 my ($parameter, $section);
661 foreach $section (@
{$args{'sectionlist'}}) {
662 print " $section:\n";
664 output_highlight
($args{'sections'}{$section});
669 # generic output function - calls the right one based
670 # on current output mode.
671 sub output_function
{
673 eval "output_".$output_mode."(\@_);";
677 # generic output function - calls the right one based
678 # on current output mode.
681 eval "output_intro_".$output_mode."(\@_);";
686 # takes a function prototype and spits out all the details
687 # stored in the global arrays/hsahes.
689 my $prototype = shift @_;
691 $prototype =~ s/^static+ //;
692 $prototype =~ s/^extern+ //;
693 $prototype =~ s/^inline+ //;
694 $prototype =~ s/^__inline__+ //;
696 if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
697 $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
698 $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
699 $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/ ||
700 $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\)]*)\)/) {
705 # print STDERR "ARGS = '$args'\n";
707 foreach $arg (split ',', $args) {
708 # strip leading/trailing spaces
711 # print STDERR "SCAN ARG: '$arg'\n";
712 @args = split('\s', $arg);
714 # print STDERR " -> @args\n";
716 # print STDERR " -> @args\n";
717 if ($param =~ m/^(\*+)(.*)/) {
721 $type = join " ", @args;
723 if ($type eq "" && $param eq "...")
727 $parameters{"..."} = "variable arguments";
733 $parameters{void
} = "no arguments";
735 if ($parameters{$param} eq "") {
736 $parameters{$param} = "-- undescribed --";
737 print STDERR
"Warning($lineno): Function parameter '$param' not described in '$function_name'\n";
740 push @parameterlist, $param;
741 $parametertypes{$param} = $type;
742 # print STDERR "param = '$param', type = '$type'\n";
745 print STDERR
"Error($lineno): cannot understand prototype: '$prototype'\n";
749 if ($function_only==0 ||
750 ( $function_only == 1 && defined($function_table{$function_name})) ||
751 ( $function_only == 2 && !defined($function_table{$function_name})))
753 output_function
({'function' => $function_name,
754 'module' => $modulename,
755 'functiontype' => $return_type,
756 'parameterlist' => \
@parameterlist,
757 'parameters' => \
%parameters,
758 'parametertypes' => \
%parametertypes,
759 'sectionlist' => \
@sectionlist,
760 'sections' => \
%sections,
761 'purpose' => $function_purpose
766 ######################################################################
770 # 1 - looking for function name
771 # 2 - scanning field start.
772 # 3 - scanning prototype.
776 $doc_special = "\@\%\$\&";
778 $doc_start = "^/\\*\\*\$";
780 $doc_com = "\\s*\\*\\s*";
781 $doc_func = $doc_com."(\\w+):?";
782 $doc_sect = $doc_com."([".$doc_special."]?[\\w ]+):(.*)";
783 $doc_content = $doc_com."(.*)";
784 $doc_block = $doc_com."DOC:\\s*(.*)?";
793 $section_default = "Description"; # default section
794 $section_intro = "Introduction";
795 $section = $section_default;
798 foreach $file (@ARGV) {
799 if (!open(IN
,"<$file")) {
800 print STDERR
"Error: Cannot open file $file\n";
808 $state = 1; # next line is always the function name
810 } elsif ($state == 1) { # this line is the function name (always)
815 $section = $section_intro;
820 elsif (/$doc_func/o) {
824 $function_purpose = $1;
826 $function_purpose = "";
829 print STDERR
"Info($lineno): Scanning doc for $function\n";
832 print STDERR
"WARN($lineno): Cannot understand $_ on line $lineno",
833 " - I thought it was a doc line\n";
836 } elsif ($state == 2) { # look for head: lines, and include content
841 if ($contents ne "") {
842 # $contents =~ s/\&/\\\\\\amp;/g;
843 $contents =~ s/\</\\\\\\lt;/g;
844 $contents =~ s/\>/\\\\\\gt;/g;
845 dump_section
($section, $contents);
846 $section = $section_default;
849 $contents = $newcontents;
850 if ($contents ne "") {
853 $section = $newsection;
854 } elsif (/$doc_end/) {
856 if ($contents ne "") {
857 # $contents =~ s/\&/\\\\\\amp;/g;
858 $contents =~ s/\</\\\\\\lt;/g;
859 $contents =~ s/\>/\\\\\\gt;/g;
860 dump_section
($section, $contents);
861 $section = $section_default;
865 # print STDERR "end of doc comment, looking for prototype\n";
868 } elsif (/$doc_content/) {
869 # miguel-style comment kludge, look for blank lines after
870 # @parameter line to signify start of description
871 if ($1 eq "" && $section =~ m/^@/) {
872 # $contents =~ s/\&/\\\\\\amp;/g;
873 $contents =~ s/\</\\\\\\lt;/g;
874 $contents =~ s/\>/\\\\\\gt;/g;
875 dump_section
($section, $contents);
876 $section = $section_default;
879 $contents .= $1."\n";
882 # i dont know - bad line? ignore.
883 print STDERR
"WARNING($lineno): bad line: $_";
885 } elsif ($state == 3) { # scanning for function { (end of prototype)
886 if (m
#\s*/\*\s+MACDOC\s*#io) {
893 $prototype =~ s@
/\*.*?\*/@
@gos; # strip comments.
894 $prototype =~ s@
[\r\n]+@
@gos; # strip newlines/cr's.
895 $prototype =~ s@
^ +@
@gos; # strip leading spaces
896 dump_function
($prototype);
901 %parametertypes = ();
909 } elsif ($state == 4) {
910 # Documentation block
912 # $contents =~ s/\&/\\\\\\amp;/g;
913 $contents =~ s/\</\\\\\\lt;/g;
914 $contents =~ s/\>/\\\\\\gt;/g;
915 dump_section
($section, $contents);
916 output_intro
({'sectionlist' => \
@sectionlist,
917 'sections' => \
%sections });
922 %parametertypes = ();
928 $section = $section_intro;
935 # $contents =~ s/\&/\\\\\\amp;/g;
936 $contents =~ s/\</\\\\\\lt;/g;
937 $contents =~ s/\>/\\\\\\gt;/g;
938 dump_section
($section, $contents);
939 output_intro
({'sectionlist' => \
@sectionlist,
940 'sections' => \
%sections });
945 %parametertypes = ();
952 elsif (/$doc_content/)
960 $contents .= $1 . "\n";