xref: /openbmc/u-boot/scripts/kernel-doc (revision 8fac9c7b7de617c52738818663adbbeb2021f132)
1*8fac9c7bSMasahiro Yamada#!/usr/bin/perl -w
2*8fac9c7bSMasahiro Yamada
3*8fac9c7bSMasahiro Yamadause strict;
4*8fac9c7bSMasahiro Yamada
5*8fac9c7bSMasahiro Yamada## Copyright (c) 1998 Michael Zucchi, All Rights Reserved        ##
6*8fac9c7bSMasahiro Yamada## Copyright (C) 2000, 1  Tim Waugh <twaugh@redhat.com>          ##
7*8fac9c7bSMasahiro Yamada## Copyright (C) 2001  Simon Huggins                             ##
8*8fac9c7bSMasahiro Yamada## Copyright (C) 2005-2012  Randy Dunlap                         ##
9*8fac9c7bSMasahiro Yamada## Copyright (C) 2012  Dan Luedtke                               ##
10*8fac9c7bSMasahiro Yamada## 								 ##
11*8fac9c7bSMasahiro Yamada## #define enhancements by Armin Kuster <akuster@mvista.com>	 ##
12*8fac9c7bSMasahiro Yamada## Copyright (c) 2000 MontaVista Software, Inc.			 ##
13*8fac9c7bSMasahiro Yamada## 								 ##
14*8fac9c7bSMasahiro Yamada## This software falls under the GNU General Public License.     ##
15*8fac9c7bSMasahiro Yamada## Please read the COPYING file for more information             ##
16*8fac9c7bSMasahiro Yamada
17*8fac9c7bSMasahiro Yamada# 18/01/2001 - 	Cleanups
18*8fac9c7bSMasahiro Yamada# 		Functions prototyped as foo(void) same as foo()
19*8fac9c7bSMasahiro Yamada# 		Stop eval'ing where we don't need to.
20*8fac9c7bSMasahiro Yamada# -- huggie@earth.li
21*8fac9c7bSMasahiro Yamada
22*8fac9c7bSMasahiro Yamada# 27/06/2001 -  Allowed whitespace after initial "/**" and
23*8fac9c7bSMasahiro Yamada#               allowed comments before function declarations.
24*8fac9c7bSMasahiro Yamada# -- Christian Kreibich <ck@whoop.org>
25*8fac9c7bSMasahiro Yamada
26*8fac9c7bSMasahiro Yamada# Still to do:
27*8fac9c7bSMasahiro Yamada# 	- add perldoc documentation
28*8fac9c7bSMasahiro Yamada# 	- Look more closely at some of the scarier bits :)
29*8fac9c7bSMasahiro Yamada
30*8fac9c7bSMasahiro Yamada# 26/05/2001 - 	Support for separate source and object trees.
31*8fac9c7bSMasahiro Yamada#		Return error code.
32*8fac9c7bSMasahiro Yamada# 		Keith Owens <kaos@ocs.com.au>
33*8fac9c7bSMasahiro Yamada
34*8fac9c7bSMasahiro Yamada# 23/09/2001 - Added support for typedefs, structs, enums and unions
35*8fac9c7bSMasahiro Yamada#              Support for Context section; can be terminated using empty line
36*8fac9c7bSMasahiro Yamada#              Small fixes (like spaces vs. \s in regex)
37*8fac9c7bSMasahiro Yamada# -- Tim Jansen <tim@tjansen.de>
38*8fac9c7bSMasahiro Yamada
39*8fac9c7bSMasahiro Yamada# 25/07/2012 - Added support for HTML5
40*8fac9c7bSMasahiro Yamada# -- Dan Luedtke <mail@danrl.de>
41*8fac9c7bSMasahiro Yamada
42*8fac9c7bSMasahiro Yamada#
43*8fac9c7bSMasahiro Yamada# This will read a 'c' file and scan for embedded comments in the
44*8fac9c7bSMasahiro Yamada# style of gnome comments (+minor extensions - see below).
45*8fac9c7bSMasahiro Yamada#
46*8fac9c7bSMasahiro Yamada
47*8fac9c7bSMasahiro Yamada# Note: This only supports 'c'.
48*8fac9c7bSMasahiro Yamada
49*8fac9c7bSMasahiro Yamada# usage:
50*8fac9c7bSMasahiro Yamada# kernel-doc [ -docbook | -html | -html5 | -text | -man | -list ]
51*8fac9c7bSMasahiro Yamada#            [ -no-doc-sections ]
52*8fac9c7bSMasahiro Yamada#            [ -function funcname [ -function funcname ...] ]
53*8fac9c7bSMasahiro Yamada#            c file(s)s > outputfile
54*8fac9c7bSMasahiro Yamada# or
55*8fac9c7bSMasahiro Yamada#            [ -nofunction funcname [ -function funcname ...] ]
56*8fac9c7bSMasahiro Yamada#            c file(s)s > outputfile
57*8fac9c7bSMasahiro Yamada#
58*8fac9c7bSMasahiro Yamada#  Set output format using one of -docbook -html -html5 -text or -man.
59*8fac9c7bSMasahiro Yamada#  Default is man.
60*8fac9c7bSMasahiro Yamada#  The -list format is for internal use by docproc.
61*8fac9c7bSMasahiro Yamada#
62*8fac9c7bSMasahiro Yamada#  -no-doc-sections
63*8fac9c7bSMasahiro Yamada#	Do not output DOC: sections
64*8fac9c7bSMasahiro Yamada#
65*8fac9c7bSMasahiro Yamada#  -function funcname
66*8fac9c7bSMasahiro Yamada#	If set, then only generate documentation for the given function(s) or
67*8fac9c7bSMasahiro Yamada#	DOC: section titles.  All other functions and DOC: sections are ignored.
68*8fac9c7bSMasahiro Yamada#
69*8fac9c7bSMasahiro Yamada#  -nofunction funcname
70*8fac9c7bSMasahiro Yamada#	If set, then only generate documentation for the other function(s)/DOC:
71*8fac9c7bSMasahiro Yamada#	sections. Cannot be used together with -function (yes, that's a bug --
72*8fac9c7bSMasahiro Yamada#	perl hackers can fix it 8))
73*8fac9c7bSMasahiro Yamada#
74*8fac9c7bSMasahiro Yamada#  c files - list of 'c' files to process
75*8fac9c7bSMasahiro Yamada#
76*8fac9c7bSMasahiro Yamada#  All output goes to stdout, with errors to stderr.
77*8fac9c7bSMasahiro Yamada
78*8fac9c7bSMasahiro Yamada#
79*8fac9c7bSMasahiro Yamada# format of comments.
80*8fac9c7bSMasahiro Yamada# In the following table, (...)? signifies optional structure.
81*8fac9c7bSMasahiro Yamada#                         (...)* signifies 0 or more structure elements
82*8fac9c7bSMasahiro Yamada# /**
83*8fac9c7bSMasahiro Yamada#  * function_name(:)? (- short description)?
84*8fac9c7bSMasahiro Yamada# (* @parameterx: (description of parameter x)?)*
85*8fac9c7bSMasahiro Yamada# (* a blank line)?
86*8fac9c7bSMasahiro Yamada#  * (Description:)? (Description of function)?
87*8fac9c7bSMasahiro Yamada#  * (section header: (section description)? )*
88*8fac9c7bSMasahiro Yamada#  (*)?*/
89*8fac9c7bSMasahiro Yamada#
90*8fac9c7bSMasahiro Yamada# So .. the trivial example would be:
91*8fac9c7bSMasahiro Yamada#
92*8fac9c7bSMasahiro Yamada# /**
93*8fac9c7bSMasahiro Yamada#  * my_function
94*8fac9c7bSMasahiro Yamada#  */
95*8fac9c7bSMasahiro Yamada#
96*8fac9c7bSMasahiro Yamada# If the Description: header tag is omitted, then there must be a blank line
97*8fac9c7bSMasahiro Yamada# after the last parameter specification.
98*8fac9c7bSMasahiro Yamada# e.g.
99*8fac9c7bSMasahiro Yamada# /**
100*8fac9c7bSMasahiro Yamada#  * my_function - does my stuff
101*8fac9c7bSMasahiro Yamada#  * @my_arg: its mine damnit
102*8fac9c7bSMasahiro Yamada#  *
103*8fac9c7bSMasahiro Yamada#  * Does my stuff explained.
104*8fac9c7bSMasahiro Yamada#  */
105*8fac9c7bSMasahiro Yamada#
106*8fac9c7bSMasahiro Yamada#  or, could also use:
107*8fac9c7bSMasahiro Yamada# /**
108*8fac9c7bSMasahiro Yamada#  * my_function - does my stuff
109*8fac9c7bSMasahiro Yamada#  * @my_arg: its mine damnit
110*8fac9c7bSMasahiro Yamada#  * Description: Does my stuff explained.
111*8fac9c7bSMasahiro Yamada#  */
112*8fac9c7bSMasahiro Yamada# etc.
113*8fac9c7bSMasahiro Yamada#
114*8fac9c7bSMasahiro Yamada# Besides functions you can also write documentation for structs, unions,
115*8fac9c7bSMasahiro Yamada# enums and typedefs. Instead of the function name you must write the name
116*8fac9c7bSMasahiro Yamada# of the declaration;  the struct/union/enum/typedef must always precede
117*8fac9c7bSMasahiro Yamada# the name. Nesting of declarations is not supported.
118*8fac9c7bSMasahiro Yamada# Use the argument mechanism to document members or constants.
119*8fac9c7bSMasahiro Yamada# e.g.
120*8fac9c7bSMasahiro Yamada# /**
121*8fac9c7bSMasahiro Yamada#  * struct my_struct - short description
122*8fac9c7bSMasahiro Yamada#  * @a: first member
123*8fac9c7bSMasahiro Yamada#  * @b: second member
124*8fac9c7bSMasahiro Yamada#  *
125*8fac9c7bSMasahiro Yamada#  * Longer description
126*8fac9c7bSMasahiro Yamada#  */
127*8fac9c7bSMasahiro Yamada# struct my_struct {
128*8fac9c7bSMasahiro Yamada#     int a;
129*8fac9c7bSMasahiro Yamada#     int b;
130*8fac9c7bSMasahiro Yamada# /* private: */
131*8fac9c7bSMasahiro Yamada#     int c;
132*8fac9c7bSMasahiro Yamada# };
133*8fac9c7bSMasahiro Yamada#
134*8fac9c7bSMasahiro Yamada# All descriptions can be multiline, except the short function description.
135*8fac9c7bSMasahiro Yamada#
136*8fac9c7bSMasahiro Yamada# You can also add additional sections. When documenting kernel functions you
137*8fac9c7bSMasahiro Yamada# should document the "Context:" of the function, e.g. whether the functions
138*8fac9c7bSMasahiro Yamada# can be called form interrupts. Unlike other sections you can end it with an
139*8fac9c7bSMasahiro Yamada# empty line.
140*8fac9c7bSMasahiro Yamada# Example-sections should contain the string EXAMPLE so that they are marked
141*8fac9c7bSMasahiro Yamada# appropriately in DocBook.
142*8fac9c7bSMasahiro Yamada#
143*8fac9c7bSMasahiro Yamada# Example:
144*8fac9c7bSMasahiro Yamada# /**
145*8fac9c7bSMasahiro Yamada#  * user_function - function that can only be called in user context
146*8fac9c7bSMasahiro Yamada#  * @a: some argument
147*8fac9c7bSMasahiro Yamada#  * Context: !in_interrupt()
148*8fac9c7bSMasahiro Yamada#  *
149*8fac9c7bSMasahiro Yamada#  * Some description
150*8fac9c7bSMasahiro Yamada#  * Example:
151*8fac9c7bSMasahiro Yamada#  *    user_function(22);
152*8fac9c7bSMasahiro Yamada#  */
153*8fac9c7bSMasahiro Yamada# ...
154*8fac9c7bSMasahiro Yamada#
155*8fac9c7bSMasahiro Yamada#
156*8fac9c7bSMasahiro Yamada# All descriptive text is further processed, scanning for the following special
157*8fac9c7bSMasahiro Yamada# patterns, which are highlighted appropriately.
158*8fac9c7bSMasahiro Yamada#
159*8fac9c7bSMasahiro Yamada# 'funcname()' - function
160*8fac9c7bSMasahiro Yamada# '$ENVVAR' - environmental variable
161*8fac9c7bSMasahiro Yamada# '&struct_name' - name of a structure (up to two words including 'struct')
162*8fac9c7bSMasahiro Yamada# '@parameter' - name of a parameter
163*8fac9c7bSMasahiro Yamada# '%CONST' - name of a constant.
164*8fac9c7bSMasahiro Yamada
165*8fac9c7bSMasahiro Yamada## init lots of data
166*8fac9c7bSMasahiro Yamada
167*8fac9c7bSMasahiro Yamadamy $errors = 0;
168*8fac9c7bSMasahiro Yamadamy $warnings = 0;
169*8fac9c7bSMasahiro Yamadamy $anon_struct_union = 0;
170*8fac9c7bSMasahiro Yamada
171*8fac9c7bSMasahiro Yamada# match expressions used to find embedded type information
172*8fac9c7bSMasahiro Yamadamy $type_constant = '\%([-_\w]+)';
173*8fac9c7bSMasahiro Yamadamy $type_func = '(\w+)\(\)';
174*8fac9c7bSMasahiro Yamadamy $type_param = '\@(\w+)';
175*8fac9c7bSMasahiro Yamadamy $type_struct = '\&((struct\s*)*[_\w]+)';
176*8fac9c7bSMasahiro Yamadamy $type_struct_xml = '\\&amp;((struct\s*)*[_\w]+)';
177*8fac9c7bSMasahiro Yamadamy $type_env = '(\$\w+)';
178*8fac9c7bSMasahiro Yamada
179*8fac9c7bSMasahiro Yamada# Output conversion substitutions.
180*8fac9c7bSMasahiro Yamada#  One for each output format
181*8fac9c7bSMasahiro Yamada
182*8fac9c7bSMasahiro Yamada# these work fairly well
183*8fac9c7bSMasahiro Yamadamy %highlights_html = ( $type_constant, "<i>\$1</i>",
184*8fac9c7bSMasahiro Yamada			$type_func, "<b>\$1</b>",
185*8fac9c7bSMasahiro Yamada			$type_struct_xml, "<i>\$1</i>",
186*8fac9c7bSMasahiro Yamada			$type_env, "<b><i>\$1</i></b>",
187*8fac9c7bSMasahiro Yamada			$type_param, "<tt><b>\$1</b></tt>" );
188*8fac9c7bSMasahiro Yamadamy $local_lt = "\\\\\\\\lt:";
189*8fac9c7bSMasahiro Yamadamy $local_gt = "\\\\\\\\gt:";
190*8fac9c7bSMasahiro Yamadamy $blankline_html = $local_lt . "p" . $local_gt;	# was "<p>"
191*8fac9c7bSMasahiro Yamada
192*8fac9c7bSMasahiro Yamada# html version 5
193*8fac9c7bSMasahiro Yamadamy %highlights_html5 = ( $type_constant, "<span class=\"const\">\$1</span>",
194*8fac9c7bSMasahiro Yamada			$type_func, "<span class=\"func\">\$1</span>",
195*8fac9c7bSMasahiro Yamada			$type_struct_xml, "<span class=\"struct\">\$1</span>",
196*8fac9c7bSMasahiro Yamada			$type_env, "<span class=\"env\">\$1</span>",
197*8fac9c7bSMasahiro Yamada			$type_param, "<span class=\"param\">\$1</span>" );
198*8fac9c7bSMasahiro Yamadamy $blankline_html5 = $local_lt . "br /" . $local_gt;
199*8fac9c7bSMasahiro Yamada
200*8fac9c7bSMasahiro Yamada# XML, docbook format
201*8fac9c7bSMasahiro Yamadamy %highlights_xml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>",
202*8fac9c7bSMasahiro Yamada			$type_constant, "<constant>\$1</constant>",
203*8fac9c7bSMasahiro Yamada			$type_func, "<function>\$1</function>",
204*8fac9c7bSMasahiro Yamada			$type_struct_xml, "<structname>\$1</structname>",
205*8fac9c7bSMasahiro Yamada			$type_env, "<envar>\$1</envar>",
206*8fac9c7bSMasahiro Yamada			$type_param, "<parameter>\$1</parameter>" );
207*8fac9c7bSMasahiro Yamadamy $blankline_xml = $local_lt . "/para" . $local_gt . $local_lt . "para" . $local_gt . "\n";
208*8fac9c7bSMasahiro Yamada
209*8fac9c7bSMasahiro Yamada# gnome, docbook format
210*8fac9c7bSMasahiro Yamadamy %highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>",
211*8fac9c7bSMasahiro Yamada			 $type_func, "<function>\$1</function>",
212*8fac9c7bSMasahiro Yamada			 $type_struct, "<structname>\$1</structname>",
213*8fac9c7bSMasahiro Yamada			 $type_env, "<envar>\$1</envar>",
214*8fac9c7bSMasahiro Yamada			 $type_param, "<parameter>\$1</parameter>" );
215*8fac9c7bSMasahiro Yamadamy $blankline_gnome = "</para><para>\n";
216*8fac9c7bSMasahiro Yamada
217*8fac9c7bSMasahiro Yamada# these are pretty rough
218*8fac9c7bSMasahiro Yamadamy %highlights_man = ( $type_constant, "\$1",
219*8fac9c7bSMasahiro Yamada		       $type_func, "\\\\fB\$1\\\\fP",
220*8fac9c7bSMasahiro Yamada		       $type_struct, "\\\\fI\$1\\\\fP",
221*8fac9c7bSMasahiro Yamada		       $type_param, "\\\\fI\$1\\\\fP" );
222*8fac9c7bSMasahiro Yamadamy $blankline_man = "";
223*8fac9c7bSMasahiro Yamada
224*8fac9c7bSMasahiro Yamada# text-mode
225*8fac9c7bSMasahiro Yamadamy %highlights_text = ( $type_constant, "\$1",
226*8fac9c7bSMasahiro Yamada			$type_func, "\$1",
227*8fac9c7bSMasahiro Yamada			$type_struct, "\$1",
228*8fac9c7bSMasahiro Yamada			$type_param, "\$1" );
229*8fac9c7bSMasahiro Yamadamy $blankline_text = "";
230*8fac9c7bSMasahiro Yamada
231*8fac9c7bSMasahiro Yamada# list mode
232*8fac9c7bSMasahiro Yamadamy %highlights_list = ( $type_constant, "\$1",
233*8fac9c7bSMasahiro Yamada			$type_func, "\$1",
234*8fac9c7bSMasahiro Yamada			$type_struct, "\$1",
235*8fac9c7bSMasahiro Yamada			$type_param, "\$1" );
236*8fac9c7bSMasahiro Yamadamy $blankline_list = "";
237*8fac9c7bSMasahiro Yamada
238*8fac9c7bSMasahiro Yamada# read arguments
239*8fac9c7bSMasahiro Yamadaif ($#ARGV == -1) {
240*8fac9c7bSMasahiro Yamada    usage();
241*8fac9c7bSMasahiro Yamada}
242*8fac9c7bSMasahiro Yamada
243*8fac9c7bSMasahiro Yamadamy $kernelversion;
244*8fac9c7bSMasahiro Yamadamy $dohighlight = "";
245*8fac9c7bSMasahiro Yamada
246*8fac9c7bSMasahiro Yamadamy $verbose = 0;
247*8fac9c7bSMasahiro Yamadamy $output_mode = "man";
248*8fac9c7bSMasahiro Yamadamy $no_doc_sections = 0;
249*8fac9c7bSMasahiro Yamadamy %highlights = %highlights_man;
250*8fac9c7bSMasahiro Yamadamy $blankline = $blankline_man;
251*8fac9c7bSMasahiro Yamadamy $modulename = "Bootloader API";
252*8fac9c7bSMasahiro Yamadamy $function_only = 0;
253*8fac9c7bSMasahiro Yamadamy $man_date = ('January', 'February', 'March', 'April', 'May', 'June',
254*8fac9c7bSMasahiro Yamada		'July', 'August', 'September', 'October',
255*8fac9c7bSMasahiro Yamada		'November', 'December')[(localtime)[4]] .
256*8fac9c7bSMasahiro Yamada  " " . ((localtime)[5]+1900);
257*8fac9c7bSMasahiro Yamada
258*8fac9c7bSMasahiro Yamada# Essentially these are globals.
259*8fac9c7bSMasahiro Yamada# They probably want to be tidied up, made more localised or something.
260*8fac9c7bSMasahiro Yamada# CAVEAT EMPTOR!  Some of the others I localised may not want to be, which
261*8fac9c7bSMasahiro Yamada# could cause "use of undefined value" or other bugs.
262*8fac9c7bSMasahiro Yamadamy ($function, %function_table, %parametertypes, $declaration_purpose);
263*8fac9c7bSMasahiro Yamadamy ($type, $declaration_name, $return_type);
264*8fac9c7bSMasahiro Yamadamy ($newsection, $newcontents, $prototype, $brcount, %source_map);
265*8fac9c7bSMasahiro Yamada
266*8fac9c7bSMasahiro Yamadaif (defined($ENV{'KBUILD_VERBOSE'})) {
267*8fac9c7bSMasahiro Yamada	$verbose = "$ENV{'KBUILD_VERBOSE'}";
268*8fac9c7bSMasahiro Yamada}
269*8fac9c7bSMasahiro Yamada
270*8fac9c7bSMasahiro Yamada# Generated docbook code is inserted in a template at a point where
271*8fac9c7bSMasahiro Yamada# docbook v3.1 requires a non-zero sequence of RefEntry's; see:
272*8fac9c7bSMasahiro Yamada# http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
273*8fac9c7bSMasahiro Yamada# We keep track of number of generated entries and generate a dummy
274*8fac9c7bSMasahiro Yamada# if needs be to ensure the expanded template can be postprocessed
275*8fac9c7bSMasahiro Yamada# into html.
276*8fac9c7bSMasahiro Yamadamy $section_counter = 0;
277*8fac9c7bSMasahiro Yamada
278*8fac9c7bSMasahiro Yamadamy $lineprefix="";
279*8fac9c7bSMasahiro Yamada
280*8fac9c7bSMasahiro Yamada# states
281*8fac9c7bSMasahiro Yamada# 0 - normal code
282*8fac9c7bSMasahiro Yamada# 1 - looking for function name
283*8fac9c7bSMasahiro Yamada# 2 - scanning field start.
284*8fac9c7bSMasahiro Yamada# 3 - scanning prototype.
285*8fac9c7bSMasahiro Yamada# 4 - documentation block
286*8fac9c7bSMasahiro Yamadamy $state;
287*8fac9c7bSMasahiro Yamadamy $in_doc_sect;
288*8fac9c7bSMasahiro Yamada
289*8fac9c7bSMasahiro Yamada#declaration types: can be
290*8fac9c7bSMasahiro Yamada# 'function', 'struct', 'union', 'enum', 'typedef'
291*8fac9c7bSMasahiro Yamadamy $decl_type;
292*8fac9c7bSMasahiro Yamada
293*8fac9c7bSMasahiro Yamadamy $doc_special = "\@\%\$\&";
294*8fac9c7bSMasahiro Yamada
295*8fac9c7bSMasahiro Yamadamy $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
296*8fac9c7bSMasahiro Yamadamy $doc_end = '\*/';
297*8fac9c7bSMasahiro Yamadamy $doc_com = '\s*\*\s*';
298*8fac9c7bSMasahiro Yamadamy $doc_decl = $doc_com . '(\w+)';
299*8fac9c7bSMasahiro Yamadamy $doc_sect = $doc_com . '([' . $doc_special . ']?[\w\s]+):(.*)';
300*8fac9c7bSMasahiro Yamadamy $doc_content = $doc_com . '(.*)';
301*8fac9c7bSMasahiro Yamadamy $doc_block = $doc_com . 'DOC:\s*(.*)?';
302*8fac9c7bSMasahiro Yamada
303*8fac9c7bSMasahiro Yamadamy %constants;
304*8fac9c7bSMasahiro Yamadamy %parameterdescs;
305*8fac9c7bSMasahiro Yamadamy @parameterlist;
306*8fac9c7bSMasahiro Yamadamy %sections;
307*8fac9c7bSMasahiro Yamadamy @sectionlist;
308*8fac9c7bSMasahiro Yamadamy $sectcheck;
309*8fac9c7bSMasahiro Yamadamy $struct_actual;
310*8fac9c7bSMasahiro Yamada
311*8fac9c7bSMasahiro Yamadamy $contents = "";
312*8fac9c7bSMasahiro Yamadamy $section_default = "Description";	# default section
313*8fac9c7bSMasahiro Yamadamy $section_intro = "Introduction";
314*8fac9c7bSMasahiro Yamadamy $section = $section_default;
315*8fac9c7bSMasahiro Yamadamy $section_context = "Context";
316*8fac9c7bSMasahiro Yamada
317*8fac9c7bSMasahiro Yamadamy $undescribed = "-- undescribed --";
318*8fac9c7bSMasahiro Yamada
319*8fac9c7bSMasahiro Yamadareset_state();
320*8fac9c7bSMasahiro Yamada
321*8fac9c7bSMasahiro Yamadawhile ($ARGV[0] =~ m/^-(.*)/) {
322*8fac9c7bSMasahiro Yamada    my $cmd = shift @ARGV;
323*8fac9c7bSMasahiro Yamada    if ($cmd eq "-html") {
324*8fac9c7bSMasahiro Yamada	$output_mode = "html";
325*8fac9c7bSMasahiro Yamada	%highlights = %highlights_html;
326*8fac9c7bSMasahiro Yamada	$blankline = $blankline_html;
327*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-html5") {
328*8fac9c7bSMasahiro Yamada	$output_mode = "html5";
329*8fac9c7bSMasahiro Yamada	%highlights = %highlights_html5;
330*8fac9c7bSMasahiro Yamada	$blankline = $blankline_html5;
331*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-man") {
332*8fac9c7bSMasahiro Yamada	$output_mode = "man";
333*8fac9c7bSMasahiro Yamada	%highlights = %highlights_man;
334*8fac9c7bSMasahiro Yamada	$blankline = $blankline_man;
335*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-text") {
336*8fac9c7bSMasahiro Yamada	$output_mode = "text";
337*8fac9c7bSMasahiro Yamada	%highlights = %highlights_text;
338*8fac9c7bSMasahiro Yamada	$blankline = $blankline_text;
339*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-docbook") {
340*8fac9c7bSMasahiro Yamada	$output_mode = "xml";
341*8fac9c7bSMasahiro Yamada	%highlights = %highlights_xml;
342*8fac9c7bSMasahiro Yamada	$blankline = $blankline_xml;
343*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-list") {
344*8fac9c7bSMasahiro Yamada	$output_mode = "list";
345*8fac9c7bSMasahiro Yamada	%highlights = %highlights_list;
346*8fac9c7bSMasahiro Yamada	$blankline = $blankline_list;
347*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-gnome") {
348*8fac9c7bSMasahiro Yamada	$output_mode = "gnome";
349*8fac9c7bSMasahiro Yamada	%highlights = %highlights_gnome;
350*8fac9c7bSMasahiro Yamada	$blankline = $blankline_gnome;
351*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-module") { # not needed for XML, inherits from calling document
352*8fac9c7bSMasahiro Yamada	$modulename = shift @ARGV;
353*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-function") { # to only output specific functions
354*8fac9c7bSMasahiro Yamada	$function_only = 1;
355*8fac9c7bSMasahiro Yamada	$function = shift @ARGV;
356*8fac9c7bSMasahiro Yamada	$function_table{$function} = 1;
357*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-nofunction") { # to only output specific functions
358*8fac9c7bSMasahiro Yamada	$function_only = 2;
359*8fac9c7bSMasahiro Yamada	$function = shift @ARGV;
360*8fac9c7bSMasahiro Yamada	$function_table{$function} = 1;
361*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq "-v") {
362*8fac9c7bSMasahiro Yamada	$verbose = 1;
363*8fac9c7bSMasahiro Yamada    } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
364*8fac9c7bSMasahiro Yamada	usage();
365*8fac9c7bSMasahiro Yamada    } elsif ($cmd eq '-no-doc-sections') {
366*8fac9c7bSMasahiro Yamada	    $no_doc_sections = 1;
367*8fac9c7bSMasahiro Yamada    }
368*8fac9c7bSMasahiro Yamada}
369*8fac9c7bSMasahiro Yamada
370*8fac9c7bSMasahiro Yamada# continue execution near EOF;
371*8fac9c7bSMasahiro Yamada
372*8fac9c7bSMasahiro Yamadasub usage {
373*8fac9c7bSMasahiro Yamada    print "Usage: $0 [ -docbook | -html | -html5 | -text | -man | -list ]\n";
374*8fac9c7bSMasahiro Yamada    print "         [ -no-doc-sections ]\n";
375*8fac9c7bSMasahiro Yamada    print "         [ -function funcname [ -function funcname ...] ]\n";
376*8fac9c7bSMasahiro Yamada    print "         [ -nofunction funcname [ -nofunction funcname ...] ]\n";
377*8fac9c7bSMasahiro Yamada    print "         [ -v ]\n";
378*8fac9c7bSMasahiro Yamada    print "         c source file(s) > outputfile\n";
379*8fac9c7bSMasahiro Yamada    print "         -v : verbose output, more warnings & other info listed\n";
380*8fac9c7bSMasahiro Yamada    exit 1;
381*8fac9c7bSMasahiro Yamada}
382*8fac9c7bSMasahiro Yamada
383*8fac9c7bSMasahiro Yamada# get kernel version from env
384*8fac9c7bSMasahiro Yamadasub get_kernel_version() {
385*8fac9c7bSMasahiro Yamada    my $version = 'unknown kernel version';
386*8fac9c7bSMasahiro Yamada
387*8fac9c7bSMasahiro Yamada    if (defined($ENV{'U_BOOT_VERSION'})) {
388*8fac9c7bSMasahiro Yamada	$version = $ENV{'U_BOOT_VERSION'};
389*8fac9c7bSMasahiro Yamada    }
390*8fac9c7bSMasahiro Yamada    return $version;
391*8fac9c7bSMasahiro Yamada}
392*8fac9c7bSMasahiro Yamada
393*8fac9c7bSMasahiro Yamada##
394*8fac9c7bSMasahiro Yamada# dumps section contents to arrays/hashes intended for that purpose.
395*8fac9c7bSMasahiro Yamada#
396*8fac9c7bSMasahiro Yamadasub dump_section {
397*8fac9c7bSMasahiro Yamada    my $file = shift;
398*8fac9c7bSMasahiro Yamada    my $name = shift;
399*8fac9c7bSMasahiro Yamada    my $contents = join "\n", @_;
400*8fac9c7bSMasahiro Yamada
401*8fac9c7bSMasahiro Yamada    if ($name =~ m/$type_constant/) {
402*8fac9c7bSMasahiro Yamada	$name = $1;
403*8fac9c7bSMasahiro Yamada#	print STDERR "constant section '$1' = '$contents'\n";
404*8fac9c7bSMasahiro Yamada	$constants{$name} = $contents;
405*8fac9c7bSMasahiro Yamada    } elsif ($name =~ m/$type_param/) {
406*8fac9c7bSMasahiro Yamada#	print STDERR "parameter def '$1' = '$contents'\n";
407*8fac9c7bSMasahiro Yamada	$name = $1;
408*8fac9c7bSMasahiro Yamada	$parameterdescs{$name} = $contents;
409*8fac9c7bSMasahiro Yamada	$sectcheck = $sectcheck . $name . " ";
410*8fac9c7bSMasahiro Yamada    } elsif ($name eq "@\.\.\.") {
411*8fac9c7bSMasahiro Yamada#	print STDERR "parameter def '...' = '$contents'\n";
412*8fac9c7bSMasahiro Yamada	$name = "...";
413*8fac9c7bSMasahiro Yamada	$parameterdescs{$name} = $contents;
414*8fac9c7bSMasahiro Yamada	$sectcheck = $sectcheck . $name . " ";
415*8fac9c7bSMasahiro Yamada    } else {
416*8fac9c7bSMasahiro Yamada#	print STDERR "other section '$name' = '$contents'\n";
417*8fac9c7bSMasahiro Yamada	if (defined($sections{$name}) && ($sections{$name} ne "")) {
418*8fac9c7bSMasahiro Yamada		print STDERR "Error(${file}:$.): duplicate section name '$name'\n";
419*8fac9c7bSMasahiro Yamada		++$errors;
420*8fac9c7bSMasahiro Yamada	}
421*8fac9c7bSMasahiro Yamada	$sections{$name} = $contents;
422*8fac9c7bSMasahiro Yamada	push @sectionlist, $name;
423*8fac9c7bSMasahiro Yamada    }
424*8fac9c7bSMasahiro Yamada}
425*8fac9c7bSMasahiro Yamada
426*8fac9c7bSMasahiro Yamada##
427*8fac9c7bSMasahiro Yamada# dump DOC: section after checking that it should go out
428*8fac9c7bSMasahiro Yamada#
429*8fac9c7bSMasahiro Yamadasub dump_doc_section {
430*8fac9c7bSMasahiro Yamada    my $file = shift;
431*8fac9c7bSMasahiro Yamada    my $name = shift;
432*8fac9c7bSMasahiro Yamada    my $contents = join "\n", @_;
433*8fac9c7bSMasahiro Yamada
434*8fac9c7bSMasahiro Yamada    if ($no_doc_sections) {
435*8fac9c7bSMasahiro Yamada	return;
436*8fac9c7bSMasahiro Yamada    }
437*8fac9c7bSMasahiro Yamada
438*8fac9c7bSMasahiro Yamada    if (($function_only == 0) ||
439*8fac9c7bSMasahiro Yamada	( $function_only == 1 && defined($function_table{$name})) ||
440*8fac9c7bSMasahiro Yamada	( $function_only == 2 && !defined($function_table{$name})))
441*8fac9c7bSMasahiro Yamada    {
442*8fac9c7bSMasahiro Yamada	dump_section($file, $name, $contents);
443*8fac9c7bSMasahiro Yamada	output_blockhead({'sectionlist' => \@sectionlist,
444*8fac9c7bSMasahiro Yamada			  'sections' => \%sections,
445*8fac9c7bSMasahiro Yamada			  'module' => $modulename,
446*8fac9c7bSMasahiro Yamada			  'content-only' => ($function_only != 0), });
447*8fac9c7bSMasahiro Yamada    }
448*8fac9c7bSMasahiro Yamada}
449*8fac9c7bSMasahiro Yamada
450*8fac9c7bSMasahiro Yamada##
451*8fac9c7bSMasahiro Yamada# output function
452*8fac9c7bSMasahiro Yamada#
453*8fac9c7bSMasahiro Yamada# parameterdescs, a hash.
454*8fac9c7bSMasahiro Yamada#  function => "function name"
455*8fac9c7bSMasahiro Yamada#  parameterlist => @list of parameters
456*8fac9c7bSMasahiro Yamada#  parameterdescs => %parameter descriptions
457*8fac9c7bSMasahiro Yamada#  sectionlist => @list of sections
458*8fac9c7bSMasahiro Yamada#  sections => %section descriptions
459*8fac9c7bSMasahiro Yamada#
460*8fac9c7bSMasahiro Yamada
461*8fac9c7bSMasahiro Yamadasub output_highlight {
462*8fac9c7bSMasahiro Yamada    my $contents = join "\n",@_;
463*8fac9c7bSMasahiro Yamada    my $line;
464*8fac9c7bSMasahiro Yamada
465*8fac9c7bSMasahiro Yamada#   DEBUG
466*8fac9c7bSMasahiro Yamada#   if (!defined $contents) {
467*8fac9c7bSMasahiro Yamada#	use Carp;
468*8fac9c7bSMasahiro Yamada#	confess "output_highlight got called with no args?\n";
469*8fac9c7bSMasahiro Yamada#   }
470*8fac9c7bSMasahiro Yamada
471*8fac9c7bSMasahiro Yamada    if ($output_mode eq "html" || $output_mode eq "html5" ||
472*8fac9c7bSMasahiro Yamada	$output_mode eq "xml") {
473*8fac9c7bSMasahiro Yamada	$contents = local_unescape($contents);
474*8fac9c7bSMasahiro Yamada	# convert data read & converted thru xml_escape() into &xyz; format:
475*8fac9c7bSMasahiro Yamada	$contents =~ s/\\\\\\/\&/g;
476*8fac9c7bSMasahiro Yamada    }
477*8fac9c7bSMasahiro Yamada#   print STDERR "contents b4:$contents\n";
478*8fac9c7bSMasahiro Yamada    eval $dohighlight;
479*8fac9c7bSMasahiro Yamada    die $@ if $@;
480*8fac9c7bSMasahiro Yamada#   print STDERR "contents af:$contents\n";
481*8fac9c7bSMasahiro Yamada
482*8fac9c7bSMasahiro Yamada#   strip whitespaces when generating html5
483*8fac9c7bSMasahiro Yamada    if ($output_mode eq "html5") {
484*8fac9c7bSMasahiro Yamada	$contents =~ s/^\s+//;
485*8fac9c7bSMasahiro Yamada	$contents =~ s/\s+$//;
486*8fac9c7bSMasahiro Yamada    }
487*8fac9c7bSMasahiro Yamada    foreach $line (split "\n", $contents) {
488*8fac9c7bSMasahiro Yamada	if ($line eq ""){
489*8fac9c7bSMasahiro Yamada	    print $lineprefix, local_unescape($blankline);
490*8fac9c7bSMasahiro Yamada	} else {
491*8fac9c7bSMasahiro Yamada	    $line =~ s/\\\\\\/\&/g;
492*8fac9c7bSMasahiro Yamada	    if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
493*8fac9c7bSMasahiro Yamada		print "\\&$line";
494*8fac9c7bSMasahiro Yamada	    } else {
495*8fac9c7bSMasahiro Yamada		print $lineprefix, $line;
496*8fac9c7bSMasahiro Yamada	    }
497*8fac9c7bSMasahiro Yamada	}
498*8fac9c7bSMasahiro Yamada	print "\n";
499*8fac9c7bSMasahiro Yamada    }
500*8fac9c7bSMasahiro Yamada}
501*8fac9c7bSMasahiro Yamada
502*8fac9c7bSMasahiro Yamada# output sections in html
503*8fac9c7bSMasahiro Yamadasub output_section_html(%) {
504*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
505*8fac9c7bSMasahiro Yamada    my $section;
506*8fac9c7bSMasahiro Yamada
507*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
508*8fac9c7bSMasahiro Yamada	print "<h3>$section</h3>\n";
509*8fac9c7bSMasahiro Yamada	print "<blockquote>\n";
510*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
511*8fac9c7bSMasahiro Yamada	print "</blockquote>\n";
512*8fac9c7bSMasahiro Yamada    }
513*8fac9c7bSMasahiro Yamada}
514*8fac9c7bSMasahiro Yamada
515*8fac9c7bSMasahiro Yamada# output enum in html
516*8fac9c7bSMasahiro Yamadasub output_enum_html(%) {
517*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
518*8fac9c7bSMasahiro Yamada    my ($parameter);
519*8fac9c7bSMasahiro Yamada    my $count;
520*8fac9c7bSMasahiro Yamada    print "<h2>enum " . $args{'enum'} . "</h2>\n";
521*8fac9c7bSMasahiro Yamada
522*8fac9c7bSMasahiro Yamada    print "<b>enum " . $args{'enum'} . "</b> {<br>\n";
523*8fac9c7bSMasahiro Yamada    $count = 0;
524*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
525*8fac9c7bSMasahiro Yamada	print " <b>" . $parameter . "</b>";
526*8fac9c7bSMasahiro Yamada	if ($count != $#{$args{'parameterlist'}}) {
527*8fac9c7bSMasahiro Yamada	    $count++;
528*8fac9c7bSMasahiro Yamada	    print ",\n";
529*8fac9c7bSMasahiro Yamada	}
530*8fac9c7bSMasahiro Yamada	print "<br>";
531*8fac9c7bSMasahiro Yamada    }
532*8fac9c7bSMasahiro Yamada    print "};<br>\n";
533*8fac9c7bSMasahiro Yamada
534*8fac9c7bSMasahiro Yamada    print "<h3>Constants</h3>\n";
535*8fac9c7bSMasahiro Yamada    print "<dl>\n";
536*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
537*8fac9c7bSMasahiro Yamada	print "<dt><b>" . $parameter . "</b>\n";
538*8fac9c7bSMasahiro Yamada	print "<dd>";
539*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter});
540*8fac9c7bSMasahiro Yamada    }
541*8fac9c7bSMasahiro Yamada    print "</dl>\n";
542*8fac9c7bSMasahiro Yamada    output_section_html(@_);
543*8fac9c7bSMasahiro Yamada    print "<hr>\n";
544*8fac9c7bSMasahiro Yamada}
545*8fac9c7bSMasahiro Yamada
546*8fac9c7bSMasahiro Yamada# output typedef in html
547*8fac9c7bSMasahiro Yamadasub output_typedef_html(%) {
548*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
549*8fac9c7bSMasahiro Yamada    my ($parameter);
550*8fac9c7bSMasahiro Yamada    my $count;
551*8fac9c7bSMasahiro Yamada    print "<h2>typedef " . $args{'typedef'} . "</h2>\n";
552*8fac9c7bSMasahiro Yamada
553*8fac9c7bSMasahiro Yamada    print "<b>typedef " . $args{'typedef'} . "</b>\n";
554*8fac9c7bSMasahiro Yamada    output_section_html(@_);
555*8fac9c7bSMasahiro Yamada    print "<hr>\n";
556*8fac9c7bSMasahiro Yamada}
557*8fac9c7bSMasahiro Yamada
558*8fac9c7bSMasahiro Yamada# output struct in html
559*8fac9c7bSMasahiro Yamadasub output_struct_html(%) {
560*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
561*8fac9c7bSMasahiro Yamada    my ($parameter);
562*8fac9c7bSMasahiro Yamada
563*8fac9c7bSMasahiro Yamada    print "<h2>" . $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "</h2>\n";
564*8fac9c7bSMasahiro Yamada    print "<b>" . $args{'type'} . " " . $args{'struct'} . "</b> {<br>\n";
565*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
566*8fac9c7bSMasahiro Yamada	if ($parameter =~ /^#/) {
567*8fac9c7bSMasahiro Yamada		print "$parameter<br>\n";
568*8fac9c7bSMasahiro Yamada		next;
569*8fac9c7bSMasahiro Yamada	}
570*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
571*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
572*8fac9c7bSMasahiro Yamada
573*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
574*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
575*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
576*8fac9c7bSMasahiro Yamada	    # pointer-to-function
577*8fac9c7bSMasahiro Yamada	    print "&nbsp; &nbsp; <i>$1</i><b>$parameter</b>) <i>($2)</i>;<br>\n";
578*8fac9c7bSMasahiro Yamada	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
579*8fac9c7bSMasahiro Yamada	    # bitfield
580*8fac9c7bSMasahiro Yamada	    print "&nbsp; &nbsp; <i>$1</i> <b>$parameter</b>$2;<br>\n";
581*8fac9c7bSMasahiro Yamada	} else {
582*8fac9c7bSMasahiro Yamada	    print "&nbsp; &nbsp; <i>$type</i> <b>$parameter</b>;<br>\n";
583*8fac9c7bSMasahiro Yamada	}
584*8fac9c7bSMasahiro Yamada    }
585*8fac9c7bSMasahiro Yamada    print "};<br>\n";
586*8fac9c7bSMasahiro Yamada
587*8fac9c7bSMasahiro Yamada    print "<h3>Members</h3>\n";
588*8fac9c7bSMasahiro Yamada    print "<dl>\n";
589*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
590*8fac9c7bSMasahiro Yamada	($parameter =~ /^#/) && next;
591*8fac9c7bSMasahiro Yamada
592*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
593*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
594*8fac9c7bSMasahiro Yamada
595*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
596*8fac9c7bSMasahiro Yamada	print "<dt><b>" . $parameter . "</b>\n";
597*8fac9c7bSMasahiro Yamada	print "<dd>";
598*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter_name});
599*8fac9c7bSMasahiro Yamada    }
600*8fac9c7bSMasahiro Yamada    print "</dl>\n";
601*8fac9c7bSMasahiro Yamada    output_section_html(@_);
602*8fac9c7bSMasahiro Yamada    print "<hr>\n";
603*8fac9c7bSMasahiro Yamada}
604*8fac9c7bSMasahiro Yamada
605*8fac9c7bSMasahiro Yamada# output function in html
606*8fac9c7bSMasahiro Yamadasub output_function_html(%) {
607*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
608*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
609*8fac9c7bSMasahiro Yamada    my $count;
610*8fac9c7bSMasahiro Yamada
611*8fac9c7bSMasahiro Yamada    print "<h2>" . $args{'function'} . " - " . $args{'purpose'} . "</h2>\n";
612*8fac9c7bSMasahiro Yamada    print "<i>" . $args{'functiontype'} . "</i>\n";
613*8fac9c7bSMasahiro Yamada    print "<b>" . $args{'function'} . "</b>\n";
614*8fac9c7bSMasahiro Yamada    print "(";
615*8fac9c7bSMasahiro Yamada    $count = 0;
616*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
617*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
618*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
619*8fac9c7bSMasahiro Yamada	    # pointer-to-function
620*8fac9c7bSMasahiro Yamada	    print "<i>$1</i><b>$parameter</b>) <i>($2)</i>";
621*8fac9c7bSMasahiro Yamada	} else {
622*8fac9c7bSMasahiro Yamada	    print "<i>" . $type . "</i> <b>" . $parameter . "</b>";
623*8fac9c7bSMasahiro Yamada	}
624*8fac9c7bSMasahiro Yamada	if ($count != $#{$args{'parameterlist'}}) {
625*8fac9c7bSMasahiro Yamada	    $count++;
626*8fac9c7bSMasahiro Yamada	    print ",\n";
627*8fac9c7bSMasahiro Yamada	}
628*8fac9c7bSMasahiro Yamada    }
629*8fac9c7bSMasahiro Yamada    print ")\n";
630*8fac9c7bSMasahiro Yamada
631*8fac9c7bSMasahiro Yamada    print "<h3>Arguments</h3>\n";
632*8fac9c7bSMasahiro Yamada    print "<dl>\n";
633*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
634*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
635*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
636*8fac9c7bSMasahiro Yamada
637*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
638*8fac9c7bSMasahiro Yamada	print "<dt><b>" . $parameter . "</b>\n";
639*8fac9c7bSMasahiro Yamada	print "<dd>";
640*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter_name});
641*8fac9c7bSMasahiro Yamada    }
642*8fac9c7bSMasahiro Yamada    print "</dl>\n";
643*8fac9c7bSMasahiro Yamada    output_section_html(@_);
644*8fac9c7bSMasahiro Yamada    print "<hr>\n";
645*8fac9c7bSMasahiro Yamada}
646*8fac9c7bSMasahiro Yamada
647*8fac9c7bSMasahiro Yamada# output DOC: block header in html
648*8fac9c7bSMasahiro Yamadasub output_blockhead_html(%) {
649*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
650*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
651*8fac9c7bSMasahiro Yamada    my $count;
652*8fac9c7bSMasahiro Yamada
653*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
654*8fac9c7bSMasahiro Yamada	print "<h3>$section</h3>\n";
655*8fac9c7bSMasahiro Yamada	print "<ul>\n";
656*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
657*8fac9c7bSMasahiro Yamada	print "</ul>\n";
658*8fac9c7bSMasahiro Yamada    }
659*8fac9c7bSMasahiro Yamada    print "<hr>\n";
660*8fac9c7bSMasahiro Yamada}
661*8fac9c7bSMasahiro Yamada
662*8fac9c7bSMasahiro Yamada# output sections in html5
663*8fac9c7bSMasahiro Yamadasub output_section_html5(%) {
664*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
665*8fac9c7bSMasahiro Yamada    my $section;
666*8fac9c7bSMasahiro Yamada
667*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
668*8fac9c7bSMasahiro Yamada	print "<section>\n";
669*8fac9c7bSMasahiro Yamada	print "<h1>$section</h1>\n";
670*8fac9c7bSMasahiro Yamada	print "<p>\n";
671*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
672*8fac9c7bSMasahiro Yamada	print "</p>\n";
673*8fac9c7bSMasahiro Yamada	print "</section>\n";
674*8fac9c7bSMasahiro Yamada    }
675*8fac9c7bSMasahiro Yamada}
676*8fac9c7bSMasahiro Yamada
677*8fac9c7bSMasahiro Yamada# output enum in html5
678*8fac9c7bSMasahiro Yamadasub output_enum_html5(%) {
679*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
680*8fac9c7bSMasahiro Yamada    my ($parameter);
681*8fac9c7bSMasahiro Yamada    my $count;
682*8fac9c7bSMasahiro Yamada    my $html5id;
683*8fac9c7bSMasahiro Yamada
684*8fac9c7bSMasahiro Yamada    $html5id = $args{'enum'};
685*8fac9c7bSMasahiro Yamada    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
686*8fac9c7bSMasahiro Yamada    print "<article class=\"enum\" id=\"enum:". $html5id . "\">";
687*8fac9c7bSMasahiro Yamada    print "<h1>enum " . $args{'enum'} . "</h1>\n";
688*8fac9c7bSMasahiro Yamada    print "<ol class=\"code\">\n";
689*8fac9c7bSMasahiro Yamada    print "<li>";
690*8fac9c7bSMasahiro Yamada    print "<span class=\"keyword\">enum</span> ";
691*8fac9c7bSMasahiro Yamada    print "<span class=\"identifier\">" . $args{'enum'} . "</span> {";
692*8fac9c7bSMasahiro Yamada    print "</li>\n";
693*8fac9c7bSMasahiro Yamada    $count = 0;
694*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
695*8fac9c7bSMasahiro Yamada	print "<li class=\"indent\">";
696*8fac9c7bSMasahiro Yamada	print "<span class=\"param\">" . $parameter . "</span>";
697*8fac9c7bSMasahiro Yamada	if ($count != $#{$args{'parameterlist'}}) {
698*8fac9c7bSMasahiro Yamada	    $count++;
699*8fac9c7bSMasahiro Yamada	    print ",";
700*8fac9c7bSMasahiro Yamada	}
701*8fac9c7bSMasahiro Yamada	print "</li>\n";
702*8fac9c7bSMasahiro Yamada    }
703*8fac9c7bSMasahiro Yamada    print "<li>};</li>\n";
704*8fac9c7bSMasahiro Yamada    print "</ol>\n";
705*8fac9c7bSMasahiro Yamada
706*8fac9c7bSMasahiro Yamada    print "<section>\n";
707*8fac9c7bSMasahiro Yamada    print "<h1>Constants</h1>\n";
708*8fac9c7bSMasahiro Yamada    print "<dl>\n";
709*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
710*8fac9c7bSMasahiro Yamada	print "<dt>" . $parameter . "</dt>\n";
711*8fac9c7bSMasahiro Yamada	print "<dd>";
712*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter});
713*8fac9c7bSMasahiro Yamada	print "</dd>\n";
714*8fac9c7bSMasahiro Yamada    }
715*8fac9c7bSMasahiro Yamada    print "</dl>\n";
716*8fac9c7bSMasahiro Yamada    print "</section>\n";
717*8fac9c7bSMasahiro Yamada    output_section_html5(@_);
718*8fac9c7bSMasahiro Yamada    print "</article>\n";
719*8fac9c7bSMasahiro Yamada}
720*8fac9c7bSMasahiro Yamada
721*8fac9c7bSMasahiro Yamada# output typedef in html5
722*8fac9c7bSMasahiro Yamadasub output_typedef_html5(%) {
723*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
724*8fac9c7bSMasahiro Yamada    my ($parameter);
725*8fac9c7bSMasahiro Yamada    my $count;
726*8fac9c7bSMasahiro Yamada    my $html5id;
727*8fac9c7bSMasahiro Yamada
728*8fac9c7bSMasahiro Yamada    $html5id = $args{'typedef'};
729*8fac9c7bSMasahiro Yamada    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
730*8fac9c7bSMasahiro Yamada    print "<article class=\"typedef\" id=\"typedef:" . $html5id . "\">\n";
731*8fac9c7bSMasahiro Yamada    print "<h1>typedef " . $args{'typedef'} . "</h1>\n";
732*8fac9c7bSMasahiro Yamada
733*8fac9c7bSMasahiro Yamada    print "<ol class=\"code\">\n";
734*8fac9c7bSMasahiro Yamada    print "<li>";
735*8fac9c7bSMasahiro Yamada    print "<span class=\"keyword\">typedef</span> ";
736*8fac9c7bSMasahiro Yamada    print "<span class=\"identifier\">" . $args{'typedef'} . "</span>";
737*8fac9c7bSMasahiro Yamada    print "</li>\n";
738*8fac9c7bSMasahiro Yamada    print "</ol>\n";
739*8fac9c7bSMasahiro Yamada    output_section_html5(@_);
740*8fac9c7bSMasahiro Yamada    print "</article>\n";
741*8fac9c7bSMasahiro Yamada}
742*8fac9c7bSMasahiro Yamada
743*8fac9c7bSMasahiro Yamada# output struct in html5
744*8fac9c7bSMasahiro Yamadasub output_struct_html5(%) {
745*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
746*8fac9c7bSMasahiro Yamada    my ($parameter);
747*8fac9c7bSMasahiro Yamada    my $html5id;
748*8fac9c7bSMasahiro Yamada
749*8fac9c7bSMasahiro Yamada    $html5id = $args{'struct'};
750*8fac9c7bSMasahiro Yamada    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
751*8fac9c7bSMasahiro Yamada    print "<article class=\"struct\" id=\"struct:" . $html5id . "\">\n";
752*8fac9c7bSMasahiro Yamada    print "<hgroup>\n";
753*8fac9c7bSMasahiro Yamada    print "<h1>" . $args{'type'} . " " . $args{'struct'} . "</h1>";
754*8fac9c7bSMasahiro Yamada    print "<h2>". $args{'purpose'} . "</h2>\n";
755*8fac9c7bSMasahiro Yamada    print "</hgroup>\n";
756*8fac9c7bSMasahiro Yamada    print "<ol class=\"code\">\n";
757*8fac9c7bSMasahiro Yamada    print "<li>";
758*8fac9c7bSMasahiro Yamada    print "<span class=\"type\">" . $args{'type'} . "</span> ";
759*8fac9c7bSMasahiro Yamada    print "<span class=\"identifier\">" . $args{'struct'} . "</span> {";
760*8fac9c7bSMasahiro Yamada    print "</li>\n";
761*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
762*8fac9c7bSMasahiro Yamada	print "<li class=\"indent\">";
763*8fac9c7bSMasahiro Yamada	if ($parameter =~ /^#/) {
764*8fac9c7bSMasahiro Yamada		print "<span class=\"param\">" . $parameter ."</span>\n";
765*8fac9c7bSMasahiro Yamada		print "</li>\n";
766*8fac9c7bSMasahiro Yamada		next;
767*8fac9c7bSMasahiro Yamada	}
768*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
769*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
770*8fac9c7bSMasahiro Yamada
771*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
772*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
773*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
774*8fac9c7bSMasahiro Yamada	    # pointer-to-function
775*8fac9c7bSMasahiro Yamada	    print "<span class=\"type\">$1</span> ";
776*8fac9c7bSMasahiro Yamada	    print "<span class=\"param\">$parameter</span>";
777*8fac9c7bSMasahiro Yamada	    print "<span class=\"type\">)</span> ";
778*8fac9c7bSMasahiro Yamada	    print "(<span class=\"args\">$2</span>);";
779*8fac9c7bSMasahiro Yamada	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
780*8fac9c7bSMasahiro Yamada	    # bitfield
781*8fac9c7bSMasahiro Yamada	    print "<span class=\"type\">$1</span> ";
782*8fac9c7bSMasahiro Yamada	    print "<span class=\"param\">$parameter</span>";
783*8fac9c7bSMasahiro Yamada	    print "<span class=\"bits\">$2</span>;";
784*8fac9c7bSMasahiro Yamada	} else {
785*8fac9c7bSMasahiro Yamada	    print "<span class=\"type\">$type</span> ";
786*8fac9c7bSMasahiro Yamada	    print "<span class=\"param\">$parameter</span>;";
787*8fac9c7bSMasahiro Yamada	}
788*8fac9c7bSMasahiro Yamada	print "</li>\n";
789*8fac9c7bSMasahiro Yamada    }
790*8fac9c7bSMasahiro Yamada    print "<li>};</li>\n";
791*8fac9c7bSMasahiro Yamada    print "</ol>\n";
792*8fac9c7bSMasahiro Yamada
793*8fac9c7bSMasahiro Yamada    print "<section>\n";
794*8fac9c7bSMasahiro Yamada    print "<h1>Members</h1>\n";
795*8fac9c7bSMasahiro Yamada    print "<dl>\n";
796*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
797*8fac9c7bSMasahiro Yamada	($parameter =~ /^#/) && next;
798*8fac9c7bSMasahiro Yamada
799*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
800*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
801*8fac9c7bSMasahiro Yamada
802*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
803*8fac9c7bSMasahiro Yamada	print "<dt>" . $parameter . "</dt>\n";
804*8fac9c7bSMasahiro Yamada	print "<dd>";
805*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter_name});
806*8fac9c7bSMasahiro Yamada	print "</dd>\n";
807*8fac9c7bSMasahiro Yamada    }
808*8fac9c7bSMasahiro Yamada    print "</dl>\n";
809*8fac9c7bSMasahiro Yamada    print "</section>\n";
810*8fac9c7bSMasahiro Yamada    output_section_html5(@_);
811*8fac9c7bSMasahiro Yamada    print "</article>\n";
812*8fac9c7bSMasahiro Yamada}
813*8fac9c7bSMasahiro Yamada
814*8fac9c7bSMasahiro Yamada# output function in html5
815*8fac9c7bSMasahiro Yamadasub output_function_html5(%) {
816*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
817*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
818*8fac9c7bSMasahiro Yamada    my $count;
819*8fac9c7bSMasahiro Yamada    my $html5id;
820*8fac9c7bSMasahiro Yamada
821*8fac9c7bSMasahiro Yamada    $html5id = $args{'function'};
822*8fac9c7bSMasahiro Yamada    $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
823*8fac9c7bSMasahiro Yamada    print "<article class=\"function\" id=\"func:". $html5id . "\">\n";
824*8fac9c7bSMasahiro Yamada    print "<hgroup>\n";
825*8fac9c7bSMasahiro Yamada    print "<h1>" . $args{'function'} . "</h1>";
826*8fac9c7bSMasahiro Yamada    print "<h2>" . $args{'purpose'} . "</h2>\n";
827*8fac9c7bSMasahiro Yamada    print "</hgroup>\n";
828*8fac9c7bSMasahiro Yamada    print "<ol class=\"code\">\n";
829*8fac9c7bSMasahiro Yamada    print "<li>";
830*8fac9c7bSMasahiro Yamada    print "<span class=\"type\">" . $args{'functiontype'} . "</span> ";
831*8fac9c7bSMasahiro Yamada    print "<span class=\"identifier\">" . $args{'function'} . "</span> (";
832*8fac9c7bSMasahiro Yamada    print "</li>";
833*8fac9c7bSMasahiro Yamada    $count = 0;
834*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
835*8fac9c7bSMasahiro Yamada	print "<li class=\"indent\">";
836*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
837*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
838*8fac9c7bSMasahiro Yamada	    # pointer-to-function
839*8fac9c7bSMasahiro Yamada	    print "<span class=\"type\">$1</span> ";
840*8fac9c7bSMasahiro Yamada	    print "<span class=\"param\">$parameter</span>";
841*8fac9c7bSMasahiro Yamada	    print "<span class=\"type\">)</span> ";
842*8fac9c7bSMasahiro Yamada	    print "(<span class=\"args\">$2</span>)";
843*8fac9c7bSMasahiro Yamada	} else {
844*8fac9c7bSMasahiro Yamada	    print "<span class=\"type\">$type</span> ";
845*8fac9c7bSMasahiro Yamada	    print "<span class=\"param\">$parameter</span>";
846*8fac9c7bSMasahiro Yamada	}
847*8fac9c7bSMasahiro Yamada	if ($count != $#{$args{'parameterlist'}}) {
848*8fac9c7bSMasahiro Yamada	    $count++;
849*8fac9c7bSMasahiro Yamada	    print ",";
850*8fac9c7bSMasahiro Yamada	}
851*8fac9c7bSMasahiro Yamada	print "</li>\n";
852*8fac9c7bSMasahiro Yamada    }
853*8fac9c7bSMasahiro Yamada    print "<li>)</li>\n";
854*8fac9c7bSMasahiro Yamada    print "</ol>\n";
855*8fac9c7bSMasahiro Yamada
856*8fac9c7bSMasahiro Yamada    print "<section>\n";
857*8fac9c7bSMasahiro Yamada    print "<h1>Arguments</h1>\n";
858*8fac9c7bSMasahiro Yamada    print "<p>\n";
859*8fac9c7bSMasahiro Yamada    print "<dl>\n";
860*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
861*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
862*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
863*8fac9c7bSMasahiro Yamada
864*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
865*8fac9c7bSMasahiro Yamada	print "<dt>" . $parameter . "</dt>\n";
866*8fac9c7bSMasahiro Yamada	print "<dd>";
867*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter_name});
868*8fac9c7bSMasahiro Yamada	print "</dd>\n";
869*8fac9c7bSMasahiro Yamada    }
870*8fac9c7bSMasahiro Yamada    print "</dl>\n";
871*8fac9c7bSMasahiro Yamada    print "</section>\n";
872*8fac9c7bSMasahiro Yamada    output_section_html5(@_);
873*8fac9c7bSMasahiro Yamada    print "</article>\n";
874*8fac9c7bSMasahiro Yamada}
875*8fac9c7bSMasahiro Yamada
876*8fac9c7bSMasahiro Yamada# output DOC: block header in html5
877*8fac9c7bSMasahiro Yamadasub output_blockhead_html5(%) {
878*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
879*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
880*8fac9c7bSMasahiro Yamada    my $count;
881*8fac9c7bSMasahiro Yamada    my $html5id;
882*8fac9c7bSMasahiro Yamada
883*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
884*8fac9c7bSMasahiro Yamada	$html5id = $section;
885*8fac9c7bSMasahiro Yamada	$html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
886*8fac9c7bSMasahiro Yamada	print "<article class=\"doc\" id=\"doc:". $html5id . "\">\n";
887*8fac9c7bSMasahiro Yamada	print "<h1>$section</h1>\n";
888*8fac9c7bSMasahiro Yamada	print "<p>\n";
889*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
890*8fac9c7bSMasahiro Yamada	print "</p>\n";
891*8fac9c7bSMasahiro Yamada    }
892*8fac9c7bSMasahiro Yamada    print "</article>\n";
893*8fac9c7bSMasahiro Yamada}
894*8fac9c7bSMasahiro Yamada
895*8fac9c7bSMasahiro Yamadasub output_section_xml(%) {
896*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
897*8fac9c7bSMasahiro Yamada    my $section;
898*8fac9c7bSMasahiro Yamada    # print out each section
899*8fac9c7bSMasahiro Yamada    $lineprefix="   ";
900*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
901*8fac9c7bSMasahiro Yamada	print "<refsect1>\n";
902*8fac9c7bSMasahiro Yamada	print "<title>$section</title>\n";
903*8fac9c7bSMasahiro Yamada	if ($section =~ m/EXAMPLE/i) {
904*8fac9c7bSMasahiro Yamada	    print "<informalexample><programlisting>\n";
905*8fac9c7bSMasahiro Yamada	} else {
906*8fac9c7bSMasahiro Yamada	    print "<para>\n";
907*8fac9c7bSMasahiro Yamada	}
908*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
909*8fac9c7bSMasahiro Yamada	if ($section =~ m/EXAMPLE/i) {
910*8fac9c7bSMasahiro Yamada	    print "</programlisting></informalexample>\n";
911*8fac9c7bSMasahiro Yamada	} else {
912*8fac9c7bSMasahiro Yamada	    print "</para>\n";
913*8fac9c7bSMasahiro Yamada	}
914*8fac9c7bSMasahiro Yamada	print "</refsect1>\n";
915*8fac9c7bSMasahiro Yamada    }
916*8fac9c7bSMasahiro Yamada}
917*8fac9c7bSMasahiro Yamada
918*8fac9c7bSMasahiro Yamada# output function in XML DocBook
919*8fac9c7bSMasahiro Yamadasub output_function_xml(%) {
920*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
921*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
922*8fac9c7bSMasahiro Yamada    my $count;
923*8fac9c7bSMasahiro Yamada    my $id;
924*8fac9c7bSMasahiro Yamada
925*8fac9c7bSMasahiro Yamada    $id = "API-" . $args{'function'};
926*8fac9c7bSMasahiro Yamada    $id =~ s/[^A-Za-z0-9]/-/g;
927*8fac9c7bSMasahiro Yamada
928*8fac9c7bSMasahiro Yamada    print "<refentry id=\"$id\">\n";
929*8fac9c7bSMasahiro Yamada    print "<refentryinfo>\n";
930*8fac9c7bSMasahiro Yamada    print " <title>U-BOOT</title>\n";
931*8fac9c7bSMasahiro Yamada    print " <productname>Bootloader Hackers Manual</productname>\n";
932*8fac9c7bSMasahiro Yamada    print " <date>$man_date</date>\n";
933*8fac9c7bSMasahiro Yamada    print "</refentryinfo>\n";
934*8fac9c7bSMasahiro Yamada    print "<refmeta>\n";
935*8fac9c7bSMasahiro Yamada    print " <refentrytitle><phrase>" . $args{'function'} . "</phrase></refentrytitle>\n";
936*8fac9c7bSMasahiro Yamada    print " <manvolnum>9</manvolnum>\n";
937*8fac9c7bSMasahiro Yamada    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
938*8fac9c7bSMasahiro Yamada    print "</refmeta>\n";
939*8fac9c7bSMasahiro Yamada    print "<refnamediv>\n";
940*8fac9c7bSMasahiro Yamada    print " <refname>" . $args{'function'} . "</refname>\n";
941*8fac9c7bSMasahiro Yamada    print " <refpurpose>\n";
942*8fac9c7bSMasahiro Yamada    print "  ";
943*8fac9c7bSMasahiro Yamada    output_highlight ($args{'purpose'});
944*8fac9c7bSMasahiro Yamada    print " </refpurpose>\n";
945*8fac9c7bSMasahiro Yamada    print "</refnamediv>\n";
946*8fac9c7bSMasahiro Yamada
947*8fac9c7bSMasahiro Yamada    print "<refsynopsisdiv>\n";
948*8fac9c7bSMasahiro Yamada    print " <title>Synopsis</title>\n";
949*8fac9c7bSMasahiro Yamada    print "  <funcsynopsis><funcprototype>\n";
950*8fac9c7bSMasahiro Yamada    print "   <funcdef>" . $args{'functiontype'} . " ";
951*8fac9c7bSMasahiro Yamada    print "<function>" . $args{'function'} . " </function></funcdef>\n";
952*8fac9c7bSMasahiro Yamada
953*8fac9c7bSMasahiro Yamada    $count = 0;
954*8fac9c7bSMasahiro Yamada    if ($#{$args{'parameterlist'}} >= 0) {
955*8fac9c7bSMasahiro Yamada	foreach $parameter (@{$args{'parameterlist'}}) {
956*8fac9c7bSMasahiro Yamada	    $type = $args{'parametertypes'}{$parameter};
957*8fac9c7bSMasahiro Yamada	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
958*8fac9c7bSMasahiro Yamada		# pointer-to-function
959*8fac9c7bSMasahiro Yamada		print "   <paramdef>$1<parameter>$parameter</parameter>)\n";
960*8fac9c7bSMasahiro Yamada		print "     <funcparams>$2</funcparams></paramdef>\n";
961*8fac9c7bSMasahiro Yamada	    } else {
962*8fac9c7bSMasahiro Yamada		print "   <paramdef>" . $type;
963*8fac9c7bSMasahiro Yamada		print " <parameter>$parameter</parameter></paramdef>\n";
964*8fac9c7bSMasahiro Yamada	    }
965*8fac9c7bSMasahiro Yamada	}
966*8fac9c7bSMasahiro Yamada    } else {
967*8fac9c7bSMasahiro Yamada	print "  <void/>\n";
968*8fac9c7bSMasahiro Yamada    }
969*8fac9c7bSMasahiro Yamada    print "  </funcprototype></funcsynopsis>\n";
970*8fac9c7bSMasahiro Yamada    print "</refsynopsisdiv>\n";
971*8fac9c7bSMasahiro Yamada
972*8fac9c7bSMasahiro Yamada    # print parameters
973*8fac9c7bSMasahiro Yamada    print "<refsect1>\n <title>Arguments</title>\n";
974*8fac9c7bSMasahiro Yamada    if ($#{$args{'parameterlist'}} >= 0) {
975*8fac9c7bSMasahiro Yamada	print " <variablelist>\n";
976*8fac9c7bSMasahiro Yamada	foreach $parameter (@{$args{'parameterlist'}}) {
977*8fac9c7bSMasahiro Yamada	    my $parameter_name = $parameter;
978*8fac9c7bSMasahiro Yamada	    $parameter_name =~ s/\[.*//;
979*8fac9c7bSMasahiro Yamada
980*8fac9c7bSMasahiro Yamada	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
981*8fac9c7bSMasahiro Yamada	    print "   <listitem>\n    <para>\n";
982*8fac9c7bSMasahiro Yamada	    $lineprefix="     ";
983*8fac9c7bSMasahiro Yamada	    output_highlight($args{'parameterdescs'}{$parameter_name});
984*8fac9c7bSMasahiro Yamada	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
985*8fac9c7bSMasahiro Yamada	}
986*8fac9c7bSMasahiro Yamada	print " </variablelist>\n";
987*8fac9c7bSMasahiro Yamada    } else {
988*8fac9c7bSMasahiro Yamada	print " <para>\n  None\n </para>\n";
989*8fac9c7bSMasahiro Yamada    }
990*8fac9c7bSMasahiro Yamada    print "</refsect1>\n";
991*8fac9c7bSMasahiro Yamada
992*8fac9c7bSMasahiro Yamada    output_section_xml(@_);
993*8fac9c7bSMasahiro Yamada    print "</refentry>\n\n";
994*8fac9c7bSMasahiro Yamada}
995*8fac9c7bSMasahiro Yamada
996*8fac9c7bSMasahiro Yamada# output struct in XML DocBook
997*8fac9c7bSMasahiro Yamadasub output_struct_xml(%) {
998*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
999*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1000*8fac9c7bSMasahiro Yamada    my $id;
1001*8fac9c7bSMasahiro Yamada
1002*8fac9c7bSMasahiro Yamada    $id = "API-struct-" . $args{'struct'};
1003*8fac9c7bSMasahiro Yamada    $id =~ s/[^A-Za-z0-9]/-/g;
1004*8fac9c7bSMasahiro Yamada
1005*8fac9c7bSMasahiro Yamada    print "<refentry id=\"$id\">\n";
1006*8fac9c7bSMasahiro Yamada    print "<refentryinfo>\n";
1007*8fac9c7bSMasahiro Yamada    print " <title>U-BOOT</title>\n";
1008*8fac9c7bSMasahiro Yamada    print " <productname>Bootloader Hackers Manual</productname>\n";
1009*8fac9c7bSMasahiro Yamada    print " <date>$man_date</date>\n";
1010*8fac9c7bSMasahiro Yamada    print "</refentryinfo>\n";
1011*8fac9c7bSMasahiro Yamada    print "<refmeta>\n";
1012*8fac9c7bSMasahiro Yamada    print " <refentrytitle><phrase>" . $args{'type'} . " " . $args{'struct'} . "</phrase></refentrytitle>\n";
1013*8fac9c7bSMasahiro Yamada    print " <manvolnum>9</manvolnum>\n";
1014*8fac9c7bSMasahiro Yamada    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
1015*8fac9c7bSMasahiro Yamada    print "</refmeta>\n";
1016*8fac9c7bSMasahiro Yamada    print "<refnamediv>\n";
1017*8fac9c7bSMasahiro Yamada    print " <refname>" . $args{'type'} . " " . $args{'struct'} . "</refname>\n";
1018*8fac9c7bSMasahiro Yamada    print " <refpurpose>\n";
1019*8fac9c7bSMasahiro Yamada    print "  ";
1020*8fac9c7bSMasahiro Yamada    output_highlight ($args{'purpose'});
1021*8fac9c7bSMasahiro Yamada    print " </refpurpose>\n";
1022*8fac9c7bSMasahiro Yamada    print "</refnamediv>\n";
1023*8fac9c7bSMasahiro Yamada
1024*8fac9c7bSMasahiro Yamada    print "<refsynopsisdiv>\n";
1025*8fac9c7bSMasahiro Yamada    print " <title>Synopsis</title>\n";
1026*8fac9c7bSMasahiro Yamada    print "  <programlisting>\n";
1027*8fac9c7bSMasahiro Yamada    print $args{'type'} . " " . $args{'struct'} . " {\n";
1028*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1029*8fac9c7bSMasahiro Yamada	if ($parameter =~ /^#/) {
1030*8fac9c7bSMasahiro Yamada	    my $prm = $parameter;
1031*8fac9c7bSMasahiro Yamada	    # convert data read & converted thru xml_escape() into &xyz; format:
1032*8fac9c7bSMasahiro Yamada	    # This allows us to have #define macros interspersed in a struct.
1033*8fac9c7bSMasahiro Yamada	    $prm =~ s/\\\\\\/\&/g;
1034*8fac9c7bSMasahiro Yamada	    print "$prm\n";
1035*8fac9c7bSMasahiro Yamada	    next;
1036*8fac9c7bSMasahiro Yamada	}
1037*8fac9c7bSMasahiro Yamada
1038*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1039*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1040*8fac9c7bSMasahiro Yamada
1041*8fac9c7bSMasahiro Yamada	defined($args{'parameterdescs'}{$parameter_name}) || next;
1042*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1043*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
1044*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
1045*8fac9c7bSMasahiro Yamada	    # pointer-to-function
1046*8fac9c7bSMasahiro Yamada	    print "  $1 $parameter) ($2);\n";
1047*8fac9c7bSMasahiro Yamada	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
1048*8fac9c7bSMasahiro Yamada	    # bitfield
1049*8fac9c7bSMasahiro Yamada	    print "  $1 $parameter$2;\n";
1050*8fac9c7bSMasahiro Yamada	} else {
1051*8fac9c7bSMasahiro Yamada	    print "  " . $type . " " . $parameter . ";\n";
1052*8fac9c7bSMasahiro Yamada	}
1053*8fac9c7bSMasahiro Yamada    }
1054*8fac9c7bSMasahiro Yamada    print "};";
1055*8fac9c7bSMasahiro Yamada    print "  </programlisting>\n";
1056*8fac9c7bSMasahiro Yamada    print "</refsynopsisdiv>\n";
1057*8fac9c7bSMasahiro Yamada
1058*8fac9c7bSMasahiro Yamada    print " <refsect1>\n";
1059*8fac9c7bSMasahiro Yamada    print "  <title>Members</title>\n";
1060*8fac9c7bSMasahiro Yamada
1061*8fac9c7bSMasahiro Yamada    if ($#{$args{'parameterlist'}} >= 0) {
1062*8fac9c7bSMasahiro Yamada    print "  <variablelist>\n";
1063*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1064*8fac9c7bSMasahiro Yamada      ($parameter =~ /^#/) && next;
1065*8fac9c7bSMasahiro Yamada
1066*8fac9c7bSMasahiro Yamada      my $parameter_name = $parameter;
1067*8fac9c7bSMasahiro Yamada      $parameter_name =~ s/\[.*//;
1068*8fac9c7bSMasahiro Yamada
1069*8fac9c7bSMasahiro Yamada      defined($args{'parameterdescs'}{$parameter_name}) || next;
1070*8fac9c7bSMasahiro Yamada      ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1071*8fac9c7bSMasahiro Yamada      print "    <varlistentry>";
1072*8fac9c7bSMasahiro Yamada      print "      <term>$parameter</term>\n";
1073*8fac9c7bSMasahiro Yamada      print "      <listitem><para>\n";
1074*8fac9c7bSMasahiro Yamada      output_highlight($args{'parameterdescs'}{$parameter_name});
1075*8fac9c7bSMasahiro Yamada      print "      </para></listitem>\n";
1076*8fac9c7bSMasahiro Yamada      print "    </varlistentry>\n";
1077*8fac9c7bSMasahiro Yamada    }
1078*8fac9c7bSMasahiro Yamada    print "  </variablelist>\n";
1079*8fac9c7bSMasahiro Yamada    } else {
1080*8fac9c7bSMasahiro Yamada	print " <para>\n  None\n </para>\n";
1081*8fac9c7bSMasahiro Yamada    }
1082*8fac9c7bSMasahiro Yamada    print " </refsect1>\n";
1083*8fac9c7bSMasahiro Yamada
1084*8fac9c7bSMasahiro Yamada    output_section_xml(@_);
1085*8fac9c7bSMasahiro Yamada
1086*8fac9c7bSMasahiro Yamada    print "</refentry>\n\n";
1087*8fac9c7bSMasahiro Yamada}
1088*8fac9c7bSMasahiro Yamada
1089*8fac9c7bSMasahiro Yamada# output enum in XML DocBook
1090*8fac9c7bSMasahiro Yamadasub output_enum_xml(%) {
1091*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1092*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1093*8fac9c7bSMasahiro Yamada    my $count;
1094*8fac9c7bSMasahiro Yamada    my $id;
1095*8fac9c7bSMasahiro Yamada
1096*8fac9c7bSMasahiro Yamada    $id = "API-enum-" . $args{'enum'};
1097*8fac9c7bSMasahiro Yamada    $id =~ s/[^A-Za-z0-9]/-/g;
1098*8fac9c7bSMasahiro Yamada
1099*8fac9c7bSMasahiro Yamada    print "<refentry id=\"$id\">\n";
1100*8fac9c7bSMasahiro Yamada    print "<refentryinfo>\n";
1101*8fac9c7bSMasahiro Yamada    print " <title>U-BOOT</title>\n";
1102*8fac9c7bSMasahiro Yamada    print " <productname>Bootloader Hackers Manual</productname>\n";
1103*8fac9c7bSMasahiro Yamada    print " <date>$man_date</date>\n";
1104*8fac9c7bSMasahiro Yamada    print "</refentryinfo>\n";
1105*8fac9c7bSMasahiro Yamada    print "<refmeta>\n";
1106*8fac9c7bSMasahiro Yamada    print " <refentrytitle><phrase>enum " . $args{'enum'} . "</phrase></refentrytitle>\n";
1107*8fac9c7bSMasahiro Yamada    print " <manvolnum>9</manvolnum>\n";
1108*8fac9c7bSMasahiro Yamada    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
1109*8fac9c7bSMasahiro Yamada    print "</refmeta>\n";
1110*8fac9c7bSMasahiro Yamada    print "<refnamediv>\n";
1111*8fac9c7bSMasahiro Yamada    print " <refname>enum " . $args{'enum'} . "</refname>\n";
1112*8fac9c7bSMasahiro Yamada    print " <refpurpose>\n";
1113*8fac9c7bSMasahiro Yamada    print "  ";
1114*8fac9c7bSMasahiro Yamada    output_highlight ($args{'purpose'});
1115*8fac9c7bSMasahiro Yamada    print " </refpurpose>\n";
1116*8fac9c7bSMasahiro Yamada    print "</refnamediv>\n";
1117*8fac9c7bSMasahiro Yamada
1118*8fac9c7bSMasahiro Yamada    print "<refsynopsisdiv>\n";
1119*8fac9c7bSMasahiro Yamada    print " <title>Synopsis</title>\n";
1120*8fac9c7bSMasahiro Yamada    print "  <programlisting>\n";
1121*8fac9c7bSMasahiro Yamada    print "enum " . $args{'enum'} . " {\n";
1122*8fac9c7bSMasahiro Yamada    $count = 0;
1123*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1124*8fac9c7bSMasahiro Yamada	print "  $parameter";
1125*8fac9c7bSMasahiro Yamada	if ($count != $#{$args{'parameterlist'}}) {
1126*8fac9c7bSMasahiro Yamada	    $count++;
1127*8fac9c7bSMasahiro Yamada	    print ",";
1128*8fac9c7bSMasahiro Yamada	}
1129*8fac9c7bSMasahiro Yamada	print "\n";
1130*8fac9c7bSMasahiro Yamada    }
1131*8fac9c7bSMasahiro Yamada    print "};";
1132*8fac9c7bSMasahiro Yamada    print "  </programlisting>\n";
1133*8fac9c7bSMasahiro Yamada    print "</refsynopsisdiv>\n";
1134*8fac9c7bSMasahiro Yamada
1135*8fac9c7bSMasahiro Yamada    print "<refsect1>\n";
1136*8fac9c7bSMasahiro Yamada    print " <title>Constants</title>\n";
1137*8fac9c7bSMasahiro Yamada    print "  <variablelist>\n";
1138*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1139*8fac9c7bSMasahiro Yamada      my $parameter_name = $parameter;
1140*8fac9c7bSMasahiro Yamada      $parameter_name =~ s/\[.*//;
1141*8fac9c7bSMasahiro Yamada
1142*8fac9c7bSMasahiro Yamada      print "    <varlistentry>";
1143*8fac9c7bSMasahiro Yamada      print "      <term>$parameter</term>\n";
1144*8fac9c7bSMasahiro Yamada      print "      <listitem><para>\n";
1145*8fac9c7bSMasahiro Yamada      output_highlight($args{'parameterdescs'}{$parameter_name});
1146*8fac9c7bSMasahiro Yamada      print "      </para></listitem>\n";
1147*8fac9c7bSMasahiro Yamada      print "    </varlistentry>\n";
1148*8fac9c7bSMasahiro Yamada    }
1149*8fac9c7bSMasahiro Yamada    print "  </variablelist>\n";
1150*8fac9c7bSMasahiro Yamada    print "</refsect1>\n";
1151*8fac9c7bSMasahiro Yamada
1152*8fac9c7bSMasahiro Yamada    output_section_xml(@_);
1153*8fac9c7bSMasahiro Yamada
1154*8fac9c7bSMasahiro Yamada    print "</refentry>\n\n";
1155*8fac9c7bSMasahiro Yamada}
1156*8fac9c7bSMasahiro Yamada
1157*8fac9c7bSMasahiro Yamada# output typedef in XML DocBook
1158*8fac9c7bSMasahiro Yamadasub output_typedef_xml(%) {
1159*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1160*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1161*8fac9c7bSMasahiro Yamada    my $id;
1162*8fac9c7bSMasahiro Yamada
1163*8fac9c7bSMasahiro Yamada    $id = "API-typedef-" . $args{'typedef'};
1164*8fac9c7bSMasahiro Yamada    $id =~ s/[^A-Za-z0-9]/-/g;
1165*8fac9c7bSMasahiro Yamada
1166*8fac9c7bSMasahiro Yamada    print "<refentry id=\"$id\">\n";
1167*8fac9c7bSMasahiro Yamada    print "<refentryinfo>\n";
1168*8fac9c7bSMasahiro Yamada    print " <title>U-BOOT</title>\n";
1169*8fac9c7bSMasahiro Yamada    print " <productname>Bootloader Hackers Manual</productname>\n";
1170*8fac9c7bSMasahiro Yamada    print " <date>$man_date</date>\n";
1171*8fac9c7bSMasahiro Yamada    print "</refentryinfo>\n";
1172*8fac9c7bSMasahiro Yamada    print "<refmeta>\n";
1173*8fac9c7bSMasahiro Yamada    print " <refentrytitle><phrase>typedef " . $args{'typedef'} . "</phrase></refentrytitle>\n";
1174*8fac9c7bSMasahiro Yamada    print " <manvolnum>9</manvolnum>\n";
1175*8fac9c7bSMasahiro Yamada    print "</refmeta>\n";
1176*8fac9c7bSMasahiro Yamada    print "<refnamediv>\n";
1177*8fac9c7bSMasahiro Yamada    print " <refname>typedef " . $args{'typedef'} . "</refname>\n";
1178*8fac9c7bSMasahiro Yamada    print " <refpurpose>\n";
1179*8fac9c7bSMasahiro Yamada    print "  ";
1180*8fac9c7bSMasahiro Yamada    output_highlight ($args{'purpose'});
1181*8fac9c7bSMasahiro Yamada    print " </refpurpose>\n";
1182*8fac9c7bSMasahiro Yamada    print "</refnamediv>\n";
1183*8fac9c7bSMasahiro Yamada
1184*8fac9c7bSMasahiro Yamada    print "<refsynopsisdiv>\n";
1185*8fac9c7bSMasahiro Yamada    print " <title>Synopsis</title>\n";
1186*8fac9c7bSMasahiro Yamada    print "  <synopsis>typedef " . $args{'typedef'} . ";</synopsis>\n";
1187*8fac9c7bSMasahiro Yamada    print "</refsynopsisdiv>\n";
1188*8fac9c7bSMasahiro Yamada
1189*8fac9c7bSMasahiro Yamada    output_section_xml(@_);
1190*8fac9c7bSMasahiro Yamada
1191*8fac9c7bSMasahiro Yamada    print "</refentry>\n\n";
1192*8fac9c7bSMasahiro Yamada}
1193*8fac9c7bSMasahiro Yamada
1194*8fac9c7bSMasahiro Yamada# output in XML DocBook
1195*8fac9c7bSMasahiro Yamadasub output_blockhead_xml(%) {
1196*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1197*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1198*8fac9c7bSMasahiro Yamada    my $count;
1199*8fac9c7bSMasahiro Yamada
1200*8fac9c7bSMasahiro Yamada    my $id = $args{'module'};
1201*8fac9c7bSMasahiro Yamada    $id =~ s/[^A-Za-z0-9]/-/g;
1202*8fac9c7bSMasahiro Yamada
1203*8fac9c7bSMasahiro Yamada    # print out each section
1204*8fac9c7bSMasahiro Yamada    $lineprefix="   ";
1205*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1206*8fac9c7bSMasahiro Yamada	if (!$args{'content-only'}) {
1207*8fac9c7bSMasahiro Yamada		print "<refsect1>\n <title>$section</title>\n";
1208*8fac9c7bSMasahiro Yamada	}
1209*8fac9c7bSMasahiro Yamada	if ($section =~ m/EXAMPLE/i) {
1210*8fac9c7bSMasahiro Yamada	    print "<example><para>\n";
1211*8fac9c7bSMasahiro Yamada	} else {
1212*8fac9c7bSMasahiro Yamada	    print "<para>\n";
1213*8fac9c7bSMasahiro Yamada	}
1214*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1215*8fac9c7bSMasahiro Yamada	if ($section =~ m/EXAMPLE/i) {
1216*8fac9c7bSMasahiro Yamada	    print "</para></example>\n";
1217*8fac9c7bSMasahiro Yamada	} else {
1218*8fac9c7bSMasahiro Yamada	    print "</para>";
1219*8fac9c7bSMasahiro Yamada	}
1220*8fac9c7bSMasahiro Yamada	if (!$args{'content-only'}) {
1221*8fac9c7bSMasahiro Yamada		print "\n</refsect1>\n";
1222*8fac9c7bSMasahiro Yamada	}
1223*8fac9c7bSMasahiro Yamada    }
1224*8fac9c7bSMasahiro Yamada
1225*8fac9c7bSMasahiro Yamada    print "\n\n";
1226*8fac9c7bSMasahiro Yamada}
1227*8fac9c7bSMasahiro Yamada
1228*8fac9c7bSMasahiro Yamada# output in XML DocBook
1229*8fac9c7bSMasahiro Yamadasub output_function_gnome {
1230*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1231*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1232*8fac9c7bSMasahiro Yamada    my $count;
1233*8fac9c7bSMasahiro Yamada    my $id;
1234*8fac9c7bSMasahiro Yamada
1235*8fac9c7bSMasahiro Yamada    $id = $args{'module'} . "-" . $args{'function'};
1236*8fac9c7bSMasahiro Yamada    $id =~ s/[^A-Za-z0-9]/-/g;
1237*8fac9c7bSMasahiro Yamada
1238*8fac9c7bSMasahiro Yamada    print "<sect2>\n";
1239*8fac9c7bSMasahiro Yamada    print " <title id=\"$id\">" . $args{'function'} . "</title>\n";
1240*8fac9c7bSMasahiro Yamada
1241*8fac9c7bSMasahiro Yamada    print "  <funcsynopsis>\n";
1242*8fac9c7bSMasahiro Yamada    print "   <funcdef>" . $args{'functiontype'} . " ";
1243*8fac9c7bSMasahiro Yamada    print "<function>" . $args{'function'} . " ";
1244*8fac9c7bSMasahiro Yamada    print "</function></funcdef>\n";
1245*8fac9c7bSMasahiro Yamada
1246*8fac9c7bSMasahiro Yamada    $count = 0;
1247*8fac9c7bSMasahiro Yamada    if ($#{$args{'parameterlist'}} >= 0) {
1248*8fac9c7bSMasahiro Yamada	foreach $parameter (@{$args{'parameterlist'}}) {
1249*8fac9c7bSMasahiro Yamada	    $type = $args{'parametertypes'}{$parameter};
1250*8fac9c7bSMasahiro Yamada	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
1251*8fac9c7bSMasahiro Yamada		# pointer-to-function
1252*8fac9c7bSMasahiro Yamada		print "   <paramdef>$1 <parameter>$parameter</parameter>)\n";
1253*8fac9c7bSMasahiro Yamada		print "     <funcparams>$2</funcparams></paramdef>\n";
1254*8fac9c7bSMasahiro Yamada	    } else {
1255*8fac9c7bSMasahiro Yamada		print "   <paramdef>" . $type;
1256*8fac9c7bSMasahiro Yamada		print " <parameter>$parameter</parameter></paramdef>\n";
1257*8fac9c7bSMasahiro Yamada	    }
1258*8fac9c7bSMasahiro Yamada	}
1259*8fac9c7bSMasahiro Yamada    } else {
1260*8fac9c7bSMasahiro Yamada	print "  <void>\n";
1261*8fac9c7bSMasahiro Yamada    }
1262*8fac9c7bSMasahiro Yamada    print "  </funcsynopsis>\n";
1263*8fac9c7bSMasahiro Yamada    if ($#{$args{'parameterlist'}} >= 0) {
1264*8fac9c7bSMasahiro Yamada	print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">\n";
1265*8fac9c7bSMasahiro Yamada	print "<tgroup cols=\"2\">\n";
1266*8fac9c7bSMasahiro Yamada	print "<colspec colwidth=\"2*\">\n";
1267*8fac9c7bSMasahiro Yamada	print "<colspec colwidth=\"8*\">\n";
1268*8fac9c7bSMasahiro Yamada	print "<tbody>\n";
1269*8fac9c7bSMasahiro Yamada	foreach $parameter (@{$args{'parameterlist'}}) {
1270*8fac9c7bSMasahiro Yamada	    my $parameter_name = $parameter;
1271*8fac9c7bSMasahiro Yamada	    $parameter_name =~ s/\[.*//;
1272*8fac9c7bSMasahiro Yamada
1273*8fac9c7bSMasahiro Yamada	    print "  <row><entry align=\"right\"><parameter>$parameter</parameter></entry>\n";
1274*8fac9c7bSMasahiro Yamada	    print "   <entry>\n";
1275*8fac9c7bSMasahiro Yamada	    $lineprefix="     ";
1276*8fac9c7bSMasahiro Yamada	    output_highlight($args{'parameterdescs'}{$parameter_name});
1277*8fac9c7bSMasahiro Yamada	    print "    </entry></row>\n";
1278*8fac9c7bSMasahiro Yamada	}
1279*8fac9c7bSMasahiro Yamada	print " </tbody></tgroup></informaltable>\n";
1280*8fac9c7bSMasahiro Yamada    } else {
1281*8fac9c7bSMasahiro Yamada	print " <para>\n  None\n </para>\n";
1282*8fac9c7bSMasahiro Yamada    }
1283*8fac9c7bSMasahiro Yamada
1284*8fac9c7bSMasahiro Yamada    # print out each section
1285*8fac9c7bSMasahiro Yamada    $lineprefix="   ";
1286*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1287*8fac9c7bSMasahiro Yamada	print "<simplesect>\n <title>$section</title>\n";
1288*8fac9c7bSMasahiro Yamada	if ($section =~ m/EXAMPLE/i) {
1289*8fac9c7bSMasahiro Yamada	    print "<example><programlisting>\n";
1290*8fac9c7bSMasahiro Yamada	} else {
1291*8fac9c7bSMasahiro Yamada	}
1292*8fac9c7bSMasahiro Yamada	print "<para>\n";
1293*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1294*8fac9c7bSMasahiro Yamada	print "</para>\n";
1295*8fac9c7bSMasahiro Yamada	if ($section =~ m/EXAMPLE/i) {
1296*8fac9c7bSMasahiro Yamada	    print "</programlisting></example>\n";
1297*8fac9c7bSMasahiro Yamada	} else {
1298*8fac9c7bSMasahiro Yamada	}
1299*8fac9c7bSMasahiro Yamada	print " </simplesect>\n";
1300*8fac9c7bSMasahiro Yamada    }
1301*8fac9c7bSMasahiro Yamada
1302*8fac9c7bSMasahiro Yamada    print "</sect2>\n\n";
1303*8fac9c7bSMasahiro Yamada}
1304*8fac9c7bSMasahiro Yamada
1305*8fac9c7bSMasahiro Yamada##
1306*8fac9c7bSMasahiro Yamada# output function in man
1307*8fac9c7bSMasahiro Yamadasub output_function_man(%) {
1308*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1309*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1310*8fac9c7bSMasahiro Yamada    my $count;
1311*8fac9c7bSMasahiro Yamada
1312*8fac9c7bSMasahiro Yamada    print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Bootloader Hacker's Manual\" U-BOOT\n";
1313*8fac9c7bSMasahiro Yamada
1314*8fac9c7bSMasahiro Yamada    print ".SH NAME\n";
1315*8fac9c7bSMasahiro Yamada    print $args{'function'} . " \\- " . $args{'purpose'} . "\n";
1316*8fac9c7bSMasahiro Yamada
1317*8fac9c7bSMasahiro Yamada    print ".SH SYNOPSIS\n";
1318*8fac9c7bSMasahiro Yamada    if ($args{'functiontype'} ne "") {
1319*8fac9c7bSMasahiro Yamada	print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} . "\n";
1320*8fac9c7bSMasahiro Yamada    } else {
1321*8fac9c7bSMasahiro Yamada	print ".B \"" . $args{'function'} . "\n";
1322*8fac9c7bSMasahiro Yamada    }
1323*8fac9c7bSMasahiro Yamada    $count = 0;
1324*8fac9c7bSMasahiro Yamada    my $parenth = "(";
1325*8fac9c7bSMasahiro Yamada    my $post = ",";
1326*8fac9c7bSMasahiro Yamada    foreach my $parameter (@{$args{'parameterlist'}}) {
1327*8fac9c7bSMasahiro Yamada	if ($count == $#{$args{'parameterlist'}}) {
1328*8fac9c7bSMasahiro Yamada	    $post = ");";
1329*8fac9c7bSMasahiro Yamada	}
1330*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
1331*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
1332*8fac9c7bSMasahiro Yamada	    # pointer-to-function
1333*8fac9c7bSMasahiro Yamada	    print ".BI \"" . $parenth . $1 . "\" " . $parameter . " \") (" . $2 . ")" . $post . "\"\n";
1334*8fac9c7bSMasahiro Yamada	} else {
1335*8fac9c7bSMasahiro Yamada	    $type =~ s/([^\*])$/$1 /;
1336*8fac9c7bSMasahiro Yamada	    print ".BI \"" . $parenth . $type . "\" " . $parameter . " \"" . $post . "\"\n";
1337*8fac9c7bSMasahiro Yamada	}
1338*8fac9c7bSMasahiro Yamada	$count++;
1339*8fac9c7bSMasahiro Yamada	$parenth = "";
1340*8fac9c7bSMasahiro Yamada    }
1341*8fac9c7bSMasahiro Yamada
1342*8fac9c7bSMasahiro Yamada    print ".SH ARGUMENTS\n";
1343*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1344*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1345*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1346*8fac9c7bSMasahiro Yamada
1347*8fac9c7bSMasahiro Yamada	print ".IP \"" . $parameter . "\" 12\n";
1348*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter_name});
1349*8fac9c7bSMasahiro Yamada    }
1350*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1351*8fac9c7bSMasahiro Yamada	print ".SH \"", uc $section, "\"\n";
1352*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1353*8fac9c7bSMasahiro Yamada    }
1354*8fac9c7bSMasahiro Yamada}
1355*8fac9c7bSMasahiro Yamada
1356*8fac9c7bSMasahiro Yamada##
1357*8fac9c7bSMasahiro Yamada# output enum in man
1358*8fac9c7bSMasahiro Yamadasub output_enum_man(%) {
1359*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1360*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1361*8fac9c7bSMasahiro Yamada    my $count;
1362*8fac9c7bSMasahiro Yamada
1363*8fac9c7bSMasahiro Yamada    print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" U-BOOT\n";
1364*8fac9c7bSMasahiro Yamada
1365*8fac9c7bSMasahiro Yamada    print ".SH NAME\n";
1366*8fac9c7bSMasahiro Yamada    print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "\n";
1367*8fac9c7bSMasahiro Yamada
1368*8fac9c7bSMasahiro Yamada    print ".SH SYNOPSIS\n";
1369*8fac9c7bSMasahiro Yamada    print "enum " . $args{'enum'} . " {\n";
1370*8fac9c7bSMasahiro Yamada    $count = 0;
1371*8fac9c7bSMasahiro Yamada    foreach my $parameter (@{$args{'parameterlist'}}) {
1372*8fac9c7bSMasahiro Yamada	print ".br\n.BI \"    $parameter\"\n";
1373*8fac9c7bSMasahiro Yamada	if ($count == $#{$args{'parameterlist'}}) {
1374*8fac9c7bSMasahiro Yamada	    print "\n};\n";
1375*8fac9c7bSMasahiro Yamada	    last;
1376*8fac9c7bSMasahiro Yamada	}
1377*8fac9c7bSMasahiro Yamada	else {
1378*8fac9c7bSMasahiro Yamada	    print ", \n.br\n";
1379*8fac9c7bSMasahiro Yamada	}
1380*8fac9c7bSMasahiro Yamada	$count++;
1381*8fac9c7bSMasahiro Yamada    }
1382*8fac9c7bSMasahiro Yamada
1383*8fac9c7bSMasahiro Yamada    print ".SH Constants\n";
1384*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1385*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1386*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1387*8fac9c7bSMasahiro Yamada
1388*8fac9c7bSMasahiro Yamada	print ".IP \"" . $parameter . "\" 12\n";
1389*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter_name});
1390*8fac9c7bSMasahiro Yamada    }
1391*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1392*8fac9c7bSMasahiro Yamada	print ".SH \"$section\"\n";
1393*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1394*8fac9c7bSMasahiro Yamada    }
1395*8fac9c7bSMasahiro Yamada}
1396*8fac9c7bSMasahiro Yamada
1397*8fac9c7bSMasahiro Yamada##
1398*8fac9c7bSMasahiro Yamada# output struct in man
1399*8fac9c7bSMasahiro Yamadasub output_struct_man(%) {
1400*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1401*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1402*8fac9c7bSMasahiro Yamada
1403*8fac9c7bSMasahiro Yamada    print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'struct'} . "\" \"$man_date\" \"API Manual\" U-BOOT\n";
1404*8fac9c7bSMasahiro Yamada
1405*8fac9c7bSMasahiro Yamada    print ".SH NAME\n";
1406*8fac9c7bSMasahiro Yamada    print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose'} . "\n";
1407*8fac9c7bSMasahiro Yamada
1408*8fac9c7bSMasahiro Yamada    print ".SH SYNOPSIS\n";
1409*8fac9c7bSMasahiro Yamada    print $args{'type'} . " " . $args{'struct'} . " {\n.br\n";
1410*8fac9c7bSMasahiro Yamada
1411*8fac9c7bSMasahiro Yamada    foreach my $parameter (@{$args{'parameterlist'}}) {
1412*8fac9c7bSMasahiro Yamada	if ($parameter =~ /^#/) {
1413*8fac9c7bSMasahiro Yamada	    print ".BI \"$parameter\"\n.br\n";
1414*8fac9c7bSMasahiro Yamada	    next;
1415*8fac9c7bSMasahiro Yamada	}
1416*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1417*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1418*8fac9c7bSMasahiro Yamada
1419*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1420*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
1421*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
1422*8fac9c7bSMasahiro Yamada	    # pointer-to-function
1423*8fac9c7bSMasahiro Yamada	    print ".BI \"    " . $1 . "\" " . $parameter . " \") (" . $2 . ")" . "\"\n;\n";
1424*8fac9c7bSMasahiro Yamada	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
1425*8fac9c7bSMasahiro Yamada	    # bitfield
1426*8fac9c7bSMasahiro Yamada	    print ".BI \"    " . $1 . "\ \" " . $parameter . $2 . " \"" . "\"\n;\n";
1427*8fac9c7bSMasahiro Yamada	} else {
1428*8fac9c7bSMasahiro Yamada	    $type =~ s/([^\*])$/$1 /;
1429*8fac9c7bSMasahiro Yamada	    print ".BI \"    " . $type . "\" " . $parameter . " \"" . "\"\n;\n";
1430*8fac9c7bSMasahiro Yamada	}
1431*8fac9c7bSMasahiro Yamada	print "\n.br\n";
1432*8fac9c7bSMasahiro Yamada    }
1433*8fac9c7bSMasahiro Yamada    print "};\n.br\n";
1434*8fac9c7bSMasahiro Yamada
1435*8fac9c7bSMasahiro Yamada    print ".SH Members\n";
1436*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1437*8fac9c7bSMasahiro Yamada	($parameter =~ /^#/) && next;
1438*8fac9c7bSMasahiro Yamada
1439*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1440*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1441*8fac9c7bSMasahiro Yamada
1442*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1443*8fac9c7bSMasahiro Yamada	print ".IP \"" . $parameter . "\" 12\n";
1444*8fac9c7bSMasahiro Yamada	output_highlight($args{'parameterdescs'}{$parameter_name});
1445*8fac9c7bSMasahiro Yamada    }
1446*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1447*8fac9c7bSMasahiro Yamada	print ".SH \"$section\"\n";
1448*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1449*8fac9c7bSMasahiro Yamada    }
1450*8fac9c7bSMasahiro Yamada}
1451*8fac9c7bSMasahiro Yamada
1452*8fac9c7bSMasahiro Yamada##
1453*8fac9c7bSMasahiro Yamada# output typedef in man
1454*8fac9c7bSMasahiro Yamadasub output_typedef_man(%) {
1455*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1456*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1457*8fac9c7bSMasahiro Yamada
1458*8fac9c7bSMasahiro Yamada    print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" U-BOOT\n";
1459*8fac9c7bSMasahiro Yamada
1460*8fac9c7bSMasahiro Yamada    print ".SH NAME\n";
1461*8fac9c7bSMasahiro Yamada    print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "\n";
1462*8fac9c7bSMasahiro Yamada
1463*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1464*8fac9c7bSMasahiro Yamada	print ".SH \"$section\"\n";
1465*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1466*8fac9c7bSMasahiro Yamada    }
1467*8fac9c7bSMasahiro Yamada}
1468*8fac9c7bSMasahiro Yamada
1469*8fac9c7bSMasahiro Yamadasub output_blockhead_man(%) {
1470*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1471*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1472*8fac9c7bSMasahiro Yamada    my $count;
1473*8fac9c7bSMasahiro Yamada
1474*8fac9c7bSMasahiro Yamada    print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" U-BOOT\n";
1475*8fac9c7bSMasahiro Yamada
1476*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1477*8fac9c7bSMasahiro Yamada	print ".SH \"$section\"\n";
1478*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1479*8fac9c7bSMasahiro Yamada    }
1480*8fac9c7bSMasahiro Yamada}
1481*8fac9c7bSMasahiro Yamada
1482*8fac9c7bSMasahiro Yamada##
1483*8fac9c7bSMasahiro Yamada# output in text
1484*8fac9c7bSMasahiro Yamadasub output_function_text(%) {
1485*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1486*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1487*8fac9c7bSMasahiro Yamada    my $start;
1488*8fac9c7bSMasahiro Yamada
1489*8fac9c7bSMasahiro Yamada    print "Name:\n\n";
1490*8fac9c7bSMasahiro Yamada    print $args{'function'} . " - " . $args{'purpose'} . "\n";
1491*8fac9c7bSMasahiro Yamada
1492*8fac9c7bSMasahiro Yamada    print "\nSynopsis:\n\n";
1493*8fac9c7bSMasahiro Yamada    if ($args{'functiontype'} ne "") {
1494*8fac9c7bSMasahiro Yamada	$start = $args{'functiontype'} . " " . $args{'function'} . " (";
1495*8fac9c7bSMasahiro Yamada    } else {
1496*8fac9c7bSMasahiro Yamada	$start = $args{'function'} . " (";
1497*8fac9c7bSMasahiro Yamada    }
1498*8fac9c7bSMasahiro Yamada    print $start;
1499*8fac9c7bSMasahiro Yamada
1500*8fac9c7bSMasahiro Yamada    my $count = 0;
1501*8fac9c7bSMasahiro Yamada    foreach my $parameter (@{$args{'parameterlist'}}) {
1502*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
1503*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
1504*8fac9c7bSMasahiro Yamada	    # pointer-to-function
1505*8fac9c7bSMasahiro Yamada	    print $1 . $parameter . ") (" . $2;
1506*8fac9c7bSMasahiro Yamada	} else {
1507*8fac9c7bSMasahiro Yamada	    print $type . " " . $parameter;
1508*8fac9c7bSMasahiro Yamada	}
1509*8fac9c7bSMasahiro Yamada	if ($count != $#{$args{'parameterlist'}}) {
1510*8fac9c7bSMasahiro Yamada	    $count++;
1511*8fac9c7bSMasahiro Yamada	    print ",\n";
1512*8fac9c7bSMasahiro Yamada	    print " " x length($start);
1513*8fac9c7bSMasahiro Yamada	} else {
1514*8fac9c7bSMasahiro Yamada	    print ");\n\n";
1515*8fac9c7bSMasahiro Yamada	}
1516*8fac9c7bSMasahiro Yamada    }
1517*8fac9c7bSMasahiro Yamada
1518*8fac9c7bSMasahiro Yamada    print "Arguments:\n\n";
1519*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1520*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1521*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1522*8fac9c7bSMasahiro Yamada
1523*8fac9c7bSMasahiro Yamada	print $parameter . "\n\t" . $args{'parameterdescs'}{$parameter_name} . "\n";
1524*8fac9c7bSMasahiro Yamada    }
1525*8fac9c7bSMasahiro Yamada    output_section_text(@_);
1526*8fac9c7bSMasahiro Yamada}
1527*8fac9c7bSMasahiro Yamada
1528*8fac9c7bSMasahiro Yamada#output sections in text
1529*8fac9c7bSMasahiro Yamadasub output_section_text(%) {
1530*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1531*8fac9c7bSMasahiro Yamada    my $section;
1532*8fac9c7bSMasahiro Yamada
1533*8fac9c7bSMasahiro Yamada    print "\n";
1534*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1535*8fac9c7bSMasahiro Yamada	print "$section:\n\n";
1536*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1537*8fac9c7bSMasahiro Yamada    }
1538*8fac9c7bSMasahiro Yamada    print "\n\n";
1539*8fac9c7bSMasahiro Yamada}
1540*8fac9c7bSMasahiro Yamada
1541*8fac9c7bSMasahiro Yamada# output enum in text
1542*8fac9c7bSMasahiro Yamadasub output_enum_text(%) {
1543*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1544*8fac9c7bSMasahiro Yamada    my ($parameter);
1545*8fac9c7bSMasahiro Yamada    my $count;
1546*8fac9c7bSMasahiro Yamada    print "Enum:\n\n";
1547*8fac9c7bSMasahiro Yamada
1548*8fac9c7bSMasahiro Yamada    print "enum " . $args{'enum'} . " - " . $args{'purpose'} . "\n\n";
1549*8fac9c7bSMasahiro Yamada    print "enum " . $args{'enum'} . " {\n";
1550*8fac9c7bSMasahiro Yamada    $count = 0;
1551*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1552*8fac9c7bSMasahiro Yamada	print "\t$parameter";
1553*8fac9c7bSMasahiro Yamada	if ($count != $#{$args{'parameterlist'}}) {
1554*8fac9c7bSMasahiro Yamada	    $count++;
1555*8fac9c7bSMasahiro Yamada	    print ",";
1556*8fac9c7bSMasahiro Yamada	}
1557*8fac9c7bSMasahiro Yamada	print "\n";
1558*8fac9c7bSMasahiro Yamada    }
1559*8fac9c7bSMasahiro Yamada    print "};\n\n";
1560*8fac9c7bSMasahiro Yamada
1561*8fac9c7bSMasahiro Yamada    print "Constants:\n\n";
1562*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1563*8fac9c7bSMasahiro Yamada	print "$parameter\n\t";
1564*8fac9c7bSMasahiro Yamada	print $args{'parameterdescs'}{$parameter} . "\n";
1565*8fac9c7bSMasahiro Yamada    }
1566*8fac9c7bSMasahiro Yamada
1567*8fac9c7bSMasahiro Yamada    output_section_text(@_);
1568*8fac9c7bSMasahiro Yamada}
1569*8fac9c7bSMasahiro Yamada
1570*8fac9c7bSMasahiro Yamada# output typedef in text
1571*8fac9c7bSMasahiro Yamadasub output_typedef_text(%) {
1572*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1573*8fac9c7bSMasahiro Yamada    my ($parameter);
1574*8fac9c7bSMasahiro Yamada    my $count;
1575*8fac9c7bSMasahiro Yamada    print "Typedef:\n\n";
1576*8fac9c7bSMasahiro Yamada
1577*8fac9c7bSMasahiro Yamada    print "typedef " . $args{'typedef'} . " - " . $args{'purpose'} . "\n";
1578*8fac9c7bSMasahiro Yamada    output_section_text(@_);
1579*8fac9c7bSMasahiro Yamada}
1580*8fac9c7bSMasahiro Yamada
1581*8fac9c7bSMasahiro Yamada# output struct as text
1582*8fac9c7bSMasahiro Yamadasub output_struct_text(%) {
1583*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1584*8fac9c7bSMasahiro Yamada    my ($parameter);
1585*8fac9c7bSMasahiro Yamada
1586*8fac9c7bSMasahiro Yamada    print $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "\n\n";
1587*8fac9c7bSMasahiro Yamada    print $args{'type'} . " " . $args{'struct'} . " {\n";
1588*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1589*8fac9c7bSMasahiro Yamada	if ($parameter =~ /^#/) {
1590*8fac9c7bSMasahiro Yamada	    print "$parameter\n";
1591*8fac9c7bSMasahiro Yamada	    next;
1592*8fac9c7bSMasahiro Yamada	}
1593*8fac9c7bSMasahiro Yamada
1594*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1595*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1596*8fac9c7bSMasahiro Yamada
1597*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1598*8fac9c7bSMasahiro Yamada	$type = $args{'parametertypes'}{$parameter};
1599*8fac9c7bSMasahiro Yamada	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
1600*8fac9c7bSMasahiro Yamada	    # pointer-to-function
1601*8fac9c7bSMasahiro Yamada	    print "\t$1 $parameter) ($2);\n";
1602*8fac9c7bSMasahiro Yamada	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
1603*8fac9c7bSMasahiro Yamada	    # bitfield
1604*8fac9c7bSMasahiro Yamada	    print "\t$1 $parameter$2;\n";
1605*8fac9c7bSMasahiro Yamada	} else {
1606*8fac9c7bSMasahiro Yamada	    print "\t" . $type . " " . $parameter . ";\n";
1607*8fac9c7bSMasahiro Yamada	}
1608*8fac9c7bSMasahiro Yamada    }
1609*8fac9c7bSMasahiro Yamada    print "};\n\n";
1610*8fac9c7bSMasahiro Yamada
1611*8fac9c7bSMasahiro Yamada    print "Members:\n\n";
1612*8fac9c7bSMasahiro Yamada    foreach $parameter (@{$args{'parameterlist'}}) {
1613*8fac9c7bSMasahiro Yamada	($parameter =~ /^#/) && next;
1614*8fac9c7bSMasahiro Yamada
1615*8fac9c7bSMasahiro Yamada	my $parameter_name = $parameter;
1616*8fac9c7bSMasahiro Yamada	$parameter_name =~ s/\[.*//;
1617*8fac9c7bSMasahiro Yamada
1618*8fac9c7bSMasahiro Yamada	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1619*8fac9c7bSMasahiro Yamada	print "$parameter\n\t";
1620*8fac9c7bSMasahiro Yamada	print $args{'parameterdescs'}{$parameter_name} . "\n";
1621*8fac9c7bSMasahiro Yamada    }
1622*8fac9c7bSMasahiro Yamada    print "\n";
1623*8fac9c7bSMasahiro Yamada    output_section_text(@_);
1624*8fac9c7bSMasahiro Yamada}
1625*8fac9c7bSMasahiro Yamada
1626*8fac9c7bSMasahiro Yamadasub output_blockhead_text(%) {
1627*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1628*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1629*8fac9c7bSMasahiro Yamada
1630*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1631*8fac9c7bSMasahiro Yamada	print " $section:\n";
1632*8fac9c7bSMasahiro Yamada	print "    -> ";
1633*8fac9c7bSMasahiro Yamada	output_highlight($args{'sections'}{$section});
1634*8fac9c7bSMasahiro Yamada    }
1635*8fac9c7bSMasahiro Yamada}
1636*8fac9c7bSMasahiro Yamada
1637*8fac9c7bSMasahiro Yamada## list mode output functions
1638*8fac9c7bSMasahiro Yamada
1639*8fac9c7bSMasahiro Yamadasub output_function_list(%) {
1640*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1641*8fac9c7bSMasahiro Yamada
1642*8fac9c7bSMasahiro Yamada    print $args{'function'} . "\n";
1643*8fac9c7bSMasahiro Yamada}
1644*8fac9c7bSMasahiro Yamada
1645*8fac9c7bSMasahiro Yamada# output enum in list
1646*8fac9c7bSMasahiro Yamadasub output_enum_list(%) {
1647*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1648*8fac9c7bSMasahiro Yamada    print $args{'enum'} . "\n";
1649*8fac9c7bSMasahiro Yamada}
1650*8fac9c7bSMasahiro Yamada
1651*8fac9c7bSMasahiro Yamada# output typedef in list
1652*8fac9c7bSMasahiro Yamadasub output_typedef_list(%) {
1653*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1654*8fac9c7bSMasahiro Yamada    print $args{'typedef'} . "\n";
1655*8fac9c7bSMasahiro Yamada}
1656*8fac9c7bSMasahiro Yamada
1657*8fac9c7bSMasahiro Yamada# output struct as list
1658*8fac9c7bSMasahiro Yamadasub output_struct_list(%) {
1659*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1660*8fac9c7bSMasahiro Yamada
1661*8fac9c7bSMasahiro Yamada    print $args{'struct'} . "\n";
1662*8fac9c7bSMasahiro Yamada}
1663*8fac9c7bSMasahiro Yamada
1664*8fac9c7bSMasahiro Yamadasub output_blockhead_list(%) {
1665*8fac9c7bSMasahiro Yamada    my %args = %{$_[0]};
1666*8fac9c7bSMasahiro Yamada    my ($parameter, $section);
1667*8fac9c7bSMasahiro Yamada
1668*8fac9c7bSMasahiro Yamada    foreach $section (@{$args{'sectionlist'}}) {
1669*8fac9c7bSMasahiro Yamada	print "DOC: $section\n";
1670*8fac9c7bSMasahiro Yamada    }
1671*8fac9c7bSMasahiro Yamada}
1672*8fac9c7bSMasahiro Yamada
1673*8fac9c7bSMasahiro Yamada##
1674*8fac9c7bSMasahiro Yamada# generic output function for all types (function, struct/union, typedef, enum);
1675*8fac9c7bSMasahiro Yamada# calls the generated, variable output_ function name based on
1676*8fac9c7bSMasahiro Yamada# functype and output_mode
1677*8fac9c7bSMasahiro Yamadasub output_declaration {
1678*8fac9c7bSMasahiro Yamada    no strict 'refs';
1679*8fac9c7bSMasahiro Yamada    my $name = shift;
1680*8fac9c7bSMasahiro Yamada    my $functype = shift;
1681*8fac9c7bSMasahiro Yamada    my $func = "output_${functype}_$output_mode";
1682*8fac9c7bSMasahiro Yamada    if (($function_only==0) ||
1683*8fac9c7bSMasahiro Yamada	( $function_only == 1 && defined($function_table{$name})) ||
1684*8fac9c7bSMasahiro Yamada	( $function_only == 2 && !defined($function_table{$name})))
1685*8fac9c7bSMasahiro Yamada    {
1686*8fac9c7bSMasahiro Yamada	&$func(@_);
1687*8fac9c7bSMasahiro Yamada	$section_counter++;
1688*8fac9c7bSMasahiro Yamada    }
1689*8fac9c7bSMasahiro Yamada}
1690*8fac9c7bSMasahiro Yamada
1691*8fac9c7bSMasahiro Yamada##
1692*8fac9c7bSMasahiro Yamada# generic output function - calls the right one based on current output mode.
1693*8fac9c7bSMasahiro Yamadasub output_blockhead {
1694*8fac9c7bSMasahiro Yamada    no strict 'refs';
1695*8fac9c7bSMasahiro Yamada    my $func = "output_blockhead_" . $output_mode;
1696*8fac9c7bSMasahiro Yamada    &$func(@_);
1697*8fac9c7bSMasahiro Yamada    $section_counter++;
1698*8fac9c7bSMasahiro Yamada}
1699*8fac9c7bSMasahiro Yamada
1700*8fac9c7bSMasahiro Yamada##
1701*8fac9c7bSMasahiro Yamada# takes a declaration (struct, union, enum, typedef) and
1702*8fac9c7bSMasahiro Yamada# invokes the right handler. NOT called for functions.
1703*8fac9c7bSMasahiro Yamadasub dump_declaration($$) {
1704*8fac9c7bSMasahiro Yamada    no strict 'refs';
1705*8fac9c7bSMasahiro Yamada    my ($prototype, $file) = @_;
1706*8fac9c7bSMasahiro Yamada    my $func = "dump_" . $decl_type;
1707*8fac9c7bSMasahiro Yamada    &$func(@_);
1708*8fac9c7bSMasahiro Yamada}
1709*8fac9c7bSMasahiro Yamada
1710*8fac9c7bSMasahiro Yamadasub dump_union($$) {
1711*8fac9c7bSMasahiro Yamada    dump_struct(@_);
1712*8fac9c7bSMasahiro Yamada}
1713*8fac9c7bSMasahiro Yamada
1714*8fac9c7bSMasahiro Yamadasub dump_struct($$) {
1715*8fac9c7bSMasahiro Yamada    my $x = shift;
1716*8fac9c7bSMasahiro Yamada    my $file = shift;
1717*8fac9c7bSMasahiro Yamada    my $nested;
1718*8fac9c7bSMasahiro Yamada
1719*8fac9c7bSMasahiro Yamada    if ($x =~ /(struct|union)\s+(\w+)\s*{(.*)}/) {
1720*8fac9c7bSMasahiro Yamada	#my $decl_type = $1;
1721*8fac9c7bSMasahiro Yamada	$declaration_name = $2;
1722*8fac9c7bSMasahiro Yamada	my $members = $3;
1723*8fac9c7bSMasahiro Yamada
1724*8fac9c7bSMasahiro Yamada	# ignore embedded structs or unions
1725*8fac9c7bSMasahiro Yamada	$members =~ s/({.*})//g;
1726*8fac9c7bSMasahiro Yamada	$nested = $1;
1727*8fac9c7bSMasahiro Yamada
1728*8fac9c7bSMasahiro Yamada	# ignore members marked private:
1729*8fac9c7bSMasahiro Yamada	$members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gos;
1730*8fac9c7bSMasahiro Yamada	$members =~ s/\/\*\s*private:.*//gos;
1731*8fac9c7bSMasahiro Yamada	# strip comments:
1732*8fac9c7bSMasahiro Yamada	$members =~ s/\/\*.*?\*\///gos;
1733*8fac9c7bSMasahiro Yamada	$nested =~ s/\/\*.*?\*\///gos;
1734*8fac9c7bSMasahiro Yamada	# strip kmemcheck_bitfield_{begin,end}.*;
1735*8fac9c7bSMasahiro Yamada	$members =~ s/kmemcheck_bitfield_.*?;//gos;
1736*8fac9c7bSMasahiro Yamada	# strip attributes
1737*8fac9c7bSMasahiro Yamada	$members =~ s/__aligned\s*\(\d+\)//gos;
1738*8fac9c7bSMasahiro Yamada
1739*8fac9c7bSMasahiro Yamada	create_parameterlist($members, ';', $file);
1740*8fac9c7bSMasahiro Yamada	check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested);
1741*8fac9c7bSMasahiro Yamada
1742*8fac9c7bSMasahiro Yamada	output_declaration($declaration_name,
1743*8fac9c7bSMasahiro Yamada			   'struct',
1744*8fac9c7bSMasahiro Yamada			   {'struct' => $declaration_name,
1745*8fac9c7bSMasahiro Yamada			    'module' => $modulename,
1746*8fac9c7bSMasahiro Yamada			    'parameterlist' => \@parameterlist,
1747*8fac9c7bSMasahiro Yamada			    'parameterdescs' => \%parameterdescs,
1748*8fac9c7bSMasahiro Yamada			    'parametertypes' => \%parametertypes,
1749*8fac9c7bSMasahiro Yamada			    'sectionlist' => \@sectionlist,
1750*8fac9c7bSMasahiro Yamada			    'sections' => \%sections,
1751*8fac9c7bSMasahiro Yamada			    'purpose' => $declaration_purpose,
1752*8fac9c7bSMasahiro Yamada			    'type' => $decl_type
1753*8fac9c7bSMasahiro Yamada			   });
1754*8fac9c7bSMasahiro Yamada    }
1755*8fac9c7bSMasahiro Yamada    else {
1756*8fac9c7bSMasahiro Yamada	print STDERR "Error(${file}:$.): Cannot parse struct or union!\n";
1757*8fac9c7bSMasahiro Yamada	++$errors;
1758*8fac9c7bSMasahiro Yamada    }
1759*8fac9c7bSMasahiro Yamada}
1760*8fac9c7bSMasahiro Yamada
1761*8fac9c7bSMasahiro Yamadasub dump_enum($$) {
1762*8fac9c7bSMasahiro Yamada    my $x = shift;
1763*8fac9c7bSMasahiro Yamada    my $file = shift;
1764*8fac9c7bSMasahiro Yamada
1765*8fac9c7bSMasahiro Yamada    $x =~ s@/\*.*?\*/@@gos;	# strip comments.
1766*8fac9c7bSMasahiro Yamada    $x =~ s/^#\s*define\s+.*$//; # strip #define macros inside enums
1767*8fac9c7bSMasahiro Yamada
1768*8fac9c7bSMasahiro Yamada    if ($x =~ /enum\s+(\w+)\s*{(.*)}/) {
1769*8fac9c7bSMasahiro Yamada	$declaration_name = $1;
1770*8fac9c7bSMasahiro Yamada	my $members = $2;
1771*8fac9c7bSMasahiro Yamada
1772*8fac9c7bSMasahiro Yamada	foreach my $arg (split ',', $members) {
1773*8fac9c7bSMasahiro Yamada	    $arg =~ s/^\s*(\w+).*/$1/;
1774*8fac9c7bSMasahiro Yamada	    push @parameterlist, $arg;
1775*8fac9c7bSMasahiro Yamada	    if (!$parameterdescs{$arg}) {
1776*8fac9c7bSMasahiro Yamada		$parameterdescs{$arg} = $undescribed;
1777*8fac9c7bSMasahiro Yamada		print STDERR "Warning(${file}:$.): Enum value '$arg' ".
1778*8fac9c7bSMasahiro Yamada		    "not described in enum '$declaration_name'\n";
1779*8fac9c7bSMasahiro Yamada	    }
1780*8fac9c7bSMasahiro Yamada
1781*8fac9c7bSMasahiro Yamada	}
1782*8fac9c7bSMasahiro Yamada
1783*8fac9c7bSMasahiro Yamada	output_declaration($declaration_name,
1784*8fac9c7bSMasahiro Yamada			   'enum',
1785*8fac9c7bSMasahiro Yamada			   {'enum' => $declaration_name,
1786*8fac9c7bSMasahiro Yamada			    'module' => $modulename,
1787*8fac9c7bSMasahiro Yamada			    'parameterlist' => \@parameterlist,
1788*8fac9c7bSMasahiro Yamada			    'parameterdescs' => \%parameterdescs,
1789*8fac9c7bSMasahiro Yamada			    'sectionlist' => \@sectionlist,
1790*8fac9c7bSMasahiro Yamada			    'sections' => \%sections,
1791*8fac9c7bSMasahiro Yamada			    'purpose' => $declaration_purpose
1792*8fac9c7bSMasahiro Yamada			   });
1793*8fac9c7bSMasahiro Yamada    }
1794*8fac9c7bSMasahiro Yamada    else {
1795*8fac9c7bSMasahiro Yamada	print STDERR "Error(${file}:$.): Cannot parse enum!\n";
1796*8fac9c7bSMasahiro Yamada	++$errors;
1797*8fac9c7bSMasahiro Yamada    }
1798*8fac9c7bSMasahiro Yamada}
1799*8fac9c7bSMasahiro Yamada
1800*8fac9c7bSMasahiro Yamadasub dump_typedef($$) {
1801*8fac9c7bSMasahiro Yamada    my $x = shift;
1802*8fac9c7bSMasahiro Yamada    my $file = shift;
1803*8fac9c7bSMasahiro Yamada
1804*8fac9c7bSMasahiro Yamada    $x =~ s@/\*.*?\*/@@gos;	# strip comments.
1805*8fac9c7bSMasahiro Yamada    while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
1806*8fac9c7bSMasahiro Yamada	$x =~ s/\(*.\)\s*;$/;/;
1807*8fac9c7bSMasahiro Yamada	$x =~ s/\[*.\]\s*;$/;/;
1808*8fac9c7bSMasahiro Yamada    }
1809*8fac9c7bSMasahiro Yamada
1810*8fac9c7bSMasahiro Yamada    if ($x =~ /typedef.*\s+(\w+)\s*;/) {
1811*8fac9c7bSMasahiro Yamada	$declaration_name = $1;
1812*8fac9c7bSMasahiro Yamada
1813*8fac9c7bSMasahiro Yamada	output_declaration($declaration_name,
1814*8fac9c7bSMasahiro Yamada			   'typedef',
1815*8fac9c7bSMasahiro Yamada			   {'typedef' => $declaration_name,
1816*8fac9c7bSMasahiro Yamada			    'module' => $modulename,
1817*8fac9c7bSMasahiro Yamada			    'sectionlist' => \@sectionlist,
1818*8fac9c7bSMasahiro Yamada			    'sections' => \%sections,
1819*8fac9c7bSMasahiro Yamada			    'purpose' => $declaration_purpose
1820*8fac9c7bSMasahiro Yamada			   });
1821*8fac9c7bSMasahiro Yamada    }
1822*8fac9c7bSMasahiro Yamada    else {
1823*8fac9c7bSMasahiro Yamada	print STDERR "Error(${file}:$.): Cannot parse typedef!\n";
1824*8fac9c7bSMasahiro Yamada	++$errors;
1825*8fac9c7bSMasahiro Yamada    }
1826*8fac9c7bSMasahiro Yamada}
1827*8fac9c7bSMasahiro Yamada
1828*8fac9c7bSMasahiro Yamadasub save_struct_actual($) {
1829*8fac9c7bSMasahiro Yamada    my $actual = shift;
1830*8fac9c7bSMasahiro Yamada
1831*8fac9c7bSMasahiro Yamada    # strip all spaces from the actual param so that it looks like one string item
1832*8fac9c7bSMasahiro Yamada    $actual =~ s/\s*//g;
1833*8fac9c7bSMasahiro Yamada    $struct_actual = $struct_actual . $actual . " ";
1834*8fac9c7bSMasahiro Yamada}
1835*8fac9c7bSMasahiro Yamada
1836*8fac9c7bSMasahiro Yamadasub create_parameterlist($$$) {
1837*8fac9c7bSMasahiro Yamada    my $args = shift;
1838*8fac9c7bSMasahiro Yamada    my $splitter = shift;
1839*8fac9c7bSMasahiro Yamada    my $file = shift;
1840*8fac9c7bSMasahiro Yamada    my $type;
1841*8fac9c7bSMasahiro Yamada    my $param;
1842*8fac9c7bSMasahiro Yamada
1843*8fac9c7bSMasahiro Yamada    # temporarily replace commas inside function pointer definition
1844*8fac9c7bSMasahiro Yamada    while ($args =~ /(\([^\),]+),/) {
1845*8fac9c7bSMasahiro Yamada	$args =~ s/(\([^\),]+),/$1#/g;
1846*8fac9c7bSMasahiro Yamada    }
1847*8fac9c7bSMasahiro Yamada
1848*8fac9c7bSMasahiro Yamada    foreach my $arg (split($splitter, $args)) {
1849*8fac9c7bSMasahiro Yamada	# strip comments
1850*8fac9c7bSMasahiro Yamada	$arg =~ s/\/\*.*\*\///;
1851*8fac9c7bSMasahiro Yamada	# strip leading/trailing spaces
1852*8fac9c7bSMasahiro Yamada	$arg =~ s/^\s*//;
1853*8fac9c7bSMasahiro Yamada	$arg =~ s/\s*$//;
1854*8fac9c7bSMasahiro Yamada	$arg =~ s/\s+/ /;
1855*8fac9c7bSMasahiro Yamada
1856*8fac9c7bSMasahiro Yamada	if ($arg =~ /^#/) {
1857*8fac9c7bSMasahiro Yamada	    # Treat preprocessor directive as a typeless variable just to fill
1858*8fac9c7bSMasahiro Yamada	    # corresponding data structures "correctly". Catch it later in
1859*8fac9c7bSMasahiro Yamada	    # output_* subs.
1860*8fac9c7bSMasahiro Yamada	    push_parameter($arg, "", $file);
1861*8fac9c7bSMasahiro Yamada	} elsif ($arg =~ m/\(.+\)\s*\(/) {
1862*8fac9c7bSMasahiro Yamada	    # pointer-to-function
1863*8fac9c7bSMasahiro Yamada	    $arg =~ tr/#/,/;
1864*8fac9c7bSMasahiro Yamada	    $arg =~ m/[^\(]+\(\*?\s*(\w*)\s*\)/;
1865*8fac9c7bSMasahiro Yamada	    $param = $1;
1866*8fac9c7bSMasahiro Yamada	    $type = $arg;
1867*8fac9c7bSMasahiro Yamada	    $type =~ s/([^\(]+\(\*?)\s*$param/$1/;
1868*8fac9c7bSMasahiro Yamada	    save_struct_actual($param);
1869*8fac9c7bSMasahiro Yamada	    push_parameter($param, $type, $file);
1870*8fac9c7bSMasahiro Yamada	} elsif ($arg) {
1871*8fac9c7bSMasahiro Yamada	    $arg =~ s/\s*:\s*/:/g;
1872*8fac9c7bSMasahiro Yamada	    $arg =~ s/\s*\[/\[/g;
1873*8fac9c7bSMasahiro Yamada
1874*8fac9c7bSMasahiro Yamada	    my @args = split('\s*,\s*', $arg);
1875*8fac9c7bSMasahiro Yamada	    if ($args[0] =~ m/\*/) {
1876*8fac9c7bSMasahiro Yamada		$args[0] =~ s/(\*+)\s*/ $1/;
1877*8fac9c7bSMasahiro Yamada	    }
1878*8fac9c7bSMasahiro Yamada
1879*8fac9c7bSMasahiro Yamada	    my @first_arg;
1880*8fac9c7bSMasahiro Yamada	    if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) {
1881*8fac9c7bSMasahiro Yamada		    shift @args;
1882*8fac9c7bSMasahiro Yamada		    push(@first_arg, split('\s+', $1));
1883*8fac9c7bSMasahiro Yamada		    push(@first_arg, $2);
1884*8fac9c7bSMasahiro Yamada	    } else {
1885*8fac9c7bSMasahiro Yamada		    @first_arg = split('\s+', shift @args);
1886*8fac9c7bSMasahiro Yamada	    }
1887*8fac9c7bSMasahiro Yamada
1888*8fac9c7bSMasahiro Yamada	    unshift(@args, pop @first_arg);
1889*8fac9c7bSMasahiro Yamada	    $type = join " ", @first_arg;
1890*8fac9c7bSMasahiro Yamada
1891*8fac9c7bSMasahiro Yamada	    foreach $param (@args) {
1892*8fac9c7bSMasahiro Yamada		if ($param =~ m/^(\*+)\s*(.*)/) {
1893*8fac9c7bSMasahiro Yamada		    save_struct_actual($2);
1894*8fac9c7bSMasahiro Yamada		    push_parameter($2, "$type $1", $file);
1895*8fac9c7bSMasahiro Yamada		}
1896*8fac9c7bSMasahiro Yamada		elsif ($param =~ m/(.*?):(\d+)/) {
1897*8fac9c7bSMasahiro Yamada		    if ($type ne "") { # skip unnamed bit-fields
1898*8fac9c7bSMasahiro Yamada			save_struct_actual($1);
1899*8fac9c7bSMasahiro Yamada			push_parameter($1, "$type:$2", $file)
1900*8fac9c7bSMasahiro Yamada		    }
1901*8fac9c7bSMasahiro Yamada		}
1902*8fac9c7bSMasahiro Yamada		else {
1903*8fac9c7bSMasahiro Yamada		    save_struct_actual($param);
1904*8fac9c7bSMasahiro Yamada		    push_parameter($param, $type, $file);
1905*8fac9c7bSMasahiro Yamada		}
1906*8fac9c7bSMasahiro Yamada	    }
1907*8fac9c7bSMasahiro Yamada	}
1908*8fac9c7bSMasahiro Yamada    }
1909*8fac9c7bSMasahiro Yamada}
1910*8fac9c7bSMasahiro Yamada
1911*8fac9c7bSMasahiro Yamadasub push_parameter($$$) {
1912*8fac9c7bSMasahiro Yamada	my $param = shift;
1913*8fac9c7bSMasahiro Yamada	my $type = shift;
1914*8fac9c7bSMasahiro Yamada	my $file = shift;
1915*8fac9c7bSMasahiro Yamada
1916*8fac9c7bSMasahiro Yamada	if (($anon_struct_union == 1) && ($type eq "") &&
1917*8fac9c7bSMasahiro Yamada	    ($param eq "}")) {
1918*8fac9c7bSMasahiro Yamada		return;		# ignore the ending }; from anon. struct/union
1919*8fac9c7bSMasahiro Yamada	}
1920*8fac9c7bSMasahiro Yamada
1921*8fac9c7bSMasahiro Yamada	$anon_struct_union = 0;
1922*8fac9c7bSMasahiro Yamada	my $param_name = $param;
1923*8fac9c7bSMasahiro Yamada	$param_name =~ s/\[.*//;
1924*8fac9c7bSMasahiro Yamada
1925*8fac9c7bSMasahiro Yamada	if ($type eq "" && $param =~ /\.\.\.$/)
1926*8fac9c7bSMasahiro Yamada	{
1927*8fac9c7bSMasahiro Yamada	    if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq "") {
1928*8fac9c7bSMasahiro Yamada		$parameterdescs{$param} = "variable arguments";
1929*8fac9c7bSMasahiro Yamada	    }
1930*8fac9c7bSMasahiro Yamada	}
1931*8fac9c7bSMasahiro Yamada	elsif ($type eq "" && ($param eq "" or $param eq "void"))
1932*8fac9c7bSMasahiro Yamada	{
1933*8fac9c7bSMasahiro Yamada	    $param="void";
1934*8fac9c7bSMasahiro Yamada	    $parameterdescs{void} = "no arguments";
1935*8fac9c7bSMasahiro Yamada	}
1936*8fac9c7bSMasahiro Yamada	elsif ($type eq "" && ($param eq "struct" or $param eq "union"))
1937*8fac9c7bSMasahiro Yamada	# handle unnamed (anonymous) union or struct:
1938*8fac9c7bSMasahiro Yamada	{
1939*8fac9c7bSMasahiro Yamada		$type = $param;
1940*8fac9c7bSMasahiro Yamada		$param = "{unnamed_" . $param . "}";
1941*8fac9c7bSMasahiro Yamada		$parameterdescs{$param} = "anonymous\n";
1942*8fac9c7bSMasahiro Yamada		$anon_struct_union = 1;
1943*8fac9c7bSMasahiro Yamada	}
1944*8fac9c7bSMasahiro Yamada
1945*8fac9c7bSMasahiro Yamada	# warn if parameter has no description
1946*8fac9c7bSMasahiro Yamada	# (but ignore ones starting with # as these are not parameters
1947*8fac9c7bSMasahiro Yamada	# but inline preprocessor statements);
1948*8fac9c7bSMasahiro Yamada	# also ignore unnamed structs/unions;
1949*8fac9c7bSMasahiro Yamada	if (!$anon_struct_union) {
1950*8fac9c7bSMasahiro Yamada	if (!defined $parameterdescs{$param_name} && $param_name !~ /^#/) {
1951*8fac9c7bSMasahiro Yamada
1952*8fac9c7bSMasahiro Yamada	    $parameterdescs{$param_name} = $undescribed;
1953*8fac9c7bSMasahiro Yamada
1954*8fac9c7bSMasahiro Yamada	    if (($type eq 'function') || ($type eq 'enum')) {
1955*8fac9c7bSMasahiro Yamada		print STDERR "Warning(${file}:$.): Function parameter ".
1956*8fac9c7bSMasahiro Yamada		    "or member '$param' not " .
1957*8fac9c7bSMasahiro Yamada		    "described in '$declaration_name'\n";
1958*8fac9c7bSMasahiro Yamada	    }
1959*8fac9c7bSMasahiro Yamada	    print STDERR "Warning(${file}:$.):" .
1960*8fac9c7bSMasahiro Yamada			 " No description found for parameter '$param'\n";
1961*8fac9c7bSMasahiro Yamada	    ++$warnings;
1962*8fac9c7bSMasahiro Yamada	}
1963*8fac9c7bSMasahiro Yamada	}
1964*8fac9c7bSMasahiro Yamada
1965*8fac9c7bSMasahiro Yamada	$param = xml_escape($param);
1966*8fac9c7bSMasahiro Yamada
1967*8fac9c7bSMasahiro Yamada	# strip spaces from $param so that it is one continuous string
1968*8fac9c7bSMasahiro Yamada	# on @parameterlist;
1969*8fac9c7bSMasahiro Yamada	# this fixes a problem where check_sections() cannot find
1970*8fac9c7bSMasahiro Yamada	# a parameter like "addr[6 + 2]" because it actually appears
1971*8fac9c7bSMasahiro Yamada	# as "addr[6", "+", "2]" on the parameter list;
1972*8fac9c7bSMasahiro Yamada	# but it's better to maintain the param string unchanged for output,
1973*8fac9c7bSMasahiro Yamada	# so just weaken the string compare in check_sections() to ignore
1974*8fac9c7bSMasahiro Yamada	# "[blah" in a parameter string;
1975*8fac9c7bSMasahiro Yamada	###$param =~ s/\s*//g;
1976*8fac9c7bSMasahiro Yamada	push @parameterlist, $param;
1977*8fac9c7bSMasahiro Yamada	$parametertypes{$param} = $type;
1978*8fac9c7bSMasahiro Yamada}
1979*8fac9c7bSMasahiro Yamada
1980*8fac9c7bSMasahiro Yamadasub check_sections($$$$$$) {
1981*8fac9c7bSMasahiro Yamada	my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck, $nested) = @_;
1982*8fac9c7bSMasahiro Yamada	my @sects = split ' ', $sectcheck;
1983*8fac9c7bSMasahiro Yamada	my @prms = split ' ', $prmscheck;
1984*8fac9c7bSMasahiro Yamada	my $err;
1985*8fac9c7bSMasahiro Yamada	my ($px, $sx);
1986*8fac9c7bSMasahiro Yamada	my $prm_clean;		# strip trailing "[array size]" and/or beginning "*"
1987*8fac9c7bSMasahiro Yamada
1988*8fac9c7bSMasahiro Yamada	foreach $sx (0 .. $#sects) {
1989*8fac9c7bSMasahiro Yamada		$err = 1;
1990*8fac9c7bSMasahiro Yamada		foreach $px (0 .. $#prms) {
1991*8fac9c7bSMasahiro Yamada			$prm_clean = $prms[$px];
1992*8fac9c7bSMasahiro Yamada			$prm_clean =~ s/\[.*\]//;
1993*8fac9c7bSMasahiro Yamada			$prm_clean =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//i;
1994*8fac9c7bSMasahiro Yamada			# ignore array size in a parameter string;
1995*8fac9c7bSMasahiro Yamada			# however, the original param string may contain
1996*8fac9c7bSMasahiro Yamada			# spaces, e.g.:  addr[6 + 2]
1997*8fac9c7bSMasahiro Yamada			# and this appears in @prms as "addr[6" since the
1998*8fac9c7bSMasahiro Yamada			# parameter list is split at spaces;
1999*8fac9c7bSMasahiro Yamada			# hence just ignore "[..." for the sections check;
2000*8fac9c7bSMasahiro Yamada			$prm_clean =~ s/\[.*//;
2001*8fac9c7bSMasahiro Yamada
2002*8fac9c7bSMasahiro Yamada			##$prm_clean =~ s/^\**//;
2003*8fac9c7bSMasahiro Yamada			if ($prm_clean eq $sects[$sx]) {
2004*8fac9c7bSMasahiro Yamada				$err = 0;
2005*8fac9c7bSMasahiro Yamada				last;
2006*8fac9c7bSMasahiro Yamada			}
2007*8fac9c7bSMasahiro Yamada		}
2008*8fac9c7bSMasahiro Yamada		if ($err) {
2009*8fac9c7bSMasahiro Yamada			if ($decl_type eq "function") {
2010*8fac9c7bSMasahiro Yamada				print STDERR "Warning(${file}:$.): " .
2011*8fac9c7bSMasahiro Yamada					"Excess function parameter " .
2012*8fac9c7bSMasahiro Yamada					"'$sects[$sx]' " .
2013*8fac9c7bSMasahiro Yamada					"description in '$decl_name'\n";
2014*8fac9c7bSMasahiro Yamada				++$warnings;
2015*8fac9c7bSMasahiro Yamada			} else {
2016*8fac9c7bSMasahiro Yamada				if ($nested !~ m/\Q$sects[$sx]\E/) {
2017*8fac9c7bSMasahiro Yamada				    print STDERR "Warning(${file}:$.): " .
2018*8fac9c7bSMasahiro Yamada					"Excess struct/union/enum/typedef member " .
2019*8fac9c7bSMasahiro Yamada					"'$sects[$sx]' " .
2020*8fac9c7bSMasahiro Yamada					"description in '$decl_name'\n";
2021*8fac9c7bSMasahiro Yamada				    ++$warnings;
2022*8fac9c7bSMasahiro Yamada				}
2023*8fac9c7bSMasahiro Yamada			}
2024*8fac9c7bSMasahiro Yamada		}
2025*8fac9c7bSMasahiro Yamada	}
2026*8fac9c7bSMasahiro Yamada}
2027*8fac9c7bSMasahiro Yamada
2028*8fac9c7bSMasahiro Yamada##
2029*8fac9c7bSMasahiro Yamada# takes a function prototype and the name of the current file being
2030*8fac9c7bSMasahiro Yamada# processed and spits out all the details stored in the global
2031*8fac9c7bSMasahiro Yamada# arrays/hashes.
2032*8fac9c7bSMasahiro Yamadasub dump_function($$) {
2033*8fac9c7bSMasahiro Yamada    my $prototype = shift;
2034*8fac9c7bSMasahiro Yamada    my $file = shift;
2035*8fac9c7bSMasahiro Yamada
2036*8fac9c7bSMasahiro Yamada    $prototype =~ s/^static +//;
2037*8fac9c7bSMasahiro Yamada    $prototype =~ s/^extern +//;
2038*8fac9c7bSMasahiro Yamada    $prototype =~ s/^asmlinkage +//;
2039*8fac9c7bSMasahiro Yamada    $prototype =~ s/^inline +//;
2040*8fac9c7bSMasahiro Yamada    $prototype =~ s/^__inline__ +//;
2041*8fac9c7bSMasahiro Yamada    $prototype =~ s/^__inline +//;
2042*8fac9c7bSMasahiro Yamada    $prototype =~ s/^__always_inline +//;
2043*8fac9c7bSMasahiro Yamada    $prototype =~ s/^noinline +//;
2044*8fac9c7bSMasahiro Yamada    $prototype =~ s/__devinit +//;
2045*8fac9c7bSMasahiro Yamada    $prototype =~ s/__init +//;
2046*8fac9c7bSMasahiro Yamada    $prototype =~ s/__init_or_module +//;
2047*8fac9c7bSMasahiro Yamada    $prototype =~ s/__must_check +//;
2048*8fac9c7bSMasahiro Yamada    $prototype =~ s/__weak +//;
2049*8fac9c7bSMasahiro Yamada    $prototype =~ s/^#\s*define\s+//; #ak added
2050*8fac9c7bSMasahiro Yamada    $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;
2051*8fac9c7bSMasahiro Yamada
2052*8fac9c7bSMasahiro Yamada    # Yes, this truly is vile.  We are looking for:
2053*8fac9c7bSMasahiro Yamada    # 1. Return type (may be nothing if we're looking at a macro)
2054*8fac9c7bSMasahiro Yamada    # 2. Function name
2055*8fac9c7bSMasahiro Yamada    # 3. Function parameters.
2056*8fac9c7bSMasahiro Yamada    #
2057*8fac9c7bSMasahiro Yamada    # All the while we have to watch out for function pointer parameters
2058*8fac9c7bSMasahiro Yamada    # (which IIRC is what the two sections are for), C types (these
2059*8fac9c7bSMasahiro Yamada    # regexps don't even start to express all the possibilities), and
2060*8fac9c7bSMasahiro Yamada    # so on.
2061*8fac9c7bSMasahiro Yamada    #
2062*8fac9c7bSMasahiro Yamada    # If you mess with these regexps, it's a good idea to check that
2063*8fac9c7bSMasahiro Yamada    # the following functions' documentation still comes out right:
2064*8fac9c7bSMasahiro Yamada    # - parport_register_device (function pointer parameters)
2065*8fac9c7bSMasahiro Yamada    # - atomic_set (macro)
2066*8fac9c7bSMasahiro Yamada    # - pci_match_device, __copy_to_user (long return type)
2067*8fac9c7bSMasahiro Yamada
2068*8fac9c7bSMasahiro Yamada    if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
2069*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
2070*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
2071*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
2072*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
2073*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
2074*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
2075*8fac9c7bSMasahiro Yamada	$prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2076*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2077*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2078*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2079*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2080*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2081*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2082*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2083*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
2084*8fac9c7bSMasahiro Yamada	$prototype =~ m/^(\w+\s+\w+\s*\*\s*\w+\s*\*\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
2085*8fac9c7bSMasahiro Yamada	$return_type = $1;
2086*8fac9c7bSMasahiro Yamada	$declaration_name = $2;
2087*8fac9c7bSMasahiro Yamada	my $args = $3;
2088*8fac9c7bSMasahiro Yamada
2089*8fac9c7bSMasahiro Yamada	create_parameterlist($args, ',', $file);
2090*8fac9c7bSMasahiro Yamada    } else {
2091*8fac9c7bSMasahiro Yamada	print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n";
2092*8fac9c7bSMasahiro Yamada	++$errors;
2093*8fac9c7bSMasahiro Yamada	return;
2094*8fac9c7bSMasahiro Yamada    }
2095*8fac9c7bSMasahiro Yamada
2096*8fac9c7bSMasahiro Yamada	my $prms = join " ", @parameterlist;
2097*8fac9c7bSMasahiro Yamada	check_sections($file, $declaration_name, "function", $sectcheck, $prms, "");
2098*8fac9c7bSMasahiro Yamada
2099*8fac9c7bSMasahiro Yamada    output_declaration($declaration_name,
2100*8fac9c7bSMasahiro Yamada		       'function',
2101*8fac9c7bSMasahiro Yamada		       {'function' => $declaration_name,
2102*8fac9c7bSMasahiro Yamada			'module' => $modulename,
2103*8fac9c7bSMasahiro Yamada			'functiontype' => $return_type,
2104*8fac9c7bSMasahiro Yamada			'parameterlist' => \@parameterlist,
2105*8fac9c7bSMasahiro Yamada			'parameterdescs' => \%parameterdescs,
2106*8fac9c7bSMasahiro Yamada			'parametertypes' => \%parametertypes,
2107*8fac9c7bSMasahiro Yamada			'sectionlist' => \@sectionlist,
2108*8fac9c7bSMasahiro Yamada			'sections' => \%sections,
2109*8fac9c7bSMasahiro Yamada			'purpose' => $declaration_purpose
2110*8fac9c7bSMasahiro Yamada		       });
2111*8fac9c7bSMasahiro Yamada}
2112*8fac9c7bSMasahiro Yamada
2113*8fac9c7bSMasahiro Yamadasub reset_state {
2114*8fac9c7bSMasahiro Yamada    $function = "";
2115*8fac9c7bSMasahiro Yamada    %constants = ();
2116*8fac9c7bSMasahiro Yamada    %parameterdescs = ();
2117*8fac9c7bSMasahiro Yamada    %parametertypes = ();
2118*8fac9c7bSMasahiro Yamada    @parameterlist = ();
2119*8fac9c7bSMasahiro Yamada    %sections = ();
2120*8fac9c7bSMasahiro Yamada    @sectionlist = ();
2121*8fac9c7bSMasahiro Yamada    $sectcheck = "";
2122*8fac9c7bSMasahiro Yamada    $struct_actual = "";
2123*8fac9c7bSMasahiro Yamada    $prototype = "";
2124*8fac9c7bSMasahiro Yamada
2125*8fac9c7bSMasahiro Yamada    $state = 0;
2126*8fac9c7bSMasahiro Yamada}
2127*8fac9c7bSMasahiro Yamada
2128*8fac9c7bSMasahiro Yamadasub tracepoint_munge($) {
2129*8fac9c7bSMasahiro Yamada	my $file = shift;
2130*8fac9c7bSMasahiro Yamada	my $tracepointname = 0;
2131*8fac9c7bSMasahiro Yamada	my $tracepointargs = 0;
2132*8fac9c7bSMasahiro Yamada
2133*8fac9c7bSMasahiro Yamada	if ($prototype =~ m/TRACE_EVENT\((.*?),/) {
2134*8fac9c7bSMasahiro Yamada		$tracepointname = $1;
2135*8fac9c7bSMasahiro Yamada	}
2136*8fac9c7bSMasahiro Yamada	if ($prototype =~ m/DEFINE_SINGLE_EVENT\((.*?),/) {
2137*8fac9c7bSMasahiro Yamada		$tracepointname = $1;
2138*8fac9c7bSMasahiro Yamada	}
2139*8fac9c7bSMasahiro Yamada	if ($prototype =~ m/DEFINE_EVENT\((.*?),(.*?),/) {
2140*8fac9c7bSMasahiro Yamada		$tracepointname = $2;
2141*8fac9c7bSMasahiro Yamada	}
2142*8fac9c7bSMasahiro Yamada	$tracepointname =~ s/^\s+//; #strip leading whitespace
2143*8fac9c7bSMasahiro Yamada	if ($prototype =~ m/TP_PROTO\((.*?)\)/) {
2144*8fac9c7bSMasahiro Yamada		$tracepointargs = $1;
2145*8fac9c7bSMasahiro Yamada	}
2146*8fac9c7bSMasahiro Yamada	if (($tracepointname eq 0) || ($tracepointargs eq 0)) {
2147*8fac9c7bSMasahiro Yamada		print STDERR "Warning(${file}:$.): Unrecognized tracepoint format: \n".
2148*8fac9c7bSMasahiro Yamada			     "$prototype\n";
2149*8fac9c7bSMasahiro Yamada	} else {
2150*8fac9c7bSMasahiro Yamada		$prototype = "static inline void trace_$tracepointname($tracepointargs)";
2151*8fac9c7bSMasahiro Yamada	}
2152*8fac9c7bSMasahiro Yamada}
2153*8fac9c7bSMasahiro Yamada
2154*8fac9c7bSMasahiro Yamadasub syscall_munge() {
2155*8fac9c7bSMasahiro Yamada	my $void = 0;
2156*8fac9c7bSMasahiro Yamada
2157*8fac9c7bSMasahiro Yamada	$prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs
2158*8fac9c7bSMasahiro Yamada##	if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
2159*8fac9c7bSMasahiro Yamada	if ($prototype =~ m/SYSCALL_DEFINE0/) {
2160*8fac9c7bSMasahiro Yamada		$void = 1;
2161*8fac9c7bSMasahiro Yamada##		$prototype = "long sys_$1(void)";
2162*8fac9c7bSMasahiro Yamada	}
2163*8fac9c7bSMasahiro Yamada
2164*8fac9c7bSMasahiro Yamada	$prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
2165*8fac9c7bSMasahiro Yamada	if ($prototype =~ m/long (sys_.*?),/) {
2166*8fac9c7bSMasahiro Yamada		$prototype =~ s/,/\(/;
2167*8fac9c7bSMasahiro Yamada	} elsif ($void) {
2168*8fac9c7bSMasahiro Yamada		$prototype =~ s/\)/\(void\)/;
2169*8fac9c7bSMasahiro Yamada	}
2170*8fac9c7bSMasahiro Yamada
2171*8fac9c7bSMasahiro Yamada	# now delete all of the odd-number commas in $prototype
2172*8fac9c7bSMasahiro Yamada	# so that arg types & arg names don't have a comma between them
2173*8fac9c7bSMasahiro Yamada	my $count = 0;
2174*8fac9c7bSMasahiro Yamada	my $len = length($prototype);
2175*8fac9c7bSMasahiro Yamada	if ($void) {
2176*8fac9c7bSMasahiro Yamada		$len = 0;	# skip the for-loop
2177*8fac9c7bSMasahiro Yamada	}
2178*8fac9c7bSMasahiro Yamada	for (my $ix = 0; $ix < $len; $ix++) {
2179*8fac9c7bSMasahiro Yamada		if (substr($prototype, $ix, 1) eq ',') {
2180*8fac9c7bSMasahiro Yamada			$count++;
2181*8fac9c7bSMasahiro Yamada			if ($count % 2 == 1) {
2182*8fac9c7bSMasahiro Yamada				substr($prototype, $ix, 1) = ' ';
2183*8fac9c7bSMasahiro Yamada			}
2184*8fac9c7bSMasahiro Yamada		}
2185*8fac9c7bSMasahiro Yamada	}
2186*8fac9c7bSMasahiro Yamada}
2187*8fac9c7bSMasahiro Yamada
2188*8fac9c7bSMasahiro Yamadasub process_state3_function($$) {
2189*8fac9c7bSMasahiro Yamada    my $x = shift;
2190*8fac9c7bSMasahiro Yamada    my $file = shift;
2191*8fac9c7bSMasahiro Yamada
2192*8fac9c7bSMasahiro Yamada    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
2193*8fac9c7bSMasahiro Yamada
2194*8fac9c7bSMasahiro Yamada    if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
2195*8fac9c7bSMasahiro Yamada	# do nothing
2196*8fac9c7bSMasahiro Yamada    }
2197*8fac9c7bSMasahiro Yamada    elsif ($x =~ /([^\{]*)/) {
2198*8fac9c7bSMasahiro Yamada	$prototype .= $1;
2199*8fac9c7bSMasahiro Yamada    }
2200*8fac9c7bSMasahiro Yamada
2201*8fac9c7bSMasahiro Yamada    if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
2202*8fac9c7bSMasahiro Yamada	$prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
2203*8fac9c7bSMasahiro Yamada	$prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
2204*8fac9c7bSMasahiro Yamada	$prototype =~ s@^\s+@@gos; # strip leading spaces
2205*8fac9c7bSMasahiro Yamada	if ($prototype =~ /SYSCALL_DEFINE/) {
2206*8fac9c7bSMasahiro Yamada		syscall_munge();
2207*8fac9c7bSMasahiro Yamada	}
2208*8fac9c7bSMasahiro Yamada	if ($prototype =~ /TRACE_EVENT/ || $prototype =~ /DEFINE_EVENT/ ||
2209*8fac9c7bSMasahiro Yamada	    $prototype =~ /DEFINE_SINGLE_EVENT/)
2210*8fac9c7bSMasahiro Yamada	{
2211*8fac9c7bSMasahiro Yamada		tracepoint_munge($file);
2212*8fac9c7bSMasahiro Yamada	}
2213*8fac9c7bSMasahiro Yamada	dump_function($prototype, $file);
2214*8fac9c7bSMasahiro Yamada	reset_state();
2215*8fac9c7bSMasahiro Yamada    }
2216*8fac9c7bSMasahiro Yamada}
2217*8fac9c7bSMasahiro Yamada
2218*8fac9c7bSMasahiro Yamadasub process_state3_type($$) {
2219*8fac9c7bSMasahiro Yamada    my $x = shift;
2220*8fac9c7bSMasahiro Yamada    my $file = shift;
2221*8fac9c7bSMasahiro Yamada
2222*8fac9c7bSMasahiro Yamada    $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
2223*8fac9c7bSMasahiro Yamada    $x =~ s@^\s+@@gos; # strip leading spaces
2224*8fac9c7bSMasahiro Yamada    $x =~ s@\s+$@@gos; # strip trailing spaces
2225*8fac9c7bSMasahiro Yamada    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
2226*8fac9c7bSMasahiro Yamada
2227*8fac9c7bSMasahiro Yamada    if ($x =~ /^#/) {
2228*8fac9c7bSMasahiro Yamada	# To distinguish preprocessor directive from regular declaration later.
2229*8fac9c7bSMasahiro Yamada	$x .= ";";
2230*8fac9c7bSMasahiro Yamada    }
2231*8fac9c7bSMasahiro Yamada
2232*8fac9c7bSMasahiro Yamada    while (1) {
2233*8fac9c7bSMasahiro Yamada	if ( $x =~ /([^{};]*)([{};])(.*)/ ) {
2234*8fac9c7bSMasahiro Yamada	    $prototype .= $1 . $2;
2235*8fac9c7bSMasahiro Yamada	    ($2 eq '{') && $brcount++;
2236*8fac9c7bSMasahiro Yamada	    ($2 eq '}') && $brcount--;
2237*8fac9c7bSMasahiro Yamada	    if (($2 eq ';') && ($brcount == 0)) {
2238*8fac9c7bSMasahiro Yamada		dump_declaration($prototype, $file);
2239*8fac9c7bSMasahiro Yamada		reset_state();
2240*8fac9c7bSMasahiro Yamada		last;
2241*8fac9c7bSMasahiro Yamada	    }
2242*8fac9c7bSMasahiro Yamada	    $x = $3;
2243*8fac9c7bSMasahiro Yamada	} else {
2244*8fac9c7bSMasahiro Yamada	    $prototype .= $x;
2245*8fac9c7bSMasahiro Yamada	    last;
2246*8fac9c7bSMasahiro Yamada	}
2247*8fac9c7bSMasahiro Yamada    }
2248*8fac9c7bSMasahiro Yamada}
2249*8fac9c7bSMasahiro Yamada
2250*8fac9c7bSMasahiro Yamada# xml_escape: replace <, >, and & in the text stream;
2251*8fac9c7bSMasahiro Yamada#
2252*8fac9c7bSMasahiro Yamada# however, formatting controls that are generated internally/locally in the
2253*8fac9c7bSMasahiro Yamada# kernel-doc script are not escaped here; instead, they begin life like
2254*8fac9c7bSMasahiro Yamada# $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings
2255*8fac9c7bSMasahiro Yamada# are converted to their mnemonic-expected output, without the 4 * '\' & ':',
2256*8fac9c7bSMasahiro Yamada# just before actual output; (this is done by local_unescape())
2257*8fac9c7bSMasahiro Yamadasub xml_escape($) {
2258*8fac9c7bSMasahiro Yamada	my $text = shift;
2259*8fac9c7bSMasahiro Yamada	if (($output_mode eq "text") || ($output_mode eq "man")) {
2260*8fac9c7bSMasahiro Yamada		return $text;
2261*8fac9c7bSMasahiro Yamada	}
2262*8fac9c7bSMasahiro Yamada	$text =~ s/\&/\\\\\\amp;/g;
2263*8fac9c7bSMasahiro Yamada	$text =~ s/\</\\\\\\lt;/g;
2264*8fac9c7bSMasahiro Yamada	$text =~ s/\>/\\\\\\gt;/g;
2265*8fac9c7bSMasahiro Yamada	return $text;
2266*8fac9c7bSMasahiro Yamada}
2267*8fac9c7bSMasahiro Yamada
2268*8fac9c7bSMasahiro Yamada# convert local escape strings to html
2269*8fac9c7bSMasahiro Yamada# local escape strings look like:  '\\\\menmonic:' (that's 4 backslashes)
2270*8fac9c7bSMasahiro Yamadasub local_unescape($) {
2271*8fac9c7bSMasahiro Yamada	my $text = shift;
2272*8fac9c7bSMasahiro Yamada	if (($output_mode eq "text") || ($output_mode eq "man")) {
2273*8fac9c7bSMasahiro Yamada		return $text;
2274*8fac9c7bSMasahiro Yamada	}
2275*8fac9c7bSMasahiro Yamada	$text =~ s/\\\\\\\\lt:/</g;
2276*8fac9c7bSMasahiro Yamada	$text =~ s/\\\\\\\\gt:/>/g;
2277*8fac9c7bSMasahiro Yamada	return $text;
2278*8fac9c7bSMasahiro Yamada}
2279*8fac9c7bSMasahiro Yamada
2280*8fac9c7bSMasahiro Yamadasub process_file($) {
2281*8fac9c7bSMasahiro Yamada    my $file;
2282*8fac9c7bSMasahiro Yamada    my $identifier;
2283*8fac9c7bSMasahiro Yamada    my $func;
2284*8fac9c7bSMasahiro Yamada    my $descr;
2285*8fac9c7bSMasahiro Yamada    my $in_purpose = 0;
2286*8fac9c7bSMasahiro Yamada    my $initial_section_counter = $section_counter;
2287*8fac9c7bSMasahiro Yamada
2288*8fac9c7bSMasahiro Yamada    if (defined($ENV{'SRCTREE'})) {
2289*8fac9c7bSMasahiro Yamada	$file = "$ENV{'SRCTREE'}" . "/" . "@_";
2290*8fac9c7bSMasahiro Yamada    }
2291*8fac9c7bSMasahiro Yamada    else {
2292*8fac9c7bSMasahiro Yamada	$file = "@_";
2293*8fac9c7bSMasahiro Yamada    }
2294*8fac9c7bSMasahiro Yamada    if (defined($source_map{$file})) {
2295*8fac9c7bSMasahiro Yamada	$file = $source_map{$file};
2296*8fac9c7bSMasahiro Yamada    }
2297*8fac9c7bSMasahiro Yamada
2298*8fac9c7bSMasahiro Yamada    if (!open(IN,"<$file")) {
2299*8fac9c7bSMasahiro Yamada	print STDERR "Error: Cannot open file $file\n";
2300*8fac9c7bSMasahiro Yamada	++$errors;
2301*8fac9c7bSMasahiro Yamada	return;
2302*8fac9c7bSMasahiro Yamada    }
2303*8fac9c7bSMasahiro Yamada
2304*8fac9c7bSMasahiro Yamada    $. = 1;
2305*8fac9c7bSMasahiro Yamada
2306*8fac9c7bSMasahiro Yamada    $section_counter = 0;
2307*8fac9c7bSMasahiro Yamada    while (<IN>) {
2308*8fac9c7bSMasahiro Yamada	if ($state == 0) {
2309*8fac9c7bSMasahiro Yamada	    if (/$doc_start/o) {
2310*8fac9c7bSMasahiro Yamada		$state = 1;		# next line is always the function name
2311*8fac9c7bSMasahiro Yamada		$in_doc_sect = 0;
2312*8fac9c7bSMasahiro Yamada	    }
2313*8fac9c7bSMasahiro Yamada	} elsif ($state == 1) {	# this line is the function name (always)
2314*8fac9c7bSMasahiro Yamada	    if (/$doc_block/o) {
2315*8fac9c7bSMasahiro Yamada		$state = 4;
2316*8fac9c7bSMasahiro Yamada		$contents = "";
2317*8fac9c7bSMasahiro Yamada		if ( $1 eq "" ) {
2318*8fac9c7bSMasahiro Yamada			$section = $section_intro;
2319*8fac9c7bSMasahiro Yamada		} else {
2320*8fac9c7bSMasahiro Yamada			$section = $1;
2321*8fac9c7bSMasahiro Yamada		}
2322*8fac9c7bSMasahiro Yamada	    }
2323*8fac9c7bSMasahiro Yamada	    elsif (/$doc_decl/o) {
2324*8fac9c7bSMasahiro Yamada		$identifier = $1;
2325*8fac9c7bSMasahiro Yamada		if (/\s*([\w\s]+?)\s*-/) {
2326*8fac9c7bSMasahiro Yamada		    $identifier = $1;
2327*8fac9c7bSMasahiro Yamada		}
2328*8fac9c7bSMasahiro Yamada
2329*8fac9c7bSMasahiro Yamada		$state = 2;
2330*8fac9c7bSMasahiro Yamada		if (/-(.*)/) {
2331*8fac9c7bSMasahiro Yamada		    # strip leading/trailing/multiple spaces
2332*8fac9c7bSMasahiro Yamada		    $descr= $1;
2333*8fac9c7bSMasahiro Yamada		    $descr =~ s/^\s*//;
2334*8fac9c7bSMasahiro Yamada		    $descr =~ s/\s*$//;
2335*8fac9c7bSMasahiro Yamada		    $descr =~ s/\s+/ /;
2336*8fac9c7bSMasahiro Yamada		    $declaration_purpose = xml_escape($descr);
2337*8fac9c7bSMasahiro Yamada		    $in_purpose = 1;
2338*8fac9c7bSMasahiro Yamada		} else {
2339*8fac9c7bSMasahiro Yamada		    $declaration_purpose = "";
2340*8fac9c7bSMasahiro Yamada		}
2341*8fac9c7bSMasahiro Yamada
2342*8fac9c7bSMasahiro Yamada		if (($declaration_purpose eq "") && $verbose) {
2343*8fac9c7bSMasahiro Yamada			print STDERR "Warning(${file}:$.): missing initial short description on line:\n";
2344*8fac9c7bSMasahiro Yamada			print STDERR $_;
2345*8fac9c7bSMasahiro Yamada			++$warnings;
2346*8fac9c7bSMasahiro Yamada		}
2347*8fac9c7bSMasahiro Yamada
2348*8fac9c7bSMasahiro Yamada		if ($identifier =~ m/^struct/) {
2349*8fac9c7bSMasahiro Yamada		    $decl_type = 'struct';
2350*8fac9c7bSMasahiro Yamada		} elsif ($identifier =~ m/^union/) {
2351*8fac9c7bSMasahiro Yamada		    $decl_type = 'union';
2352*8fac9c7bSMasahiro Yamada		} elsif ($identifier =~ m/^enum/) {
2353*8fac9c7bSMasahiro Yamada		    $decl_type = 'enum';
2354*8fac9c7bSMasahiro Yamada		} elsif ($identifier =~ m/^typedef/) {
2355*8fac9c7bSMasahiro Yamada		    $decl_type = 'typedef';
2356*8fac9c7bSMasahiro Yamada		} else {
2357*8fac9c7bSMasahiro Yamada		    $decl_type = 'function';
2358*8fac9c7bSMasahiro Yamada		}
2359*8fac9c7bSMasahiro Yamada
2360*8fac9c7bSMasahiro Yamada		if ($verbose) {
2361*8fac9c7bSMasahiro Yamada		    print STDERR "Info(${file}:$.): Scanning doc for $identifier\n";
2362*8fac9c7bSMasahiro Yamada		}
2363*8fac9c7bSMasahiro Yamada	    } else {
2364*8fac9c7bSMasahiro Yamada		print STDERR "Warning(${file}:$.): Cannot understand $_ on line $.",
2365*8fac9c7bSMasahiro Yamada		" - I thought it was a doc line\n";
2366*8fac9c7bSMasahiro Yamada		++$warnings;
2367*8fac9c7bSMasahiro Yamada		$state = 0;
2368*8fac9c7bSMasahiro Yamada	    }
2369*8fac9c7bSMasahiro Yamada	} elsif ($state == 2) {	# look for head: lines, and include content
2370*8fac9c7bSMasahiro Yamada	    if (/$doc_sect/o) {
2371*8fac9c7bSMasahiro Yamada		$newsection = $1;
2372*8fac9c7bSMasahiro Yamada		$newcontents = $2;
2373*8fac9c7bSMasahiro Yamada
2374*8fac9c7bSMasahiro Yamada		if (($contents ne "") && ($contents ne "\n")) {
2375*8fac9c7bSMasahiro Yamada		    if (!$in_doc_sect && $verbose) {
2376*8fac9c7bSMasahiro Yamada			print STDERR "Warning(${file}:$.): contents before sections\n";
2377*8fac9c7bSMasahiro Yamada			++$warnings;
2378*8fac9c7bSMasahiro Yamada		    }
2379*8fac9c7bSMasahiro Yamada		    dump_section($file, $section, xml_escape($contents));
2380*8fac9c7bSMasahiro Yamada		    $section = $section_default;
2381*8fac9c7bSMasahiro Yamada		}
2382*8fac9c7bSMasahiro Yamada
2383*8fac9c7bSMasahiro Yamada		$in_doc_sect = 1;
2384*8fac9c7bSMasahiro Yamada		$in_purpose = 0;
2385*8fac9c7bSMasahiro Yamada		$contents = $newcontents;
2386*8fac9c7bSMasahiro Yamada		if ($contents ne "") {
2387*8fac9c7bSMasahiro Yamada		    while ((substr($contents, 0, 1) eq " ") ||
2388*8fac9c7bSMasahiro Yamada			substr($contents, 0, 1) eq "\t") {
2389*8fac9c7bSMasahiro Yamada			    $contents = substr($contents, 1);
2390*8fac9c7bSMasahiro Yamada		    }
2391*8fac9c7bSMasahiro Yamada		    $contents .= "\n";
2392*8fac9c7bSMasahiro Yamada		}
2393*8fac9c7bSMasahiro Yamada		$section = $newsection;
2394*8fac9c7bSMasahiro Yamada	    } elsif (/$doc_end/) {
2395*8fac9c7bSMasahiro Yamada
2396*8fac9c7bSMasahiro Yamada		if (($contents ne "") && ($contents ne "\n")) {
2397*8fac9c7bSMasahiro Yamada		    dump_section($file, $section, xml_escape($contents));
2398*8fac9c7bSMasahiro Yamada		    $section = $section_default;
2399*8fac9c7bSMasahiro Yamada		    $contents = "";
2400*8fac9c7bSMasahiro Yamada		}
2401*8fac9c7bSMasahiro Yamada		# look for doc_com + <text> + doc_end:
2402*8fac9c7bSMasahiro Yamada		if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
2403*8fac9c7bSMasahiro Yamada		    print STDERR "Warning(${file}:$.): suspicious ending line: $_";
2404*8fac9c7bSMasahiro Yamada		    ++$warnings;
2405*8fac9c7bSMasahiro Yamada		}
2406*8fac9c7bSMasahiro Yamada
2407*8fac9c7bSMasahiro Yamada		$prototype = "";
2408*8fac9c7bSMasahiro Yamada		$state = 3;
2409*8fac9c7bSMasahiro Yamada		$brcount = 0;
2410*8fac9c7bSMasahiro Yamada#		print STDERR "end of doc comment, looking for prototype\n";
2411*8fac9c7bSMasahiro Yamada	    } elsif (/$doc_content/) {
2412*8fac9c7bSMasahiro Yamada		# miguel-style comment kludge, look for blank lines after
2413*8fac9c7bSMasahiro Yamada		# @parameter line to signify start of description
2414*8fac9c7bSMasahiro Yamada		if ($1 eq "") {
2415*8fac9c7bSMasahiro Yamada		    if ($section =~ m/^@/ || $section eq $section_context) {
2416*8fac9c7bSMasahiro Yamada			dump_section($file, $section, xml_escape($contents));
2417*8fac9c7bSMasahiro Yamada			$section = $section_default;
2418*8fac9c7bSMasahiro Yamada			$contents = "";
2419*8fac9c7bSMasahiro Yamada		    } else {
2420*8fac9c7bSMasahiro Yamada			$contents .= "\n";
2421*8fac9c7bSMasahiro Yamada		    }
2422*8fac9c7bSMasahiro Yamada		    $in_purpose = 0;
2423*8fac9c7bSMasahiro Yamada		} elsif ($in_purpose == 1) {
2424*8fac9c7bSMasahiro Yamada		    # Continued declaration purpose
2425*8fac9c7bSMasahiro Yamada		    chomp($declaration_purpose);
2426*8fac9c7bSMasahiro Yamada		    $declaration_purpose .= " " . xml_escape($1);
2427*8fac9c7bSMasahiro Yamada		} elsif ($section =~ m/^Example/) {
2428*8fac9c7bSMasahiro Yamada		    $_ =~ s/^\s*\*//;
2429*8fac9c7bSMasahiro Yamada		    $contents .= $_;
2430*8fac9c7bSMasahiro Yamada		} else {
2431*8fac9c7bSMasahiro Yamada		    $contents .= $1 . "\n";
2432*8fac9c7bSMasahiro Yamada		}
2433*8fac9c7bSMasahiro Yamada	    } else {
2434*8fac9c7bSMasahiro Yamada		# i dont know - bad line?  ignore.
2435*8fac9c7bSMasahiro Yamada		print STDERR "Warning(${file}:$.): bad line: $_";
2436*8fac9c7bSMasahiro Yamada		++$warnings;
2437*8fac9c7bSMasahiro Yamada	    }
2438*8fac9c7bSMasahiro Yamada	} elsif ($state == 3) {	# scanning for function '{' (end of prototype)
2439*8fac9c7bSMasahiro Yamada	    if ($decl_type eq 'function') {
2440*8fac9c7bSMasahiro Yamada		process_state3_function($_, $file);
2441*8fac9c7bSMasahiro Yamada	    } else {
2442*8fac9c7bSMasahiro Yamada		process_state3_type($_, $file);
2443*8fac9c7bSMasahiro Yamada	    }
2444*8fac9c7bSMasahiro Yamada	} elsif ($state == 4) {
2445*8fac9c7bSMasahiro Yamada		# Documentation block
2446*8fac9c7bSMasahiro Yamada		if (/$doc_block/) {
2447*8fac9c7bSMasahiro Yamada			dump_doc_section($file, $section, xml_escape($contents));
2448*8fac9c7bSMasahiro Yamada			$contents = "";
2449*8fac9c7bSMasahiro Yamada			$function = "";
2450*8fac9c7bSMasahiro Yamada			%constants = ();
2451*8fac9c7bSMasahiro Yamada			%parameterdescs = ();
2452*8fac9c7bSMasahiro Yamada			%parametertypes = ();
2453*8fac9c7bSMasahiro Yamada			@parameterlist = ();
2454*8fac9c7bSMasahiro Yamada			%sections = ();
2455*8fac9c7bSMasahiro Yamada			@sectionlist = ();
2456*8fac9c7bSMasahiro Yamada			$prototype = "";
2457*8fac9c7bSMasahiro Yamada			if ( $1 eq "" ) {
2458*8fac9c7bSMasahiro Yamada				$section = $section_intro;
2459*8fac9c7bSMasahiro Yamada			} else {
2460*8fac9c7bSMasahiro Yamada				$section = $1;
2461*8fac9c7bSMasahiro Yamada			}
2462*8fac9c7bSMasahiro Yamada		}
2463*8fac9c7bSMasahiro Yamada		elsif (/$doc_end/)
2464*8fac9c7bSMasahiro Yamada		{
2465*8fac9c7bSMasahiro Yamada			dump_doc_section($file, $section, xml_escape($contents));
2466*8fac9c7bSMasahiro Yamada			$contents = "";
2467*8fac9c7bSMasahiro Yamada			$function = "";
2468*8fac9c7bSMasahiro Yamada			%constants = ();
2469*8fac9c7bSMasahiro Yamada			%parameterdescs = ();
2470*8fac9c7bSMasahiro Yamada			%parametertypes = ();
2471*8fac9c7bSMasahiro Yamada			@parameterlist = ();
2472*8fac9c7bSMasahiro Yamada			%sections = ();
2473*8fac9c7bSMasahiro Yamada			@sectionlist = ();
2474*8fac9c7bSMasahiro Yamada			$prototype = "";
2475*8fac9c7bSMasahiro Yamada			$state = 0;
2476*8fac9c7bSMasahiro Yamada		}
2477*8fac9c7bSMasahiro Yamada		elsif (/$doc_content/)
2478*8fac9c7bSMasahiro Yamada		{
2479*8fac9c7bSMasahiro Yamada			if ( $1 eq "" )
2480*8fac9c7bSMasahiro Yamada			{
2481*8fac9c7bSMasahiro Yamada				$contents .= $blankline;
2482*8fac9c7bSMasahiro Yamada			}
2483*8fac9c7bSMasahiro Yamada			else
2484*8fac9c7bSMasahiro Yamada			{
2485*8fac9c7bSMasahiro Yamada				$contents .= $1 . "\n";
2486*8fac9c7bSMasahiro Yamada			}
2487*8fac9c7bSMasahiro Yamada		}
2488*8fac9c7bSMasahiro Yamada	}
2489*8fac9c7bSMasahiro Yamada    }
2490*8fac9c7bSMasahiro Yamada    if ($initial_section_counter == $section_counter) {
2491*8fac9c7bSMasahiro Yamada	print STDERR "Warning(${file}): no structured comments found\n";
2492*8fac9c7bSMasahiro Yamada	if ($output_mode eq "xml") {
2493*8fac9c7bSMasahiro Yamada	    # The template wants at least one RefEntry here; make one.
2494*8fac9c7bSMasahiro Yamada	    print "<refentry>\n";
2495*8fac9c7bSMasahiro Yamada	    print " <refnamediv>\n";
2496*8fac9c7bSMasahiro Yamada	    print "  <refname>\n";
2497*8fac9c7bSMasahiro Yamada	    print "   ${file}\n";
2498*8fac9c7bSMasahiro Yamada	    print "  </refname>\n";
2499*8fac9c7bSMasahiro Yamada	    print "  <refpurpose>\n";
2500*8fac9c7bSMasahiro Yamada	    print "   Document generation inconsistency\n";
2501*8fac9c7bSMasahiro Yamada	    print "  </refpurpose>\n";
2502*8fac9c7bSMasahiro Yamada	    print " </refnamediv>\n";
2503*8fac9c7bSMasahiro Yamada	    print " <refsect1>\n";
2504*8fac9c7bSMasahiro Yamada	    print "  <title>\n";
2505*8fac9c7bSMasahiro Yamada	    print "   Oops\n";
2506*8fac9c7bSMasahiro Yamada	    print "  </title>\n";
2507*8fac9c7bSMasahiro Yamada	    print "  <warning>\n";
2508*8fac9c7bSMasahiro Yamada	    print "   <para>\n";
2509*8fac9c7bSMasahiro Yamada	    print "    The template for this document tried to insert\n";
2510*8fac9c7bSMasahiro Yamada	    print "    the structured comment from the file\n";
2511*8fac9c7bSMasahiro Yamada	    print "    <filename>${file}</filename> at this point,\n";
2512*8fac9c7bSMasahiro Yamada	    print "    but none was found.\n";
2513*8fac9c7bSMasahiro Yamada	    print "    This dummy section is inserted to allow\n";
2514*8fac9c7bSMasahiro Yamada	    print "    generation to continue.\n";
2515*8fac9c7bSMasahiro Yamada	    print "   </para>\n";
2516*8fac9c7bSMasahiro Yamada	    print "  </warning>\n";
2517*8fac9c7bSMasahiro Yamada	    print " </refsect1>\n";
2518*8fac9c7bSMasahiro Yamada	    print "</refentry>\n";
2519*8fac9c7bSMasahiro Yamada	}
2520*8fac9c7bSMasahiro Yamada    }
2521*8fac9c7bSMasahiro Yamada}
2522*8fac9c7bSMasahiro Yamada
2523*8fac9c7bSMasahiro Yamada
2524*8fac9c7bSMasahiro Yamada$kernelversion = get_kernel_version();
2525*8fac9c7bSMasahiro Yamada
2526*8fac9c7bSMasahiro Yamada# generate a sequence of code that will splice in highlighting information
2527*8fac9c7bSMasahiro Yamada# using the s// operator.
2528*8fac9c7bSMasahiro Yamadaforeach my $pattern (keys %highlights) {
2529*8fac9c7bSMasahiro Yamada#   print STDERR "scanning pattern:$pattern, highlight:($highlights{$pattern})\n";
2530*8fac9c7bSMasahiro Yamada    $dohighlight .=  "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n";
2531*8fac9c7bSMasahiro Yamada}
2532*8fac9c7bSMasahiro Yamada
2533*8fac9c7bSMasahiro Yamada# Read the file that maps relative names to absolute names for
2534*8fac9c7bSMasahiro Yamada# separate source and object directories and for shadow trees.
2535*8fac9c7bSMasahiro Yamadaif (open(SOURCE_MAP, "<.tmp_filelist.txt")) {
2536*8fac9c7bSMasahiro Yamada	my ($relname, $absname);
2537*8fac9c7bSMasahiro Yamada	while(<SOURCE_MAP>) {
2538*8fac9c7bSMasahiro Yamada		chop();
2539*8fac9c7bSMasahiro Yamada		($relname, $absname) = (split())[0..1];
2540*8fac9c7bSMasahiro Yamada		$relname =~ s:^/+::;
2541*8fac9c7bSMasahiro Yamada		$source_map{$relname} = $absname;
2542*8fac9c7bSMasahiro Yamada	}
2543*8fac9c7bSMasahiro Yamada	close(SOURCE_MAP);
2544*8fac9c7bSMasahiro Yamada}
2545*8fac9c7bSMasahiro Yamada
2546*8fac9c7bSMasahiro Yamadaforeach (@ARGV) {
2547*8fac9c7bSMasahiro Yamada    chomp;
2548*8fac9c7bSMasahiro Yamada    process_file($_);
2549*8fac9c7bSMasahiro Yamada}
2550*8fac9c7bSMasahiro Yamadaif ($verbose && $errors) {
2551*8fac9c7bSMasahiro Yamada  print STDERR "$errors errors\n";
2552*8fac9c7bSMasahiro Yamada}
2553*8fac9c7bSMasahiro Yamadaif ($verbose && $warnings) {
2554*8fac9c7bSMasahiro Yamada  print STDERR "$warnings warnings\n";
2555*8fac9c7bSMasahiro Yamada}
2556*8fac9c7bSMasahiro Yamada
2557*8fac9c7bSMasahiro Yamadaexit($errors);
2558