Blame view

scripts/kernel-doc 91.8 KB
cb77f0d62   Kamil Rytarowski   scripts: Switch t...
1
  #!/usr/bin/env perl
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2

cb77f0d62   Kamil Rytarowski   scripts: Switch t...
3
  use warnings;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
  use strict;
  
  ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved        ##
  ## Copyright (C) 2000, 1  Tim Waugh <twaugh@redhat.com>          ##
  ## Copyright (C) 2001  Simon Huggins                             ##
70c95b00b   Randy Dunlap   scripts/kernel-do...
9
  ## Copyright (C) 2005-2012  Randy Dunlap                         ##
1b40c1944   Dan Luedtke   scripts/kernel-do...
10
  ## Copyright (C) 2012  Dan Luedtke                               ##
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
16
  ## 								 ##
  ## #define enhancements by Armin Kuster <akuster@mvista.com>	 ##
  ## Copyright (c) 2000 MontaVista Software, Inc.			 ##
  ## 								 ##
  ## This software falls under the GNU General Public License.     ##
  ## Please read the COPYING file for more information             ##
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  # 18/01/2001 - 	Cleanups
  # 		Functions prototyped as foo(void) same as foo()
  # 		Stop eval'ing where we don't need to.
  # -- huggie@earth.li
  
  # 27/06/2001 -  Allowed whitespace after initial "/**" and
  #               allowed comments before function declarations.
  # -- Christian Kreibich <ck@whoop.org>
  
  # Still to do:
  # 	- add perldoc documentation
  # 	- Look more closely at some of the scarier bits :)
  
  # 26/05/2001 - 	Support for separate source and object trees.
  #		Return error code.
  # 		Keith Owens <kaos@ocs.com.au>
  
  # 23/09/2001 - Added support for typedefs, structs, enums and unions
  #              Support for Context section; can be terminated using empty line
  #              Small fixes (like spaces vs. \s in regex)
  # -- Tim Jansen <tim@tjansen.de>
1b40c1944   Dan Luedtke   scripts/kernel-do...
38
39
  # 25/07/2012 - Added support for HTML5
  # -- Dan Luedtke <mail@danrl.de>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40

fadc0b31c   Jani Nikula   kernel-doc: rewri...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  sub usage {
      my $message = <<"EOF";
  Usage: $0 [OPTION ...] FILE ...
  
  Read C language source or header FILEs, extract embedded documentation comments,
  and print formatted documentation to standard output.
  
  The documentation comments are identified by "/**" opening comment mark. See
  Documentation/kernel-doc-nano-HOWTO.txt for the documentation comment syntax.
  
  Output format selection (mutually exclusive):
    -docbook		Output DocBook format.
    -html			Output HTML format.
    -html5		Output HTML5 format.
    -list			Output symbol list format. This is for use by docproc.
    -man			Output troff manual page format. This is the default.
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
57
    -rst			Output reStructuredText format.
fadc0b31c   Jani Nikula   kernel-doc: rewri...
58
59
60
    -text			Output plain text format.
  
  Output selection (mutually exclusive):
86ae2e38d   Jani Nikula   kernel-doc: suppo...
61
62
    -export		Only output documentation for symbols that have been
  			exported using EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL()
c9b2cfb3f   Jani Nikula   kernel-doc: unify...
63
                          in any input FILE or -export-file FILE.
86ae2e38d   Jani Nikula   kernel-doc: suppo...
64
65
    -internal		Only output documentation for symbols that have NOT been
  			exported using EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL()
c9b2cfb3f   Jani Nikula   kernel-doc: unify...
66
                          in any input FILE or -export-file FILE.
fadc0b31c   Jani Nikula   kernel-doc: rewri...
67
68
69
70
71
72
73
74
75
    -function NAME	Only output documentation for the given function(s)
  			or DOC: section title(s). All other functions and DOC:
  			sections are ignored. May be specified multiple times.
    -nofunction NAME	Do NOT output documentation for the given function(s);
  			only output documentation for the other functions and
  			DOC: sections. May be specified multiple times.
  
  Output selection modifiers:
    -no-doc-sections	Do not output DOC: sections.
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
76
77
    -enable-lineno        Enable output of #define LINENO lines. Only works with
                          reStructuredText format.
88c2b57da   Jani Nikula   kernel-doc: add s...
78
79
80
    -export-file FILE     Specify an additional FILE in which to look for
                          EXPORT_SYMBOL() and EXPORT_SYMBOL_GPL(). To be used with
                          -export or -internal. May be specified multiple times.
fadc0b31c   Jani Nikula   kernel-doc: rewri...
81
82
83
84
85
86
87
88
89
  
  Other parameters:
    -v			Verbose output, more warnings and other information.
    -h			Print this help.
  
  EOF
      print $message;
      exit 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  
  #
  # format of comments.
  # In the following table, (...)? signifies optional structure.
  #                         (...)* signifies 0 or more structure elements
  # /**
  #  * function_name(:)? (- short description)?
  # (* @parameterx: (description of parameter x)?)*
  # (* a blank line)?
  #  * (Description:)? (Description of function)?
  #  * (section header: (section description)? )*
  #  (*)?*/
  #
  # So .. the trivial example would be:
  #
  # /**
  #  * my_function
b9d97328e   Randy Dunlap   kernel-doc: clean...
107
  #  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
  #
891dcd2f7   Randy Dunlap   [PATCH] kernel-do...
109
  # If the Description: header tag is omitted, then there must be a blank line
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
114
115
  # after the last parameter specification.
  # e.g.
  # /**
  #  * my_function - does my stuff
  #  * @my_arg: its mine damnit
  #  *
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
116
  #  * Does my stuff explained.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
  #  */
  #
  #  or, could also use:
  # /**
  #  * my_function - does my stuff
  #  * @my_arg: its mine damnit
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
123
  #  * Description: Does my stuff explained.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
126
  #  */
  # etc.
  #
b9d97328e   Randy Dunlap   kernel-doc: clean...
127
  # Besides functions you can also write documentation for structs, unions,
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
128
129
130
  # enums and typedefs. Instead of the function name you must write the name
  # of the declaration;  the struct/union/enum/typedef must always precede
  # the name. Nesting of declarations is not supported.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
133
134
135
136
  # Use the argument mechanism to document members or constants.
  # e.g.
  # /**
  #  * struct my_struct - short description
  #  * @a: first member
  #  * @b: second member
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
137
  #  *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
141
142
  #  * Longer description
  #  */
  # struct my_struct {
  #     int a;
  #     int b;
aeec46b97   Martin Waitz   [PATCH] DocBook: ...
143
144
  # /* private: */
  #     int c;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
  # };
  #
  # All descriptions can be multiline, except the short function description.
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
148
  #
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  # For really longs structs, you can also describe arguments inside the
  # body of the struct.
  # eg.
  # /**
  #  * struct my_struct - short description
  #  * @a: first member
  #  * @b: second member
  #  *
  #  * Longer description
  #  */
  # struct my_struct {
  #     int a;
  #     int b;
  #     /**
  #      * @c: This is longer description of C
  #      *
  #      * You can use paragraphs to describe arguments
  #      * using this method.
  #      */
  #     int c;
  # };
  #
  # This should be use only for struct/enum members.
  #
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
173
174
  # You can also add additional sections. When documenting kernel functions you
  # should document the "Context:" of the function, e.g. whether the functions
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  # can be called form interrupts. Unlike other sections you can end it with an
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
176
  # empty line.
4092bac77   Yacine Belkadi   scripts/kernel-do...
177
178
  # A non-void function should have a "Return:" section describing the return
  # value(s).
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
179
  # Example-sections should contain the string EXAMPLE so that they are marked
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
181
182
183
184
185
186
  # appropriately in DocBook.
  #
  # Example:
  # /**
  #  * user_function - function that can only be called in user context
  #  * @a: some argument
  #  * Context: !in_interrupt()
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
187
  #  *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
189
190
191
192
193
194
195
196
197
198
199
200
  #  * Some description
  #  * Example:
  #  *    user_function(22);
  #  */
  # ...
  #
  #
  # All descriptive text is further processed, scanning for the following special
  # patterns, which are highlighted appropriately.
  #
  # 'funcname()' - function
  # '$ENVVAR' - environmental variable
  # '&struct_name' - name of a structure (up to two words including 'struct')
5267dd354   Paolo Bonzini   kernel-doc: make ...
201
  # '&struct_name.member' - name of a structure member
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
202
203
  # '@parameter' - name of a parameter
  # '%CONST' - name of a constant.
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
204
  # '``LITERAL``' - literal string without any spaces on it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205

8484baaa5   Randy Dunlap   kernel-doc: code ...
206
  ## init lots of data
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
208
  my $errors = 0;
  my $warnings = 0;
5f8c7c98a   Randy Dunlap   kernel-doc: fix u...
209
  my $anon_struct_union = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
211
  
  # match expressions used to find embedded type information
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
212
213
  my $type_constant = '\b``([^\`]+)``\b';
  my $type_constant2 = '\%([-_\w]+)';
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214
  my $type_func = '(\w+)\(\)';
c950a1739   Silvio Fricke   kernel-doc: bette...
215
  my $type_param = '\@(\w+(\.\.\.)?)';
5219f18aa   Jonathan Corbet   docs: Special-cas...
216
  my $type_fp_param = '\@(\w+)\(\)';  # Special RST handling for func ptr params
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217
  my $type_env = '(\$\w+)';
df31175bb   Paolo Bonzini   kernel-doc: make ...
218
219
220
221
  my $type_enum = '\&(enum\s*([_\w]+))';
  my $type_struct = '\&(struct\s*([_\w]+))';
  my $type_typedef = '\&(typedef\s*([_\w]+))';
  my $type_union = '\&(union\s*([_\w]+))';
5267dd354   Paolo Bonzini   kernel-doc: make ...
222
  my $type_member = '\&([_\w]+)(\.|->)([_\w]+)';
df31175bb   Paolo Bonzini   kernel-doc: make ...
223
224
225
226
227
  my $type_fallback = '\&([_\w]+)';
  my $type_enum_xml = '\&amp;(enum\s*([_\w]+))';
  my $type_struct_xml = '\&amp;(struct\s*([_\w]+))';
  my $type_typedef_xml = '\&amp;(typedef\s*([_\w]+))';
  my $type_union_xml = '\&amp;(union\s*([_\w]+))';
5267dd354   Paolo Bonzini   kernel-doc: make ...
228
  my $type_member_xml = '\&amp;([_\w]+)(\.|-\&gt;)([_\w]+)';
df31175bb   Paolo Bonzini   kernel-doc: make ...
229
  my $type_fallback_xml = '\&amp([_\w]+)';
f3341dcf3   Jani Nikula   kernel-doc/rst: a...
230
  my $type_member_func = $type_member . '\(\)';
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231
232
233
234
235
  
  # Output conversion substitutions.
  #  One for each output format
  
  # these work fairly well
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
236
237
  my @highlights_html = (
                         [$type_constant, "<i>\$1</i>"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
238
                         [$type_constant2, "<i>\$1</i>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
239
                         [$type_func, "<b>\$1</b>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
240
                         [$type_enum_xml, "<i>\$1</i>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
241
                         [$type_struct_xml, "<i>\$1</i>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
242
243
                         [$type_typedef_xml, "<i>\$1</i>"],
                         [$type_union_xml, "<i>\$1</i>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
244
                         [$type_env, "<b><i>\$1</i></b>"],
5267dd354   Paolo Bonzini   kernel-doc: make ...
245
                         [$type_param, "<tt><b>\$1</b></tt>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
246
247
                         [$type_member_xml, "<tt><i>\$1</i>\$2\$3</tt>"],
                         [$type_fallback_xml, "<i>\$1</i>"]
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
248
                        );
6b5b55f6c   Randy Dunlap   kernel-doc: fix d...
249
250
251
  my $local_lt = "\\\\\\\\lt:";
  my $local_gt = "\\\\\\\\gt:";
  my $blankline_html = $local_lt . "p" . $local_gt;	# was "<p>"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
252

1b40c1944   Dan Luedtke   scripts/kernel-do...
253
  # html version 5
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
254
255
  my @highlights_html5 = (
                          [$type_constant, "<span class=\"const\">\$1</span>"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
256
                          [$type_constant2, "<span class=\"const\">\$1</span>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
257
                          [$type_func, "<span class=\"func\">\$1</span>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
258
                          [$type_enum_xml, "<span class=\"enum\">\$1</span>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
259
                          [$type_struct_xml, "<span class=\"struct\">\$1</span>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
260
261
                          [$type_typedef_xml, "<span class=\"typedef\">\$1</span>"],
                          [$type_union_xml, "<span class=\"union\">\$1</span>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
262
                          [$type_env, "<span class=\"env\">\$1</span>"],
5267dd354   Paolo Bonzini   kernel-doc: make ...
263
                          [$type_param, "<span class=\"param\">\$1</span>]"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
264
265
                          [$type_member_xml, "<span class=\"literal\"><span class=\"struct\">\$1</span>\$2<span class=\"member\">\$3</span></span>"],
                          [$type_fallback_xml, "<span class=\"struct\">\$1</span>"]
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
266
  		       );
1b40c1944   Dan Luedtke   scripts/kernel-do...
267
  my $blankline_html5 = $local_lt . "br /" . $local_gt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
  # XML, docbook format
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
269
270
271
  my @highlights_xml = (
                        ["([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>"],
                        [$type_constant, "<constant>\$1</constant>"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
272
                        [$type_constant2, "<constant>\$1</constant>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
273
                        [$type_enum_xml, "<type>\$1</type>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
274
                        [$type_struct_xml, "<structname>\$1</structname>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
275
276
                        [$type_typedef_xml, "<type>\$1</type>"],
                        [$type_union_xml, "<structname>\$1</structname>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
277
278
                        [$type_param, "<parameter>\$1</parameter>"],
                        [$type_func, "<function>\$1</function>"],
5267dd354   Paolo Bonzini   kernel-doc: make ...
279
                        [$type_env, "<envar>\$1</envar>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
280
281
                        [$type_member_xml, "<literal><structname>\$1</structname>\$2<structfield>\$3</structfield></literal>"],
                        [$type_fallback_xml, "<structname>\$1</structname>"]
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
282
  		     );
5c98fc036   Johannes Berg   kernel-doc: fix x...
283
284
  my $blankline_xml = $local_lt . "/para" . $local_gt . $local_lt . "para" . $local_gt . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
286
  
  # gnome, docbook format
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
287
288
  my @highlights_gnome = (
                          [$type_constant, "<replaceable class=\"option\">\$1</replaceable>"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
289
                          [$type_constant2, "<replaceable class=\"option\">\$1</replaceable>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
290
                          [$type_func, "<function>\$1</function>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
291
                          [$type_enum, "<type>\$1</type>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
292
                          [$type_struct, "<structname>\$1</structname>"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
293
294
                          [$type_typedef, "<type>\$1</type>"],
                          [$type_union, "<structname>\$1</structname>"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
295
                          [$type_env, "<envar>\$1</envar>"],
5267dd354   Paolo Bonzini   kernel-doc: make ...
296
                          [$type_param, "<parameter>\$1</parameter>" ],
df31175bb   Paolo Bonzini   kernel-doc: make ...
297
298
                          [$type_member, "<literal><structname>\$1</structname>\$2<structfield>\$3</structfield></literal>"],
                          [$type_fallback, "<structname>\$1</structname>"]
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
299
  		       );
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
301
302
303
  my $blankline_gnome = "</para><para>
  ";
  
  # these are pretty rough
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
304
305
  my @highlights_man = (
                        [$type_constant, "\$1"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
306
                        [$type_constant2, "\$1"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
307
                        [$type_func, "\\\\fB\$1\\\\fP"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
308
                        [$type_enum, "\\\\fI\$1\\\\fP"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
309
                        [$type_struct, "\\\\fI\$1\\\\fP"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
310
311
                        [$type_typedef, "\\\\fI\$1\\\\fP"],
                        [$type_union, "\\\\fI\$1\\\\fP"],
5267dd354   Paolo Bonzini   kernel-doc: make ...
312
                        [$type_param, "\\\\fI\$1\\\\fP"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
313
314
                        [$type_member, "\\\\fI\$1\$2\$3\\\\fP"],
                        [$type_fallback, "\\\\fI\$1\\\\fP"]
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
315
  		     );
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
  my $blankline_man = "";
  
  # text-mode
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
319
320
  my @highlights_text = (
                         [$type_constant, "\$1"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
321
                         [$type_constant2, "\$1"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
322
                         [$type_func, "\$1"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
323
                         [$type_enum, "\$1"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
324
                         [$type_struct, "\$1"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
325
326
                         [$type_typedef, "\$1"],
                         [$type_union, "\$1"],
5267dd354   Paolo Bonzini   kernel-doc: make ...
327
                         [$type_param, "\$1"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
328
329
                         [$type_member, "\$1\$2\$3"],
                         [$type_fallback, "\$1"]
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
330
  		      );
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
331
  my $blankline_text = "";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
332
333
334
  # rst-mode
  my @highlights_rst = (
                         [$type_constant, "``\$1``"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
335
                         [$type_constant2, "``\$1``"],
f3341dcf3   Jani Nikula   kernel-doc/rst: a...
336
                         # Note: need to escape () to avoid func matching later
5267dd354   Paolo Bonzini   kernel-doc: make ...
337
338
                         [$type_member_func, "\\:c\\:type\\:`\$1\$2\$3\\\\(\\\\) <\$1>`"],
                         [$type_member, "\\:c\\:type\\:`\$1\$2\$3 <\$1>`"],
5219f18aa   Jonathan Corbet   docs: Special-cas...
339
  		       [$type_fp_param, "**\$1\\\\(\\\\)**"],
a19bce643   Jani Nikula   kernel-doc/rst: r...
340
                         [$type_func, "\\:c\\:func\\:`\$1()`"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
341
342
343
344
                         [$type_enum, "\\:c\\:type\\:`\$1 <\$2>`"],
                         [$type_struct, "\\:c\\:type\\:`\$1 <\$2>`"],
                         [$type_typedef, "\\:c\\:type\\:`\$1 <\$2>`"],
                         [$type_union, "\\:c\\:type\\:`\$1 <\$2>`"],
a7291e7e0   Jani Nikula   kernel-doc/rst: &...
345
                         # in rst this can refer to any type
df31175bb   Paolo Bonzini   kernel-doc: make ...
346
                         [$type_fallback, "\\:c\\:type\\:`\$1`"],
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
347
348
349
350
                         [$type_param, "**\$1**"]
  		      );
  my $blankline_rst = "
  ";
eda603f6c   Johannes Berg   docbook: warn on ...
351
  # list mode
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
352
353
  my @highlights_list = (
                         [$type_constant, "\$1"],
b97f193ab   Mauro Carvalho Chehab   scripts/kernel-do...
354
                         [$type_constant2, "\$1"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
355
                         [$type_func, "\$1"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
356
                         [$type_enum, "\$1"],
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
357
                         [$type_struct, "\$1"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
358
359
                         [$type_typedef, "\$1"],
                         [$type_union, "\$1"],
5267dd354   Paolo Bonzini   kernel-doc: make ...
360
                         [$type_param, "\$1"],
df31175bb   Paolo Bonzini   kernel-doc: make ...
361
362
                         [$type_member, "\$1"],
                         [$type_fallback, "\$1"]
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
363
  		      );
eda603f6c   Johannes Berg   docbook: warn on ...
364
  my $blankline_list = "";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
366
  # read arguments
b9d97328e   Randy Dunlap   kernel-doc: clean...
367
  if ($#ARGV == -1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
369
      usage();
  }
8484baaa5   Randy Dunlap   kernel-doc: code ...
370
371
  my $kernelversion;
  my $dohighlight = "";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
373
  my $verbose = 0;
  my $output_mode = "man";
e314ba313   Daniel Santos   kernel-doc: bugfi...
374
  my $output_preformatted = 0;
4b44595a7   Johannes Berg   kernel-doc: proce...
375
  my $no_doc_sections = 0;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
376
  my $enable_lineno = 0;
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
377
  my @highlights = @highlights_man;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
378
379
  my $blankline = $blankline_man;
  my $modulename = "Kernel API";
b6c3f456c   Jani Nikula   kernel-doc: add n...
380
381
382
383
384
385
386
387
388
  
  use constant {
      OUTPUT_ALL          => 0, # output all symbols and doc sections
      OUTPUT_INCLUDE      => 1, # output only specified symbols
      OUTPUT_EXCLUDE      => 2, # output everything except specified symbols
      OUTPUT_EXPORTED     => 3, # output exported symbols
      OUTPUT_INTERNAL     => 4, # output non-exported symbols
  };
  my $output_selection = OUTPUT_ALL;
b2c4105b0   Ben Hutchings   scripts/kernel-do...
389
  my $show_not_found = 0;
88c2b57da   Jani Nikula   kernel-doc: add s...
390
  my @export_file_list;
b2c4105b0   Ben Hutchings   scripts/kernel-do...
391
392
393
394
395
396
397
  my @build_time;
  if (defined($ENV{'KBUILD_BUILD_TIMESTAMP'}) &&
      (my $seconds = `date -d"${ENV{'KBUILD_BUILD_TIMESTAMP'}}" +%s`) ne '') {
      @build_time = gmtime($seconds);
  } else {
      @build_time = localtime;
  }
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
398
399
  my $man_date = ('January', 'February', 'March', 'April', 'May', 'June',
  		'July', 'August', 'September', 'October',
b2c4105b0   Ben Hutchings   scripts/kernel-do...
400
401
  		'November', 'December')[$build_time[4]] .
    " " . ($build_time[5]+1900);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
402

8484baaa5   Randy Dunlap   kernel-doc: code ...
403
  # Essentially these are globals.
b9d97328e   Randy Dunlap   kernel-doc: clean...
404
405
  # They probably want to be tidied up, made more localised or something.
  # CAVEAT EMPTOR!  Some of the others I localised may not want to be, which
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
406
  # could cause "use of undefined value" or other bugs.
b9d97328e   Randy Dunlap   kernel-doc: clean...
407
  my ($function, %function_table, %parametertypes, $declaration_purpose);
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
408
  my $declaration_start_line;
b9d97328e   Randy Dunlap   kernel-doc: clean...
409
  my ($type, $declaration_name, $return_type);
1c32fd0c5   Ilya Dryomov   kernel-doc: drop ...
410
  my ($newsection, $newcontents, $prototype, $brcount, %source_map);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411

bd0e88e51   Randy Dunlap   kernel-doc: set v...
412
413
414
  if (defined($ENV{'KBUILD_VERBOSE'})) {
  	$verbose = "$ENV{'KBUILD_VERBOSE'}";
  }
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
415
  # Generated docbook code is inserted in a template at a point where
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
417
418
419
420
421
422
423
  # docbook v3.1 requires a non-zero sequence of RefEntry's; see:
  # http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
  # We keep track of number of generated entries and generate a dummy
  # if needs be to ensure the expanded template can be postprocessed
  # into html.
  my $section_counter = 0;
  
  my $lineprefix="";
48af606ad   Jani Nikula   kernel-doc: add n...
424
425
426
427
428
429
430
431
432
  # Parser states
  use constant {
      STATE_NORMAL        => 0, # normal code
      STATE_NAME          => 1, # looking for function name
      STATE_FIELD         => 2, # scanning field start
      STATE_PROTO         => 3, # scanning prototype
      STATE_DOCBLOCK      => 4, # documentation block
      STATE_INLINE        => 5, # gathering documentation outside main block
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
433
  my $state;
850622dfa   Randy Dunlap   [PATCH] kernel-do...
434
  my $in_doc_sect;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435

48af606ad   Jani Nikula   kernel-doc: add n...
436
437
438
439
440
441
442
443
444
445
446
  # Inline documentation state
  use constant {
      STATE_INLINE_NA     => 0, # not applicable ($state != STATE_INLINE)
      STATE_INLINE_NAME   => 1, # looking for member name (@foo:)
      STATE_INLINE_TEXT   => 2, # looking for member documentation
      STATE_INLINE_END    => 3, # done
      STATE_INLINE_ERROR  => 4, # error - Comment without header was found.
                                # Spit a warning as it's not
                                # proper kernel-doc and ignore the rest.
  };
  my $inline_doc_state;
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
447

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
449
450
  #declaration types: can be
  # 'function', 'struct', 'union', 'enum', 'typedef'
  my $decl_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451
452
453
  my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
  my $doc_end = '\*/';
  my $doc_com = '\s*\*\s*';
12ae67793   Daniel Santos   kernel-doc: don't...
454
  my $doc_com_body = '\s*\* ?';
b9d97328e   Randy Dunlap   kernel-doc: clean...
455
  my $doc_decl = $doc_com . '(\w+)';
f624adef3   Jani Nikula   kernel-doc: limit...
456
  # @params and a strictly limited set of supported section names
8569de68e   Jonathan Corbet   docs: kernel-doc:...
457
  my $doc_sect = $doc_com . 
ef00028b2   Jonathan Corbet   docs: make kernel...
458
      '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:(.*)';
12ae67793   Daniel Santos   kernel-doc: don't...
459
  my $doc_content = $doc_com_body . '(.*)';
b9d97328e   Randy Dunlap   kernel-doc: clean...
460
  my $doc_block = $doc_com . 'DOC:\s*(.*)?';
48af606ad   Jani Nikula   kernel-doc: add n...
461
462
463
  my $doc_inline_start = '^\s*/\*\*\s*$';
  my $doc_inline_sect = '\s*\*\s*(@[\w\s]+):(.*)';
  my $doc_inline_end = '^\s*\*/\s*$';
0c9aa2095   Jani Nikula   kernel-doc: add s...
464
  my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
86ae2e38d   Jani Nikula   kernel-doc: suppo...
465
  my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
467
  my %parameterdescs;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
468
  my %parameterdesc_start_lines;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
470
471
  my @parameterlist;
  my %sections;
  my @sectionlist;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
472
  my %section_start_lines;
a1d94aa55   Randy Dunlap   kernel-doc: check...
473
474
  my $sectcheck;
  my $struct_actual;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
475
476
  
  my $contents = "";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
477
  my $new_start_line = 0;
f624adef3   Jani Nikula   kernel-doc: limit...
478
479
  
  # the canonical section names. see also $doc_sect above.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480
481
482
483
  my $section_default = "Description";	# default section
  my $section_intro = "Introduction";
  my $section = $section_default;
  my $section_context = "Context";
4092bac77   Yacine Belkadi   scripts/kernel-do...
484
  my $section_return = "Return";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
485
486
487
488
489
490
491
492
493
  
  my $undescribed = "-- undescribed --";
  
  reset_state();
  
  while ($ARGV[0] =~ m/^-(.*)/) {
      my $cmd = shift @ARGV;
      if ($cmd eq "-html") {
  	$output_mode = "html";
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
494
  	@highlights = @highlights_html;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
  	$blankline = $blankline_html;
1b40c1944   Dan Luedtke   scripts/kernel-do...
496
497
      } elsif ($cmd eq "-html5") {
  	$output_mode = "html5";
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
498
  	@highlights = @highlights_html5;
1b40c1944   Dan Luedtke   scripts/kernel-do...
499
  	$blankline = $blankline_html5;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
501
      } elsif ($cmd eq "-man") {
  	$output_mode = "man";
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
502
  	@highlights = @highlights_man;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
505
  	$blankline = $blankline_man;
      } elsif ($cmd eq "-text") {
  	$output_mode = "text";
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
506
  	@highlights = @highlights_text;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
507
  	$blankline = $blankline_text;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
508
509
510
511
      } elsif ($cmd eq "-rst") {
  	$output_mode = "rst";
  	@highlights = @highlights_rst;
  	$blankline = $blankline_rst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
513
      } elsif ($cmd eq "-docbook") {
  	$output_mode = "xml";
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
514
  	@highlights = @highlights_xml;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515
  	$blankline = $blankline_xml;
eda603f6c   Johannes Berg   docbook: warn on ...
516
517
      } elsif ($cmd eq "-list") {
  	$output_mode = "list";
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
518
  	@highlights = @highlights_list;
eda603f6c   Johannes Berg   docbook: warn on ...
519
  	$blankline = $blankline_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
      } elsif ($cmd eq "-gnome") {
  	$output_mode = "gnome";
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
522
  	@highlights = @highlights_gnome;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
523
524
525
526
  	$blankline = $blankline_gnome;
      } elsif ($cmd eq "-module") { # not needed for XML, inherits from calling document
  	$modulename = shift @ARGV;
      } elsif ($cmd eq "-function") { # to only output specific functions
b6c3f456c   Jani Nikula   kernel-doc: add n...
527
  	$output_selection = OUTPUT_INCLUDE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
529
  	$function = shift @ARGV;
  	$function_table{$function} = 1;
b6c3f456c   Jani Nikula   kernel-doc: add n...
530
531
      } elsif ($cmd eq "-nofunction") { # output all except specific functions
  	$output_selection = OUTPUT_EXCLUDE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532
533
  	$function = shift @ARGV;
  	$function_table{$function} = 1;
86ae2e38d   Jani Nikula   kernel-doc: suppo...
534
      } elsif ($cmd eq "-export") { # only exported symbols
b6c3f456c   Jani Nikula   kernel-doc: add n...
535
  	$output_selection = OUTPUT_EXPORTED;
da9726ecf   Jani Nikula   kernel-doc: add m...
536
  	%function_table = ();
86ae2e38d   Jani Nikula   kernel-doc: suppo...
537
      } elsif ($cmd eq "-internal") { # only non-exported symbols
b6c3f456c   Jani Nikula   kernel-doc: add n...
538
  	$output_selection = OUTPUT_INTERNAL;
da9726ecf   Jani Nikula   kernel-doc: add m...
539
  	%function_table = ();
88c2b57da   Jani Nikula   kernel-doc: add s...
540
541
542
      } elsif ($cmd eq "-export-file") {
  	my $file = shift @ARGV;
  	push(@export_file_list, $file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543
544
545
546
      } elsif ($cmd eq "-v") {
  	$verbose = 1;
      } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
  	usage();
4b44595a7   Johannes Berg   kernel-doc: proce...
547
548
      } elsif ($cmd eq '-no-doc-sections') {
  	    $no_doc_sections = 1;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
549
550
      } elsif ($cmd eq '-enable-lineno') {
  	    $enable_lineno = 1;
e946c43a1   Johannes Berg   kernel-doc: impro...
551
552
      } elsif ($cmd eq '-show-not-found') {
  	$show_not_found = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553
554
      }
  }
8484baaa5   Randy Dunlap   kernel-doc: code ...
555
  # continue execution near EOF;
53f049fa5   Borislav Petkov   kill warnings whe...
556
557
  # get kernel version from env
  sub get_kernel_version() {
1b9bc22d7   Johannes Berg   kernel-doc: init ...
558
      my $version = 'unknown kernel version';
53f049fa5   Borislav Petkov   kill warnings whe...
559
560
561
562
563
564
  
      if (defined($ENV{'KERNELVERSION'})) {
  	$version = $ENV{'KERNELVERSION'};
      }
      return $version;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565

0b0f5f29b   Daniel Vetter   scripts/kernel-do...
566
567
568
569
570
571
572
573
  #
  sub print_lineno {
      my $lineno = shift;
      if ($enable_lineno && defined($lineno)) {
          print "#define LINENO " . $lineno . "
  ";
      }
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574
575
576
577
  ##
  # dumps section contents to arrays/hashes intended for that purpose.
  #
  sub dump_section {
94dc7ad55   Randy Dunlap   kernel-doc: detec...
578
      my $file = shift;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
579
580
581
      my $name = shift;
      my $contents = join "
  ", @_;
13901ef27   Jani Nikula   kernel-doc: do no...
582
      if ($name =~ m/$type_param/) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
583
584
  	$name = $1;
  	$parameterdescs{$name} = $contents;
a1d94aa55   Randy Dunlap   kernel-doc: check...
585
  	$sectcheck = $sectcheck . $name . " ";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
586
587
          $parameterdesc_start_lines{$name} = $new_start_line;
          $new_start_line = 0;
ced69090c   Randy Dunlap   kernel-doc: handl...
588
      } elsif ($name eq "@\.\.\.") {
ced69090c   Randy Dunlap   kernel-doc: handl...
589
590
  	$name = "...";
  	$parameterdescs{$name} = $contents;
a1d94aa55   Randy Dunlap   kernel-doc: check...
591
  	$sectcheck = $sectcheck . $name . " ";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
592
593
          $parameterdesc_start_lines{$name} = $new_start_line;
          $new_start_line = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
594
      } else {
94dc7ad55   Randy Dunlap   kernel-doc: detec...
595
  	if (defined($sections{$name}) && ($sections{$name} ne "")) {
95b6be9d1   Jani Nikula   kernel-doc: do no...
596
597
598
599
600
601
  	    # Only warn on user specified duplicate section names.
  	    if ($name ne $section_default) {
  		print STDERR "${file}:$.: warning: duplicate section name '$name'
  ";
  		++$warnings;
  	    }
32217761e   Jani Nikula   kernel-doc: conca...
602
603
604
605
  	    $sections{$name} .= $contents;
  	} else {
  	    $sections{$name} = $contents;
  	    push @sectionlist, $name;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
606
607
              $section_start_lines{$name} = $new_start_line;
              $new_start_line = 0;
94dc7ad55   Randy Dunlap   kernel-doc: detec...
608
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
609
610
611
612
      }
  }
  
  ##
b112e0f73   Johannes Berg   kernel-doc: singl...
613
614
615
  # dump DOC: section after checking that it should go out
  #
  sub dump_doc_section {
94dc7ad55   Randy Dunlap   kernel-doc: detec...
616
      my $file = shift;
b112e0f73   Johannes Berg   kernel-doc: singl...
617
618
619
      my $name = shift;
      my $contents = join "
  ", @_;
4b44595a7   Johannes Berg   kernel-doc: proce...
620
621
622
      if ($no_doc_sections) {
          return;
      }
b6c3f456c   Jani Nikula   kernel-doc: add n...
623
624
625
626
627
      if (($output_selection == OUTPUT_ALL) ||
  	($output_selection == OUTPUT_INCLUDE &&
  	 defined($function_table{$name})) ||
  	($output_selection == OUTPUT_EXCLUDE &&
  	 !defined($function_table{$name})))
b112e0f73   Johannes Berg   kernel-doc: singl...
628
      {
94dc7ad55   Randy Dunlap   kernel-doc: detec...
629
  	dump_section($file, $name, $contents);
b112e0f73   Johannes Berg   kernel-doc: singl...
630
631
632
  	output_blockhead({'sectionlist' => \@sectionlist,
  			  'sections' => \%sections,
  			  'module' => $modulename,
b6c3f456c   Jani Nikula   kernel-doc: add n...
633
  			  'content-only' => ($output_selection != OUTPUT_ALL), });
b112e0f73   Johannes Berg   kernel-doc: singl...
634
635
636
637
      }
  }
  
  ##
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
639
640
641
642
643
644
  # output function
  #
  # parameterdescs, a hash.
  #  function => "function name"
  #  parameterlist => @list of parameters
  #  parameterdescs => %parameter descriptions
  #  sectionlist => @list of sections
a21217daa   Randy Dunlap   [PATCH] kernel-do...
645
  #  sections => %section descriptions
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
646
  #
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
648
649
650
651
652
653
654
655
656
657
658
  
  sub output_highlight {
      my $contents = join "
  ",@_;
      my $line;
  
  #   DEBUG
  #   if (!defined $contents) {
  #	use Carp;
  #	confess "output_highlight got called with no args?
  ";
  #   }
1b40c1944   Dan Luedtke   scripts/kernel-do...
659
660
      if ($output_mode eq "html" || $output_mode eq "html5" ||
  	$output_mode eq "xml") {
6b5b55f6c   Randy Dunlap   kernel-doc: fix d...
661
662
  	$contents = local_unescape($contents);
  	# convert data read & converted thru xml_escape() into &xyz; format:
2b35f4d9c   Randy Dunlap   kernel-doc: escap...
663
  	$contents =~ s/\\\\\\/\&/g;
6b5b55f6c   Randy Dunlap   kernel-doc: fix d...
664
      }
3eb014a10   Randy Dunlap   kernel-doc: html ...
665
666
  #   print STDERR "contents b4:$contents
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
667
668
      eval $dohighlight;
      die $@ if $@;
3eb014a10   Randy Dunlap   kernel-doc: html ...
669
670
  #   print STDERR "contents af:$contents
  ";
1b40c1944   Dan Luedtke   scripts/kernel-do...
671
672
673
674
675
  #   strip whitespaces when generating html5
      if ($output_mode eq "html5") {
  	$contents =~ s/^\s+//;
  	$contents =~ s/\s+$//;
      }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
676
677
      foreach $line (split "
  ", $contents) {
12ae67793   Daniel Santos   kernel-doc: don't...
678
679
680
  	if (! $output_preformatted) {
  	    $line =~ s/^\s*//;
  	}
3c308798a   Randy Dunlap   scripts: kernel-d...
681
  	if ($line eq ""){
e314ba313   Daniel Santos   kernel-doc: bugfi...
682
683
684
  	    if (! $output_preformatted) {
  		print $lineprefix, local_unescape($blankline);
  	    }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685
  	} else {
3c308798a   Randy Dunlap   scripts: kernel-d...
686
  	    $line =~ s/\\\\\\/\&/g;
cdccb316c   Randy Dunlap   kernel-doc: fix l...
687
688
689
690
691
  	    if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
  		print "\\&$line";
  	    } else {
  		print $lineprefix, $line;
  	    }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
693
694
695
696
  	}
  	print "
  ";
      }
  }
1b40c1944   Dan Luedtke   scripts/kernel-do...
697
  # output sections in html
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698
699
700
701
702
703
704
705
706
707
708
709
  sub output_section_html(%) {
      my %args = %{$_[0]};
      my $section;
  
      foreach $section (@{$args{'sectionlist'}}) {
  	print "<h3>$section</h3>
  ";
  	print "<blockquote>
  ";
  	output_highlight($args{'sections'}{$section});
  	print "</blockquote>
  ";
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
710
      }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
712
713
714
715
716
717
  }
  
  # output enum in html
  sub output_enum_html(%) {
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
b9d97328e   Randy Dunlap   kernel-doc: clean...
718
719
      print "<h2>enum " . $args{'enum'} . "</h2>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720

b9d97328e   Randy Dunlap   kernel-doc: clean...
721
722
      print "<b>enum " . $args{'enum'} . "</b> {<br>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
723
724
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
b9d97328e   Randy Dunlap   kernel-doc: clean...
725
  	print " <b>" . $parameter . "</b>";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
  	if ($count != $#{$args{'parameterlist'}}) {
  	    $count++;
  	    print ",
  ";
  	}
  	print "<br>";
      }
      print "};<br>
  ";
  
      print "<h3>Constants</h3>
  ";
      print "<dl>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
b9d97328e   Randy Dunlap   kernel-doc: clean...
741
742
  	print "<dt><b>" . $parameter . "</b>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
743
744
745
746
747
748
749
750
751
  	print "<dd>";
  	output_highlight($args{'parameterdescs'}{$parameter});
      }
      print "</dl>
  ";
      output_section_html(@_);
      print "<hr>
  ";
  }
d28bee0c0   Randy Dunlap   [PATCH] Doc/kerne...
752
  # output typedef in html
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
753
754
755
756
  sub output_typedef_html(%) {
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
b9d97328e   Randy Dunlap   kernel-doc: clean...
757
758
      print "<h2>typedef " . $args{'typedef'} . "</h2>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759

b9d97328e   Randy Dunlap   kernel-doc: clean...
760
761
      print "<b>typedef " . $args{'typedef'} . "</b>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
762
763
764
765
766
767
768
769
770
      output_section_html(@_);
      print "<hr>
  ";
  }
  
  # output struct in html
  sub output_struct_html(%) {
      my %args = %{$_[0]};
      my ($parameter);
b9d97328e   Randy Dunlap   kernel-doc: clean...
771
772
773
774
      print "<h2>" . $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "</h2>
  ";
      print "<b>" . $args{'type'} . " " . $args{'struct'} . "</b> {<br>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
775
776
777
778
779
780
781
782
      foreach $parameter (@{$args{'parameterlist'}}) {
  	if ($parameter =~ /^#/) {
  		print "$parameter<br>
  ";
  		next;
  	}
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
3c308798a   Randy Dunlap   scripts: kernel-d...
783
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
784
785
786
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
3eb014a10   Randy Dunlap   kernel-doc: html ...
787
788
  	    print "&nbsp; &nbsp; <i>$1</i><b>$parameter</b>) <i>($2)</i>;<br>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
789
  	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
3eb014a10   Randy Dunlap   kernel-doc: html ...
790
791
792
  	    # bitfield
  	    print "&nbsp; &nbsp; <i>$1</i> <b>$parameter</b>$2;<br>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
  	} else {
3eb014a10   Randy Dunlap   kernel-doc: html ...
794
795
  	    print "&nbsp; &nbsp; <i>$type</i> <b>$parameter</b>;<br>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
796
797
798
799
800
801
802
803
804
805
806
807
808
809
  	}
      }
      print "};<br>
  ";
  
      print "<h3>Members</h3>
  ";
      print "<dl>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	($parameter =~ /^#/) && next;
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
3c308798a   Randy Dunlap   scripts: kernel-d...
810
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
b9d97328e   Randy Dunlap   kernel-doc: clean...
811
812
  	print "<dt><b>" . $parameter . "</b>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
  	print "<dd>";
  	output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      print "</dl>
  ";
      output_section_html(@_);
      print "<hr>
  ";
  }
  
  # output function in html
  sub output_function_html(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
828

b9d97328e   Randy Dunlap   kernel-doc: clean...
829
830
831
832
833
834
      print "<h2>" . $args{'function'} . " - " . $args{'purpose'} . "</h2>
  ";
      print "<i>" . $args{'functiontype'} . "</i>
  ";
      print "<b>" . $args{'function'} . "</b>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
835
836
837
838
839
840
841
842
      print "(";
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
  	    print "<i>$1</i><b>$parameter</b>) <i>($2)</i>";
  	} else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
843
  	    print "<i>" . $type . "</i> <b>" . $parameter . "</b>";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
  	}
  	if ($count != $#{$args{'parameterlist'}}) {
  	    $count++;
  	    print ",
  ";
  	}
      }
      print ")
  ";
  
      print "<h3>Arguments</h3>
  ";
      print "<dl>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
3c308798a   Randy Dunlap   scripts: kernel-d...
861
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
b9d97328e   Randy Dunlap   kernel-doc: clean...
862
863
  	print "<dt><b>" . $parameter . "</b>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
864
865
866
867
868
869
870
871
872
  	print "<dd>";
  	output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      print "</dl>
  ";
      output_section_html(@_);
      print "<hr>
  ";
  }
b112e0f73   Johannes Berg   kernel-doc: singl...
873
874
  # output DOC: block header in html
  sub output_blockhead_html(%) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
  
      foreach $section (@{$args{'sectionlist'}}) {
  	print "<h3>$section</h3>
  ";
  	print "<ul>
  ";
  	output_highlight($args{'sections'}{$section});
  	print "</ul>
  ";
      }
      print "<hr>
  ";
  }
1b40c1944   Dan Luedtke   scripts/kernel-do...
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
  # output sections in html5
  sub output_section_html5(%) {
      my %args = %{$_[0]};
      my $section;
  
      foreach $section (@{$args{'sectionlist'}}) {
  	print "<section>
  ";
  	print "<h1>$section</h1>
  ";
  	print "<p>
  ";
  	output_highlight($args{'sections'}{$section});
  	print "</p>
  ";
  	print "</section>
  ";
      }
  }
  
  # output enum in html5
  sub output_enum_html5(%) {
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
      my $html5id;
  
      $html5id = $args{'enum'};
      $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
      print "<article class=\"enum\" id=\"enum:". $html5id . "\">";
      print "<h1>enum " . $args{'enum'} . "</h1>
  ";
      print "<ol class=\"code\">
  ";
      print "<li>";
      print "<span class=\"keyword\">enum</span> ";
      print "<span class=\"identifier\">" . $args{'enum'} . "</span> {";
      print "</li>
  ";
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
  	print "<li class=\"indent\">";
  	print "<span class=\"param\">" . $parameter . "</span>";
  	if ($count != $#{$args{'parameterlist'}}) {
  	    $count++;
  	    print ",";
  	}
  	print "</li>
  ";
      }
      print "<li>};</li>
  ";
      print "</ol>
  ";
  
      print "<section>
  ";
      print "<h1>Constants</h1>
  ";
      print "<dl>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	print "<dt>" . $parameter . "</dt>
  ";
  	print "<dd>";
  	output_highlight($args{'parameterdescs'}{$parameter});
  	print "</dd>
  ";
      }
      print "</dl>
  ";
      print "</section>
  ";
      output_section_html5(@_);
      print "</article>
  ";
  }
  
  # output typedef in html5
  sub output_typedef_html5(%) {
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
      my $html5id;
  
      $html5id = $args{'typedef'};
      $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
      print "<article class=\"typedef\" id=\"typedef:" . $html5id . "\">
  ";
      print "<h1>typedef " . $args{'typedef'} . "</h1>
  ";
  
      print "<ol class=\"code\">
  ";
      print "<li>";
      print "<span class=\"keyword\">typedef</span> ";
      print "<span class=\"identifier\">" . $args{'typedef'} . "</span>";
      print "</li>
  ";
      print "</ol>
  ";
      output_section_html5(@_);
      print "</article>
  ";
  }
  
  # output struct in html5
  sub output_struct_html5(%) {
      my %args = %{$_[0]};
      my ($parameter);
      my $html5id;
  
      $html5id = $args{'struct'};
      $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
      print "<article class=\"struct\" id=\"struct:" . $html5id . "\">
  ";
      print "<hgroup>
  ";
      print "<h1>" . $args{'type'} . " " . $args{'struct'} . "</h1>";
      print "<h2>". $args{'purpose'} . "</h2>
  ";
      print "</hgroup>
  ";
      print "<ol class=\"code\">
  ";
      print "<li>";
      print "<span class=\"type\">" . $args{'type'} . "</span> ";
      print "<span class=\"identifier\">" . $args{'struct'} . "</span> {";
      print "</li>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	print "<li class=\"indent\">";
  	if ($parameter =~ /^#/) {
  		print "<span class=\"param\">" . $parameter ."</span>
  ";
  		print "</li>
  ";
  		next;
  	}
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
  
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
  	    print "<span class=\"type\">$1</span> ";
  	    print "<span class=\"param\">$parameter</span>";
  	    print "<span class=\"type\">)</span> ";
  	    print "(<span class=\"args\">$2</span>);";
  	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
  	    # bitfield
  	    print "<span class=\"type\">$1</span> ";
  	    print "<span class=\"param\">$parameter</span>";
  	    print "<span class=\"bits\">$2</span>;";
  	} else {
  	    print "<span class=\"type\">$type</span> ";
  	    print "<span class=\"param\">$parameter</span>;";
  	}
  	print "</li>
  ";
      }
      print "<li>};</li>
  ";
      print "</ol>
  ";
  
      print "<section>
  ";
      print "<h1>Members</h1>
  ";
      print "<dl>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	($parameter =~ /^#/) && next;
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
  
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
  	print "<dt>" . $parameter . "</dt>
  ";
  	print "<dd>";
  	output_highlight($args{'parameterdescs'}{$parameter_name});
  	print "</dd>
  ";
      }
      print "</dl>
  ";
      print "</section>
  ";
      output_section_html5(@_);
      print "</article>
  ";
  }
  
  # output function in html5
  sub output_function_html5(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
      my $html5id;
  
      $html5id = $args{'function'};
      $html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
      print "<article class=\"function\" id=\"func:". $html5id . "\">
  ";
      print "<hgroup>
  ";
      print "<h1>" . $args{'function'} . "</h1>";
      print "<h2>" . $args{'purpose'} . "</h2>
  ";
      print "</hgroup>
  ";
      print "<ol class=\"code\">
  ";
      print "<li>";
      print "<span class=\"type\">" . $args{'functiontype'} . "</span> ";
      print "<span class=\"identifier\">" . $args{'function'} . "</span> (";
      print "</li>";
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
  	print "<li class=\"indent\">";
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
  	    print "<span class=\"type\">$1</span> ";
  	    print "<span class=\"param\">$parameter</span>";
  	    print "<span class=\"type\">)</span> ";
  	    print "(<span class=\"args\">$2</span>)";
  	} else {
  	    print "<span class=\"type\">$type</span> ";
  	    print "<span class=\"param\">$parameter</span>";
  	}
  	if ($count != $#{$args{'parameterlist'}}) {
  	    $count++;
  	    print ",";
  	}
  	print "</li>
  ";
      }
      print "<li>)</li>
  ";
      print "</ol>
  ";
  
      print "<section>
  ";
      print "<h1>Arguments</h1>
  ";
      print "<p>
  ";
      print "<dl>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
  
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
  	print "<dt>" . $parameter . "</dt>
  ";
  	print "<dd>";
  	output_highlight($args{'parameterdescs'}{$parameter_name});
  	print "</dd>
  ";
      }
      print "</dl>
  ";
      print "</section>
  ";
      output_section_html5(@_);
      print "</article>
  ";
  }
  
  # output DOC: block header in html5
  sub output_blockhead_html5(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
      my $html5id;
  
      foreach $section (@{$args{'sectionlist'}}) {
  	$html5id = $section;
  	$html5id =~ s/[^a-zA-Z0-9\-]+/_/g;
  	print "<article class=\"doc\" id=\"doc:". $html5id . "\">
  ";
  	print "<h1>$section</h1>
  ";
  	print "<p>
  ";
  	output_highlight($args{'sections'}{$section});
  	print "</p>
  ";
      }
      print "</article>
  ";
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1189
1190
  sub output_section_xml(%) {
      my %args = %{$_[0]};
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
1191
      my $section;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192
1193
1194
      # print out each section
      $lineprefix="   ";
      foreach $section (@{$args{'sectionlist'}}) {
c73894c1e   Rich Walker   [PATCH] DocBook: ...
1195
1196
1197
1198
  	print "<refsect1>
  ";
  	print "<title>$section</title>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1199
  	if ($section =~ m/EXAMPLE/i) {
c73894c1e   Rich Walker   [PATCH] DocBook: ...
1200
1201
  	    print "<informalexample><programlisting>
  ";
e314ba313   Daniel Santos   kernel-doc: bugfi...
1202
  	    $output_preformatted = 1;
c73894c1e   Rich Walker   [PATCH] DocBook: ...
1203
1204
1205
  	} else {
  	    print "<para>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1206
1207
  	}
  	output_highlight($args{'sections'}{$section});
e314ba313   Daniel Santos   kernel-doc: bugfi...
1208
  	$output_preformatted = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1209
  	if ($section =~ m/EXAMPLE/i) {
c73894c1e   Rich Walker   [PATCH] DocBook: ...
1210
1211
1212
1213
1214
  	    print "</programlisting></informalexample>
  ";
  	} else {
  	    print "</para>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1215
  	}
c73894c1e   Rich Walker   [PATCH] DocBook: ...
1216
1217
  	print "</refsect1>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1218
1219
1220
1221
1222
1223
1224
1225
1226
      }
  }
  
  # output function in XML DocBook
  sub output_function_xml(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
      my $id;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1227
      $id = "API-" . $args{'function'};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1228
      $id =~ s/[^A-Za-z0-9]/-/g;
5449bc941   Pavel Pisa   [PATCH] DocBook/H...
1229
1230
      print "<refentry id=\"$id\">
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
      print "<refentryinfo>
  ";
      print " <title>LINUX</title>
  ";
      print " <productname>Kernel Hackers Manual</productname>
  ";
      print " <date>$man_date</date>
  ";
      print "</refentryinfo>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1241
1242
      print "<refmeta>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1243
1244
      print " <refentrytitle><phrase>" . $args{'function'} . "</phrase></refentrytitle>
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1245
1246
      print " <manvolnum>9</manvolnum>
  ";
0366299bd   Borislav Petkov   kernel-doc: small...
1247
1248
      print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1249
1250
1251
1252
      print "</refmeta>
  ";
      print "<refnamediv>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1253
1254
      print " <refname>" . $args{'function'} . "</refname>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
      print " <refpurpose>
  ";
      print "  ";
      output_highlight ($args{'purpose'});
      print " </refpurpose>
  ";
      print "</refnamediv>
  ";
  
      print "<refsynopsisdiv>
  ";
      print " <title>Synopsis</title>
  ";
      print "  <funcsynopsis><funcprototype>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1270
1271
1272
      print "   <funcdef>" . $args{'functiontype'} . " ";
      print "<function>" . $args{'function'} . " </function></funcdef>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
  
      $count = 0;
      if ($#{$args{'parameterlist'}} >= 0) {
  	foreach $parameter (@{$args{'parameterlist'}}) {
  	    $type = $args{'parametertypes'}{$parameter};
  	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  		# pointer-to-function
  		print "   <paramdef>$1<parameter>$parameter</parameter>)
  ";
  		print "     <funcparams>$2</funcparams></paramdef>
  ";
  	    } else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
1285
  		print "   <paramdef>" . $type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1286
1287
1288
1289
1290
  		print " <parameter>$parameter</parameter></paramdef>
  ";
  	    }
  	}
      } else {
6013d5445   Martin Waitz   [PATCH] DocBook: ...
1291
1292
  	print "  <void/>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
      }
      print "  </funcprototype></funcsynopsis>
  ";
      print "</refsynopsisdiv>
  ";
  
      # print parameters
      print "<refsect1>
   <title>Arguments</title>
  ";
      if ($#{$args{'parameterlist'}} >= 0) {
  	print " <variablelist>
  ";
  	foreach $parameter (@{$args{'parameterlist'}}) {
  	    my $parameter_name = $parameter;
  	    $parameter_name =~ s/\[.*//;
fc6d7af89   Paolo Bonzini   kernel-doc: inclu...
1309
  	    $type = $args{'parametertypes'}{$parameter};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1310

fc6d7af89   Paolo Bonzini   kernel-doc: inclu...
1311
1312
1313
  	    print "  <varlistentry>
     <term><parameter>$type $parameter</parameter></term>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
  	    print "   <listitem>
      <para>
  ";
  	    $lineprefix="     ";
  	    output_highlight($args{'parameterdescs'}{$parameter_name});
  	    print "    </para>
     </listitem>
    </varlistentry>
  ";
  	}
  	print " </variablelist>
  ";
      } else {
  	print " <para>
    None
   </para>
  ";
      }
      print "</refsect1>
  ";
  
      output_section_xml(@_);
      print "</refentry>
  
  ";
  }
  
  # output struct in XML DocBook
  sub output_struct_xml(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $id;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1346
      $id = "API-struct-" . $args{'struct'};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347
      $id =~ s/[^A-Za-z0-9]/-/g;
5449bc941   Pavel Pisa   [PATCH] DocBook/H...
1348
1349
      print "<refentry id=\"$id\">
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
      print "<refentryinfo>
  ";
      print " <title>LINUX</title>
  ";
      print " <productname>Kernel Hackers Manual</productname>
  ";
      print " <date>$man_date</date>
  ";
      print "</refentryinfo>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1360
1361
      print "<refmeta>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1362
1363
      print " <refentrytitle><phrase>" . $args{'type'} . " " . $args{'struct'} . "</phrase></refentrytitle>
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1364
1365
      print " <manvolnum>9</manvolnum>
  ";
0366299bd   Borislav Petkov   kernel-doc: small...
1366
1367
      print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1368
1369
1370
1371
      print "</refmeta>
  ";
      print "<refnamediv>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1372
1373
      print " <refname>" . $args{'type'} . " " . $args{'struct'} . "</refname>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
      print " <refpurpose>
  ";
      print "  ";
      output_highlight ($args{'purpose'});
      print " </refpurpose>
  ";
      print "</refnamediv>
  ";
  
      print "<refsynopsisdiv>
  ";
      print " <title>Synopsis</title>
  ";
      print "  <programlisting>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1389
1390
      print $args{'type'} . " " . $args{'struct'} . " {
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1391
1392
      foreach $parameter (@{$args{'parameterlist'}}) {
  	if ($parameter =~ /^#/) {
2b35f4d9c   Randy Dunlap   kernel-doc: escap...
1393
1394
1395
1396
1397
1398
  	    my $prm = $parameter;
  	    # convert data read & converted thru xml_escape() into &xyz; format:
  	    # This allows us to have #define macros interspersed in a struct.
  	    $prm =~ s/\\\\\\/\&/g;
  	    print "$prm
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1399
1400
1401
1402
1403
1404
1405
  	    next;
  	}
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
  
  	defined($args{'parameterdescs'}{$parameter_name}) || next;
3c308798a   Randy Dunlap   scripts: kernel-d...
1406
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1407
1408
1409
1410
1411
1412
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
  	    print "  $1 $parameter) ($2);
  ";
  	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
51f5a0c8f   Randy Dunlap   kernel-doc: strip...
1413
  	    # bitfield
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1414
1415
1416
  	    print "  $1 $parameter$2;
  ";
  	} else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
1417
1418
  	    print "  " . $type . " " . $parameter . ";
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
  	}
      }
      print "};";
      print "  </programlisting>
  ";
      print "</refsynopsisdiv>
  ";
  
      print " <refsect1>
  ";
      print "  <title>Members</title>
  ";
39f00c087   Randy Dunlap   kernel-doc: allow...
1431
      if ($#{$args{'parameterlist'}} >= 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
      print "  <variablelist>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
        ($parameter =~ /^#/) && next;
  
        my $parameter_name = $parameter;
        $parameter_name =~ s/\[.*//;
  
        defined($args{'parameterdescs'}{$parameter_name}) || next;
        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
fc6d7af89   Paolo Bonzini   kernel-doc: inclu...
1442
        $type = $args{'parametertypes'}{$parameter};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443
        print "    <varlistentry>";
fc6d7af89   Paolo Bonzini   kernel-doc: inclu...
1444
1445
        print "      <term><literal>$type $parameter</literal></term>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
        print "      <listitem><para>
  ";
        output_highlight($args{'parameterdescs'}{$parameter_name});
        print "      </para></listitem>
  ";
        print "    </varlistentry>
  ";
      }
      print "  </variablelist>
  ";
39f00c087   Randy Dunlap   kernel-doc: allow...
1456
1457
1458
1459
1460
1461
      } else {
  	print " <para>
    None
   </para>
  ";
      }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
      print " </refsect1>
  ";
  
      output_section_xml(@_);
  
      print "</refentry>
  
  ";
  }
  
  # output enum in XML DocBook
  sub output_enum_xml(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
      my $id;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1478
      $id = "API-enum-" . $args{'enum'};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1479
      $id =~ s/[^A-Za-z0-9]/-/g;
5449bc941   Pavel Pisa   [PATCH] DocBook/H...
1480
1481
      print "<refentry id=\"$id\">
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
      print "<refentryinfo>
  ";
      print " <title>LINUX</title>
  ";
      print " <productname>Kernel Hackers Manual</productname>
  ";
      print " <date>$man_date</date>
  ";
      print "</refentryinfo>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1492
1493
      print "<refmeta>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1494
1495
      print " <refentrytitle><phrase>enum " . $args{'enum'} . "</phrase></refentrytitle>
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1496
1497
      print " <manvolnum>9</manvolnum>
  ";
0366299bd   Borislav Petkov   kernel-doc: small...
1498
1499
      print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1500
1501
1502
1503
      print "</refmeta>
  ";
      print "<refnamediv>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1504
1505
      print " <refname>enum " . $args{'enum'} . "</refname>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
      print " <refpurpose>
  ";
      print "  ";
      output_highlight ($args{'purpose'});
      print " </refpurpose>
  ";
      print "</refnamediv>
  ";
  
      print "<refsynopsisdiv>
  ";
      print " <title>Synopsis</title>
  ";
      print "  <programlisting>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1521
1522
      print "enum " . $args{'enum'} . " {
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1523
1524
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
3c308798a   Randy Dunlap   scripts: kernel-d...
1525
1526
  	print "  $parameter";
  	if ($count != $#{$args{'parameterlist'}}) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1527
1528
  	    $count++;
  	    print ",";
3c308798a   Randy Dunlap   scripts: kernel-d...
1529
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
  	print "
  ";
      }
      print "};";
      print "  </programlisting>
  ";
      print "</refsynopsisdiv>
  ";
  
      print "<refsect1>
  ";
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
1541
1542
      print " <title>Constants</title>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
      print "  <variablelist>
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
        my $parameter_name = $parameter;
        $parameter_name =~ s/\[.*//;
  
        print "    <varlistentry>";
        print "      <term>$parameter</term>
  ";
        print "      <listitem><para>
  ";
        output_highlight($args{'parameterdescs'}{$parameter_name});
        print "      </para></listitem>
  ";
        print "    </varlistentry>
  ";
      }
      print "  </variablelist>
  ";
      print "</refsect1>
  ";
  
      output_section_xml(@_);
  
      print "</refentry>
  
  ";
  }
  
  # output typedef in XML DocBook
  sub output_typedef_xml(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $id;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1577
      $id = "API-typedef-" . $args{'typedef'};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1578
      $id =~ s/[^A-Za-z0-9]/-/g;
5449bc941   Pavel Pisa   [PATCH] DocBook/H...
1579
1580
      print "<refentry id=\"$id\">
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
      print "<refentryinfo>
  ";
      print " <title>LINUX</title>
  ";
      print " <productname>Kernel Hackers Manual</productname>
  ";
      print " <date>$man_date</date>
  ";
      print "</refentryinfo>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1591
1592
      print "<refmeta>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1593
1594
      print " <refentrytitle><phrase>typedef " . $args{'typedef'} . "</phrase></refentrytitle>
  ";
8b0c2d989   Martin Waitz   [PATCH] DocBook: ...
1595
1596
      print " <manvolnum>9</manvolnum>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1597
1598
1599
1600
      print "</refmeta>
  ";
      print "<refnamediv>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1601
1602
      print " <refname>typedef " . $args{'typedef'} . "</refname>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
      print " <refpurpose>
  ";
      print "  ";
      output_highlight ($args{'purpose'});
      print " </refpurpose>
  ";
      print "</refnamediv>
  ";
  
      print "<refsynopsisdiv>
  ";
      print " <title>Synopsis</title>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1616
1617
      print "  <synopsis>typedef " . $args{'typedef'} . ";</synopsis>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
      print "</refsynopsisdiv>
  ";
  
      output_section_xml(@_);
  
      print "</refentry>
  
  ";
  }
  
  # output in XML DocBook
b112e0f73   Johannes Berg   kernel-doc: singl...
1629
  sub output_blockhead_xml(%) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
  
      my $id = $args{'module'};
      $id =~ s/[^A-Za-z0-9]/-/g;
  
      # print out each section
      $lineprefix="   ";
      foreach $section (@{$args{'sectionlist'}}) {
b112e0f73   Johannes Berg   kernel-doc: singl...
1640
1641
1642
1643
1644
  	if (!$args{'content-only'}) {
  		print "<refsect1>
   <title>$section</title>
  ";
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1645
1646
1647
  	if ($section =~ m/EXAMPLE/i) {
  	    print "<example><para>
  ";
e314ba313   Daniel Santos   kernel-doc: bugfi...
1648
  	    $output_preformatted = 1;
b112e0f73   Johannes Berg   kernel-doc: singl...
1649
1650
1651
  	} else {
  	    print "<para>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1652
1653
  	}
  	output_highlight($args{'sections'}{$section});
e314ba313   Daniel Santos   kernel-doc: bugfi...
1654
  	$output_preformatted = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1655
1656
1657
  	if ($section =~ m/EXAMPLE/i) {
  	    print "</para></example>
  ";
b112e0f73   Johannes Berg   kernel-doc: singl...
1658
1659
1660
1661
1662
1663
1664
  	} else {
  	    print "</para>";
  	}
  	if (!$args{'content-only'}) {
  		print "
  </refsect1>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1665
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
      }
  
      print "
  
  ";
  }
  
  # output in XML DocBook
  sub output_function_gnome {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
      my $id;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1679
      $id = $args{'module'} . "-" . $args{'function'};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1680
1681
1682
1683
      $id =~ s/[^A-Za-z0-9]/-/g;
  
      print "<sect2>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1684
1685
      print " <title id=\"$id\">" . $args{'function'} . "</title>
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1686
1687
1688
  
      print "  <funcsynopsis>
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1689
1690
      print "   <funcdef>" . $args{'functiontype'} . " ";
      print "<function>" . $args{'function'} . " ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
      print "</function></funcdef>
  ";
  
      $count = 0;
      if ($#{$args{'parameterlist'}} >= 0) {
  	foreach $parameter (@{$args{'parameterlist'}}) {
  	    $type = $args{'parametertypes'}{$parameter};
  	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  		# pointer-to-function
  		print "   <paramdef>$1 <parameter>$parameter</parameter>)
  ";
  		print "     <funcparams>$2</funcparams></paramdef>
  ";
  	    } else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
1705
  		print "   <paramdef>" . $type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
  		print " <parameter>$parameter</parameter></paramdef>
  ";
  	    }
  	}
      } else {
  	print "  <void>
  ";
      }
      print "  </funcsynopsis>
  ";
      if ($#{$args{'parameterlist'}} >= 0) {
  	print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">
  ";
  	print "<tgroup cols=\"2\">
  ";
  	print "<colspec colwidth=\"2*\">
  ";
  	print "<colspec colwidth=\"8*\">
  ";
  	print "<tbody>
  ";
  	foreach $parameter (@{$args{'parameterlist'}}) {
  	    my $parameter_name = $parameter;
  	    $parameter_name =~ s/\[.*//;
  
  	    print "  <row><entry align=\"right\"><parameter>$parameter</parameter></entry>
  ";
  	    print "   <entry>
  ";
  	    $lineprefix="     ";
  	    output_highlight($args{'parameterdescs'}{$parameter_name});
  	    print "    </entry></row>
  ";
  	}
  	print " </tbody></tgroup></informaltable>
  ";
      } else {
  	print " <para>
    None
   </para>
  ";
      }
  
      # print out each section
      $lineprefix="   ";
      foreach $section (@{$args{'sectionlist'}}) {
  	print "<simplesect>
   <title>$section</title>
  ";
  	if ($section =~ m/EXAMPLE/i) {
  	    print "<example><programlisting>
  ";
e314ba313   Daniel Santos   kernel-doc: bugfi...
1758
  	    $output_preformatted = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1759
1760
1761
1762
1763
  	} else {
  	}
  	print "<para>
  ";
  	output_highlight($args{'sections'}{$section});
e314ba313   Daniel Santos   kernel-doc: bugfi...
1764
  	$output_preformatted = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
  	print "</para>
  ";
  	if ($section =~ m/EXAMPLE/i) {
  	    print "</programlisting></example>
  ";
  	} else {
  	}
  	print " </simplesect>
  ";
      }
  
      print "</sect2>
  
  ";
  }
  
  ##
  # output function in man
  sub output_function_man(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
  
      print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX
  ";
  
      print ".SH NAME
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1793
1794
      print $args{'function'} . " \\- " . $args{'purpose'} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1795
1796
1797
  
      print ".SH SYNOPSIS
  ";
a21217daa   Randy Dunlap   [PATCH] kernel-do...
1798
      if ($args{'functiontype'} ne "") {
b9d97328e   Randy Dunlap   kernel-doc: clean...
1799
1800
  	print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} . "
  ";
a21217daa   Randy Dunlap   [PATCH] kernel-do...
1801
      } else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
1802
1803
  	print ".B \"" . $args{'function'} . "
  ";
a21217daa   Randy Dunlap   [PATCH] kernel-do...
1804
      }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
      $count = 0;
      my $parenth = "(";
      my $post = ",";
      foreach my $parameter (@{$args{'parameterlist'}}) {
  	if ($count == $#{$args{'parameterlist'}}) {
  	    $post = ");";
  	}
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
b9d97328e   Randy Dunlap   kernel-doc: clean...
1815
1816
  	    print ".BI \"" . $parenth . $1 . "\" " . $parameter . " \") (" . $2 . ")" . $post . "\"
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1817
1818
  	} else {
  	    $type =~ s/([^\*])$/$1 /;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1819
1820
  	    print ".BI \"" . $parenth . $type . "\" " . $parameter . " \"" . $post . "\"
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
  	}
  	$count++;
  	$parenth = "";
      }
  
      print ".SH ARGUMENTS
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1831
1832
  	print ".IP \"" . $parameter . "\" 12
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
  	output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      foreach $section (@{$args{'sectionlist'}}) {
  	print ".SH \"", uc $section, "\"
  ";
  	output_highlight($args{'sections'}{$section});
      }
  }
  
  ##
  # output enum in man
  sub output_enum_man(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
  
      print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX
  ";
  
      print ".SH NAME
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1854
1855
      print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1856
1857
1858
  
      print ".SH SYNOPSIS
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1859
1860
      print "enum " . $args{'enum'} . " {
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1861
1862
      $count = 0;
      foreach my $parameter (@{$args{'parameterlist'}}) {
3c308798a   Randy Dunlap   scripts: kernel-d...
1863
1864
1865
  	print ".br
  .BI \"    $parameter\"
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
  	if ($count == $#{$args{'parameterlist'}}) {
  	    print "
  };
  ";
  	    last;
  	}
  	else {
  	    print ", 
  .br
  ";
  	}
  	$count++;
      }
  
      print ".SH Constants
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1885
1886
  	print ".IP \"" . $parameter . "\" 12
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
  	output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      foreach $section (@{$args{'sectionlist'}}) {
  	print ".SH \"$section\"
  ";
  	output_highlight($args{'sections'}{$section});
      }
  }
  
  ##
  # output struct in man
  sub output_struct_man(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
b9d97328e   Randy Dunlap   kernel-doc: clean...
1901
1902
      print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'struct'} . "\" \"$man_date\" \"API Manual\" LINUX
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1903
1904
1905
  
      print ".SH NAME
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1906
1907
      print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose'} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1908
1909
1910
  
      print ".SH SYNOPSIS
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1911
1912
1913
      print $args{'type'} . " " . $args{'struct'} . " {
  .br
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
  
      foreach my $parameter (@{$args{'parameterlist'}}) {
  	if ($parameter =~ /^#/) {
  	    print ".BI \"$parameter\"
  .br
  ";
  	    next;
  	}
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
3c308798a   Randy Dunlap   scripts: kernel-d...
1924
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1925
1926
1927
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
b9d97328e   Randy Dunlap   kernel-doc: clean...
1928
1929
1930
  	    print ".BI \"    " . $1 . "\" " . $parameter . " \") (" . $2 . ")" . "\"
  ;
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1931
  	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
1d7e1d451   Randy.Dunlap   [PATCH] kernel-do...
1932
  	    # bitfield
b9d97328e   Randy Dunlap   kernel-doc: clean...
1933
1934
1935
  	    print ".BI \"    " . $1 . "\ \" " . $parameter . $2 . " \"" . "\"
  ;
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1936
1937
  	} else {
  	    $type =~ s/([^\*])$/$1 /;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1938
1939
1940
  	    print ".BI \"    " . $type . "\" " . $parameter . " \"" . "\"
  ;
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1941
1942
1943
1944
1945
1946
1947
1948
  	}
  	print "
  .br
  ";
      }
      print "};
  .br
  ";
c51d3dac3   Randy Dunlap   [PATCH] kernel-do...
1949
1950
      print ".SH Members
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1951
1952
1953
1954
1955
      foreach $parameter (@{$args{'parameterlist'}}) {
  	($parameter =~ /^#/) && next;
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
3c308798a   Randy Dunlap   scripts: kernel-d...
1956
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
b9d97328e   Randy Dunlap   kernel-doc: clean...
1957
1958
  	print ".IP \"" . $parameter . "\" 12
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
  	output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      foreach $section (@{$args{'sectionlist'}}) {
  	print ".SH \"$section\"
  ";
  	output_highlight($args{'sections'}{$section});
      }
  }
  
  ##
  # output typedef in man
  sub output_typedef_man(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
  
      print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX
  ";
  
      print ".SH NAME
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
1979
1980
      print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1981
1982
1983
1984
1985
1986
1987
  
      foreach $section (@{$args{'sectionlist'}}) {
  	print ".SH \"$section\"
  ";
  	output_highlight($args{'sections'}{$section});
      }
  }
b112e0f73   Johannes Berg   kernel-doc: singl...
1988
  sub output_blockhead_man(%) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
      my %args = %{$_[0]};
      my ($parameter, $section);
      my $count;
  
      print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX
  ";
  
      foreach $section (@{$args{'sectionlist'}}) {
  	print ".SH \"$section\"
  ";
  	output_highlight($args{'sections'}{$section});
      }
  }
  
  ##
  # output in text
  sub output_function_text(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
a21217daa   Randy Dunlap   [PATCH] kernel-do...
2008
      my $start;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2009

f47634b27   Randy Dunlap   [PATCH] kernel-do...
2010
2011
2012
      print "Name:
  
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
2013
2014
      print $args{'function'} . " - " . $args{'purpose'} . "
  ";
f47634b27   Randy Dunlap   [PATCH] kernel-do...
2015
2016
2017
2018
2019
  
      print "
  Synopsis:
  
  ";
a21217daa   Randy Dunlap   [PATCH] kernel-do...
2020
      if ($args{'functiontype'} ne "") {
b9d97328e   Randy Dunlap   kernel-doc: clean...
2021
  	$start = $args{'functiontype'} . " " . $args{'function'} . " (";
a21217daa   Randy Dunlap   [PATCH] kernel-do...
2022
      } else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
2023
  	$start = $args{'function'} . " (";
a21217daa   Randy Dunlap   [PATCH] kernel-do...
2024
      }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2025
      print $start;
a21217daa   Randy Dunlap   [PATCH] kernel-do...
2026

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2027
2028
2029
2030
2031
      my $count = 0;
      foreach my $parameter (@{$args{'parameterlist'}}) {
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
b9d97328e   Randy Dunlap   kernel-doc: clean...
2032
  	    print $1 . $parameter . ") (" . $2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2033
  	} else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
2034
  	    print $type . " " . $parameter;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
  	}
  	if ($count != $#{$args{'parameterlist'}}) {
  	    $count++;
  	    print ",
  ";
  	    print " " x length($start);
  	} else {
  	    print ");
  
  ";
  	}
      }
  
      print "Arguments:
  
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
b9d97328e   Randy Dunlap   kernel-doc: clean...
2054
2055
2056
  	print $parameter . "
  \t" . $args{'parameterdescs'}{$parameter_name} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
      }
      output_section_text(@_);
  }
  
  #output sections in text
  sub output_section_text(%) {
      my %args = %{$_[0]};
      my $section;
  
      print "
  ";
      foreach $section (@{$args{'sectionlist'}}) {
  	print "$section:
  
  ";
  	output_highlight($args{'sections'}{$section});
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
2073
      }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
      print "
  
  ";
  }
  
  # output enum in text
  sub output_enum_text(%) {
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
      print "Enum:
  
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
2087
2088
2089
2090
2091
      print "enum " . $args{'enum'} . " - " . $args{'purpose'} . "
  
  ";
      print "enum " . $args{'enum'} . " {
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2092
2093
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
3c308798a   Randy Dunlap   scripts: kernel-d...
2094
  	print "\t$parameter";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
  	if ($count != $#{$args{'parameterlist'}}) {
  	    $count++;
  	    print ",";
  	}
  	print "
  ";
      }
      print "};
  
  ";
  
      print "Constants:
  
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	print "$parameter
  \t";
b9d97328e   Randy Dunlap   kernel-doc: clean...
2112
2113
  	print $args{'parameterdescs'}{$parameter} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
      }
  
      output_section_text(@_);
  }
  
  # output typedef in text
  sub output_typedef_text(%) {
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
      print "Typedef:
  
  ";
b9d97328e   Randy Dunlap   kernel-doc: clean...
2127
2128
      print "typedef " . $args{'typedef'} . " - " . $args{'purpose'} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2129
2130
2131
2132
2133
2134
2135
      output_section_text(@_);
  }
  
  # output struct as text
  sub output_struct_text(%) {
      my %args = %{$_[0]};
      my ($parameter);
b9d97328e   Randy Dunlap   kernel-doc: clean...
2136
2137
2138
2139
2140
      print $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "
  
  ";
      print $args{'type'} . " " . $args{'struct'} . " {
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2141
2142
2143
2144
2145
2146
2147
2148
2149
      foreach $parameter (@{$args{'parameterlist'}}) {
  	if ($parameter =~ /^#/) {
  	    print "$parameter
  ";
  	    next;
  	}
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
3c308798a   Randy Dunlap   scripts: kernel-d...
2150
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2151
2152
2153
2154
2155
2156
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
  	    print "\t$1 $parameter) ($2);
  ";
  	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
51f5a0c8f   Randy Dunlap   kernel-doc: strip...
2157
  	    # bitfield
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2158
2159
2160
  	    print "\t$1 $parameter$2;
  ";
  	} else {
b9d97328e   Randy Dunlap   kernel-doc: clean...
2161
2162
  	    print "\t" . $type . " " . $parameter . ";
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
  	}
      }
      print "};
  
  ";
  
      print "Members:
  
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	($parameter =~ /^#/) && next;
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
3c308798a   Randy Dunlap   scripts: kernel-d...
2177
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2178
2179
  	print "$parameter
  \t";
b9d97328e   Randy Dunlap   kernel-doc: clean...
2180
2181
  	print $args{'parameterdescs'}{$parameter_name} . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2182
2183
2184
2185
2186
      }
      print "
  ";
      output_section_text(@_);
  }
b112e0f73   Johannes Berg   kernel-doc: singl...
2187
  sub output_blockhead_text(%) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
      my %args = %{$_[0]};
      my ($parameter, $section);
  
      foreach $section (@{$args{'sectionlist'}}) {
  	print " $section:
  ";
  	print "    -> ";
  	output_highlight($args{'sections'}{$section});
      }
  }
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
  ##
  # output in restructured text
  #
  
  #
  # This could use some work; it's used to output the DOC: sections, and
  # starts by putting out the name of the doc section itself, but that tends
  # to duplicate a header already in the template file.
  #
  sub output_blockhead_rst(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
  
      foreach $section (@{$args{'sectionlist'}}) {
9e72184b5   Jani Nikula   kernel-doc/rst: d...
2212
2213
2214
2215
2216
  	if ($output_selection != OUTPUT_INCLUDE) {
  	    print "**$section**
  
  ";
  	}
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
2217
          print_lineno($section_start_lines{$section});
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
  	output_highlight_rst($args{'sections'}{$section});
  	print "
  ";
      }
  }
  
  sub output_highlight_rst {
      my $contents = join "
  ",@_;
      my $line;
  
      # undo the evil effects of xml_escape() earlier
      $contents = xml_unescape($contents);
  
      eval $dohighlight;
      die $@ if $@;
  
      foreach $line (split "
  ", $contents) {
830066a7a   Jani Nikula   kernel-doc/rst: b...
2237
2238
  	print $lineprefix . $line . "
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2239
2240
2241
2242
2243
2244
      }
  }
  
  sub output_function_rst(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
c099ff698   Jani Nikula   kernel-doc/rst: h...
2245
      my $oldprefix = $lineprefix;
82801d065   Mauro Carvalho Chehab   docs-rst: kernel-...
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
      my $start = "";
  
      if ($args{'typedef'}) {
  	print ".. c:type:: ". $args{'function'} . "
  
  ";
  	print_lineno($declaration_start_line);
  	print "   **Typedef**: ";
  	$lineprefix = "";
  	output_highlight_rst($args{'purpose'});
  	$start = "
  
  **Syntax**
  
    ``";
      } else {
  	print ".. c:function:: ";
      }
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2264
      if ($args{'functiontype'} ne "") {
82801d065   Mauro Carvalho Chehab   docs-rst: kernel-...
2265
  	$start .= $args{'functiontype'} . " " . $args{'function'} . " (";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2266
      } else {
82801d065   Mauro Carvalho Chehab   docs-rst: kernel-...
2267
  	$start .= $args{'function'} . " (";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
      }
      print $start;
  
      my $count = 0;
      foreach my $parameter (@{$args{'parameterlist'}}) {
  	if ($count ne 0) {
  	    print ", ";
  	}
  	$count++;
  	$type = $args{'parametertypes'}{$parameter};
a88b1672d   Mauro Carvalho Chehab   doc-rst: kernel-d...
2278

c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2279
2280
2281
2282
2283
2284
2285
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
  	    print $1 . $parameter . ") (" . $2;
  	} else {
  	    print $type . " " . $parameter;
  	}
      }
82801d065   Mauro Carvalho Chehab   docs-rst: kernel-...
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
      if ($args{'typedef'}) {
  	print ");``
  
  ";
      } else {
  	print ")
  
  ";
  	print_lineno($declaration_start_line);
  	$lineprefix = "   ";
  	output_highlight_rst($args{'purpose'});
  	print "
  ";
      }
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2300

ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2301
2302
2303
2304
      print "**Parameters**
  
  ";
      $lineprefix = "  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2305
2306
      foreach $parameter (@{$args{'parameterlist'}}) {
  	my $parameter_name = $parameter;
ada5f446b   Gabriel Krisman Bertazi   kernel-doc: prope...
2307
  	$parameter_name =~ s/\[.*//;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2308
2309
2310
  	$type = $args{'parametertypes'}{$parameter};
  
  	if ($type ne "") {
ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2311
2312
  	    print "``$type $parameter``
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2313
  	} else {
ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2314
2315
  	    print "``$parameter``
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2316
  	}
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
2317
2318
  
          print_lineno($parameterdesc_start_lines{$parameter_name});
5e64fa9c4   Jani Nikula   kernel-doc/rst: f...
2319
2320
  	if (defined($args{'parameterdescs'}{$parameter_name}) &&
  	    $args{'parameterdescs'}{$parameter_name} ne $undescribed) {
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2321
  	    output_highlight_rst($args{'parameterdescs'}{$parameter_name});
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2322
  	} else {
d4b08e0cd   Jani Nikula   kernel-doc/rst: u...
2323
2324
  	    print "  *undescribed*
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2325
2326
2327
2328
  	}
  	print "
  ";
      }
c099ff698   Jani Nikula   kernel-doc/rst: h...
2329
2330
  
      $lineprefix = $oldprefix;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2331
2332
2333
2334
2335
2336
2337
      output_section_rst(@_);
  }
  
  sub output_section_rst(%) {
      my %args = %{$_[0]};
      my $section;
      my $oldprefix = $lineprefix;
ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2338
      $lineprefix = "";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2339
2340
  
      foreach $section (@{$args{'sectionlist'}}) {
ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2341
2342
2343
  	print "**$section**
  
  ";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
2344
          print_lineno($section_start_lines{$section});
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
  	output_highlight_rst($args{'sections'}{$section});
  	print "
  ";
      }
      print "
  ";
      $lineprefix = $oldprefix;
  }
  
  sub output_enum_rst(%) {
      my %args = %{$_[0]};
      my ($parameter);
c099ff698   Jani Nikula   kernel-doc/rst: h...
2357
      my $oldprefix = $lineprefix;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2358
      my $count;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2359
      my $name = "enum " . $args{'enum'};
628509765   Jani Nikula   kernel-doc: use r...
2360
2361
2362
2363
2364
2365
  
      print "
  
  .. c:type:: " . $name . "
  
  ";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
2366
      print_lineno($declaration_start_line);
c099ff698   Jani Nikula   kernel-doc/rst: h...
2367
2368
2369
2370
      $lineprefix = "   ";
      output_highlight_rst($args{'purpose'});
      print "
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2371

ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2372
2373
2374
2375
      print "**Constants**
  
  ";
      $lineprefix = "  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2376
      foreach $parameter (@{$args{'parameterlist'}}) {
ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2377
2378
  	print "``$parameter``
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2379
2380
2381
  	if ($args{'parameterdescs'}{$parameter} ne $undescribed) {
  	    output_highlight_rst($args{'parameterdescs'}{$parameter});
  	} else {
d4b08e0cd   Jani Nikula   kernel-doc/rst: u...
2382
2383
  	    print "  *undescribed*
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2384
2385
2386
2387
  	}
  	print "
  ";
      }
c099ff698   Jani Nikula   kernel-doc/rst: h...
2388

c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2389
2390
2391
2392
2393
2394
2395
      $lineprefix = $oldprefix;
      output_section_rst(@_);
  }
  
  sub output_typedef_rst(%) {
      my %args = %{$_[0]};
      my ($parameter);
c099ff698   Jani Nikula   kernel-doc/rst: h...
2396
      my $oldprefix = $lineprefix;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2397
      my $name = "typedef " . $args{'typedef'};
628509765   Jani Nikula   kernel-doc: use r...
2398
2399
2400
2401
2402
      print "
  
  .. c:type:: " . $name . "
  
  ";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
2403
      print_lineno($declaration_start_line);
c099ff698   Jani Nikula   kernel-doc/rst: h...
2404
2405
2406
2407
      $lineprefix = "   ";
      output_highlight_rst($args{'purpose'});
      print "
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2408

c099ff698   Jani Nikula   kernel-doc/rst: h...
2409
      $lineprefix = $oldprefix;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2410
2411
2412
2413
2414
2415
      output_section_rst(@_);
  }
  
  sub output_struct_rst(%) {
      my %args = %{$_[0]};
      my ($parameter);
c099ff698   Jani Nikula   kernel-doc/rst: h...
2416
      my $oldprefix = $lineprefix;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2417
      my $name = $args{'type'} . " " . $args{'struct'};
628509765   Jani Nikula   kernel-doc: use r...
2418
2419
2420
2421
2422
      print "
  
  .. c:type:: " . $name . "
  
  ";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
2423
      print_lineno($declaration_start_line);
c099ff698   Jani Nikula   kernel-doc/rst: h...
2424
2425
2426
2427
      $lineprefix = "   ";
      output_highlight_rst($args{'purpose'});
      print "
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2428

ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2429
2430
2431
2432
2433
2434
      print "**Definition**
  
  ";
      print "::
  
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2435
2436
2437
2438
      print "  " . $args{'type'} . " " . $args{'struct'} . " {
  ";
      foreach $parameter (@{$args{'parameterlist'}}) {
  	if ($parameter =~ /^#/) {
ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2439
2440
  	    print "  " . "$parameter
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
  	    next;
  	}
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
  
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
  	$type = $args{'parametertypes'}{$parameter};
  	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
  	    # pointer-to-function
  	    print "    $1 $parameter) ($2);
  ";
  	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
  	    # bitfield
  	    print "    $1 $parameter$2;
  ";
  	} else {
  	    print "    " . $type . " " . $parameter . ";
  ";
  	}
      }
      print "  };
  
  ";
ecbcfba12   Jani Nikula   kernel-doc/rst: c...
2465
2466
2467
2468
      print "**Members**
  
  ";
      $lineprefix = "  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2469
2470
2471
2472
2473
2474
2475
2476
      foreach $parameter (@{$args{'parameterlist'}}) {
  	($parameter =~ /^#/) && next;
  
  	my $parameter_name = $parameter;
  	$parameter_name =~ s/\[.*//;
  
  	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
  	$type = $args{'parametertypes'}{$parameter};
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
2477
          print_lineno($parameterdesc_start_lines{$parameter_name});
6d232c801   Mauro Carvalho Chehab   docs-rst: kernel-...
2478
2479
  	print "``" . $parameter . "``
  ";
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2480
  	output_highlight_rst($args{'parameterdescs'}{$parameter_name});
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2481
2482
2483
2484
2485
  	print "
  ";
      }
      print "
  ";
c099ff698   Jani Nikula   kernel-doc/rst: h...
2486
2487
  
      $lineprefix = $oldprefix;
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
2488
2489
      output_section_rst(@_);
  }
eda603f6c   Johannes Berg   docbook: warn on ...
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
  ## list mode output functions
  
  sub output_function_list(%) {
      my %args = %{$_[0]};
  
      print $args{'function'} . "
  ";
  }
  
  # output enum in list
  sub output_enum_list(%) {
      my %args = %{$_[0]};
      print $args{'enum'} . "
  ";
  }
  
  # output typedef in list
  sub output_typedef_list(%) {
      my %args = %{$_[0]};
      print $args{'typedef'} . "
  ";
  }
  
  # output struct as list
  sub output_struct_list(%) {
      my %args = %{$_[0]};
  
      print $args{'struct'} . "
  ";
  }
  
  sub output_blockhead_list(%) {
      my %args = %{$_[0]};
      my ($parameter, $section);
  
      foreach $section (@{$args{'sectionlist'}}) {
  	print "DOC: $section
  ";
      }
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2530
  ##
272057447   Randy Dunlap   [PATCH] kernel-do...
2531
2532
2533
  # generic output function for all types (function, struct/union, typedef, enum);
  # calls the generated, variable output_ function name based on
  # functype and output_mode
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2534
2535
2536
2537
2538
  sub output_declaration {
      no strict 'refs';
      my $name = shift;
      my $functype = shift;
      my $func = "output_${functype}_$output_mode";
b6c3f456c   Jani Nikula   kernel-doc: add n...
2539
2540
2541
2542
2543
2544
2545
      if (($output_selection == OUTPUT_ALL) ||
  	(($output_selection == OUTPUT_INCLUDE ||
  	  $output_selection == OUTPUT_EXPORTED) &&
  	 defined($function_table{$name})) ||
  	(($output_selection == OUTPUT_EXCLUDE ||
  	  $output_selection == OUTPUT_INTERNAL) &&
  	 !($functype eq "function" && defined($function_table{$name}))))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2546
      {
3c308798a   Randy Dunlap   scripts: kernel-d...
2547
  	&$func(@_);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2548
2549
2550
2551
2552
  	$section_counter++;
      }
  }
  
  ##
272057447   Randy Dunlap   [PATCH] kernel-do...
2553
  # generic output function - calls the right one based on current output mode.
b112e0f73   Johannes Berg   kernel-doc: singl...
2554
  sub output_blockhead {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2555
      no strict 'refs';
b9d97328e   Randy Dunlap   kernel-doc: clean...
2556
      my $func = "output_blockhead_" . $output_mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2557
2558
2559
2560
2561
      &$func(@_);
      $section_counter++;
  }
  
  ##
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
2562
  # takes a declaration (struct, union, enum, typedef) and
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2563
2564
2565
2566
  # invokes the right handler. NOT called for functions.
  sub dump_declaration($$) {
      no strict 'refs';
      my ($prototype, $file) = @_;
b9d97328e   Randy Dunlap   kernel-doc: clean...
2567
      my $func = "dump_" . $decl_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
      &$func(@_);
  }
  
  sub dump_union($$) {
      dump_struct(@_);
  }
  
  sub dump_struct($$) {
      my $x = shift;
      my $file = shift;
a1d94aa55   Randy Dunlap   kernel-doc: check...
2578
      my $nested;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2579

52dc5aec9   Randy Dunlap   kernel-doc: restr...
2580
2581
      if ($x =~ /(struct|union)\s+(\w+)\s*{(.*)}/) {
  	#my $decl_type = $1;
3c308798a   Randy Dunlap   scripts: kernel-d...
2582
2583
  	$declaration_name = $2;
  	my $members = $3;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2584
2585
  
  	# ignore embedded structs or unions
a1d94aa55   Randy Dunlap   kernel-doc: check...
2586
2587
  	$members =~ s/({.*})//g;
  	$nested = $1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2588

aeec46b97   Martin Waitz   [PATCH] DocBook: ...
2589
  	# ignore members marked private:
0d8c39e6c   Mauro Carvalho Chehab   DocBook: Fix kern...
2590
2591
  	$members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gosi;
  	$members =~ s/\/\*\s*private:.*//gosi;
aeec46b97   Martin Waitz   [PATCH] DocBook: ...
2592
2593
  	# strip comments:
  	$members =~ s/\/\*.*?\*\///gos;
a1d94aa55   Randy Dunlap   kernel-doc: check...
2594
  	$nested =~ s/\/\*.*?\*\///gos;
ef5da59f1   Randy Dunlap   scripts/kernel-do...
2595
  	# strip attributes
f00749296   Jonathan Corbet   kernel-doc: ignor...
2596
  	$members =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//i;
7b990789a   Johannes Berg   scripts/kernel-do...
2597
  	$members =~ s/__aligned\s*\([^;]*\)//gos;
f00749296   Jonathan Corbet   kernel-doc: ignor...
2598
  	$members =~ s/\s*CRYPTO_MINALIGN_ATTR//gos;
b22b5a9ef   Conchúr Navid   kernel-doc: Fix p...
2599
2600
  	# replace DECLARE_BITMAP
  	$members =~ s/DECLARE_BITMAP\s*\(([^,)]+), ([^,)]+)\)/unsigned long $1\[BITS_TO_LONGS($2)\]/gos;
1cb566ba5   Jakub Kicinski   scripts/kernel-do...
2601
2602
  	# replace DECLARE_HASHTABLE
  	$members =~ s/DECLARE_HASHTABLE\s*\(([^,)]+), ([^,)]+)\)/unsigned long $1\[1 << (($2) - 1)\]/gos;
aeec46b97   Martin Waitz   [PATCH] DocBook: ...
2603

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2604
  	create_parameterlist($members, ';', $file);
a1d94aa55   Randy Dunlap   kernel-doc: check...
2605
  	check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
  
  	output_declaration($declaration_name,
  			   'struct',
  			   {'struct' => $declaration_name,
  			    'module' => $modulename,
  			    'parameterlist' => \@parameterlist,
  			    'parameterdescs' => \%parameterdescs,
  			    'parametertypes' => \%parametertypes,
  			    'sectionlist' => \@sectionlist,
  			    'sections' => \%sections,
  			    'purpose' => $declaration_purpose,
  			    'type' => $decl_type
  			   });
      }
      else {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2621
2622
  	print STDERR "${file}:$.: error: Cannot parse struct or union!
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2623
2624
2625
2626
2627
2628
2629
  	++$errors;
      }
  }
  
  sub dump_enum($$) {
      my $x = shift;
      my $file = shift;
aeec46b97   Martin Waitz   [PATCH] DocBook: ...
2630
      $x =~ s@/\*.*?\*/@@gos;	# strip comments.
4468e21ee   Conchúr Navid   kernel-doc: Strip...
2631
2632
      # strip #define macros inside enums
      $x =~ s@#\s*((define|ifdef)\s+|endif)[^;]*;@@gos;
b6d676db3   Randy Dunlap   mtd/nand_base: fi...
2633

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2634
      if ($x =~ /enum\s+(\w+)\s*{(.*)}/) {
3c308798a   Randy Dunlap   scripts: kernel-d...
2635
2636
  	$declaration_name = $1;
  	my $members = $2;
463a0fdc3   Markus Heiser   kernel-doc parser...
2637
  	$members =~ s/\s+$//;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2638
2639
2640
2641
2642
  
  	foreach my $arg (split ',', $members) {
  	    $arg =~ s/^\s*(\w+).*/$1/;
  	    push @parameterlist, $arg;
  	    if (!$parameterdescs{$arg}) {
3c308798a   Randy Dunlap   scripts: kernel-d...
2643
  		$parameterdescs{$arg} = $undescribed;
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2644
  		print STDERR "${file}:$.: warning: Enum value '$arg' ".
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2645
2646
2647
2648
2649
  		    "not described in enum '$declaration_name'
  ";
  	    }
  
  	}
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
2650

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
  	output_declaration($declaration_name,
  			   'enum',
  			   {'enum' => $declaration_name,
  			    'module' => $modulename,
  			    'parameterlist' => \@parameterlist,
  			    'parameterdescs' => \%parameterdescs,
  			    'sectionlist' => \@sectionlist,
  			    'sections' => \%sections,
  			    'purpose' => $declaration_purpose
  			   });
      }
      else {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2663
2664
  	print STDERR "${file}:$.: error: Cannot parse enum!
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2665
2666
2667
2668
2669
2670
2671
  	++$errors;
      }
  }
  
  sub dump_typedef($$) {
      my $x = shift;
      my $file = shift;
aeec46b97   Martin Waitz   [PATCH] DocBook: ...
2672
      $x =~ s@/\*.*?\*/@@gos;	# strip comments.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2673

837664528   Mauro Carvalho Chehab   kernel-doc: bette...
2674
      # Parse function prototypes
d37c43ce1   Mauro Carvalho Chehab   docs-rst: improve...
2675
2676
      if ($x =~ /typedef\s+(\w+)\s*\(\*\s*(\w\S+)\s*\)\s*\((.*)\);/ ||
  	$x =~ /typedef\s+(\w+)\s*(\w\S+)\s*\s*\((.*)\);/) {
837664528   Mauro Carvalho Chehab   kernel-doc: bette...
2677
2678
2679
2680
2681
2682
  	# Function typedefs
  	$return_type = $1;
  	$declaration_name = $2;
  	my $args = $3;
  
  	create_parameterlist($args, ',', $file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2683
2684
  
  	output_declaration($declaration_name,
837664528   Mauro Carvalho Chehab   kernel-doc: bette...
2685
2686
  			   'function',
  			   {'function' => $declaration_name,
82801d065   Mauro Carvalho Chehab   docs-rst: kernel-...
2687
  			    'typedef' => 1,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2688
  			    'module' => $modulename,
837664528   Mauro Carvalho Chehab   kernel-doc: bette...
2689
2690
2691
2692
  			    'functiontype' => $return_type,
  			    'parameterlist' => \@parameterlist,
  			    'parameterdescs' => \%parameterdescs,
  			    'parametertypes' => \%parametertypes,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2693
2694
2695
2696
  			    'sectionlist' => \@sectionlist,
  			    'sections' => \%sections,
  			    'purpose' => $declaration_purpose
  			   });
837664528   Mauro Carvalho Chehab   kernel-doc: bette...
2697
2698
2699
2700
2701
2702
  	return;
      }
  
      while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
  	$x =~ s/\(*.\)\s*;$/;/;
  	$x =~ s/\[*.\]\s*;$/;/;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2703
      }
837664528   Mauro Carvalho Chehab   kernel-doc: bette...
2704
2705
  
      if ($x =~ /typedef.*\s+(\w+)\s*;/) {
3a80a7663   Mauro Carvalho Chehab   kernel-doc: Add a...
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
  	$declaration_name = $1;
  
  	output_declaration($declaration_name,
  			   'typedef',
  			   {'typedef' => $declaration_name,
  			    'module' => $modulename,
  			    'sectionlist' => \@sectionlist,
  			    'sections' => \%sections,
  			    'purpose' => $declaration_purpose
  			   });
      }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2717
      else {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2718
2719
  	print STDERR "${file}:$.: error: Cannot parse typedef!
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2720
2721
2722
  	++$errors;
      }
  }
a1d94aa55   Randy Dunlap   kernel-doc: check...
2723
2724
2725
2726
2727
2728
2729
  sub save_struct_actual($) {
      my $actual = shift;
  
      # strip all spaces from the actual param so that it looks like one string item
      $actual =~ s/\s*//g;
      $struct_actual = $struct_actual . $actual . " ";
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2730
2731
2732
2733
2734
2735
  sub create_parameterlist($$$) {
      my $args = shift;
      my $splitter = shift;
      my $file = shift;
      my $type;
      my $param;
a6d3fe77d   Martin Waitz   [PATCH] DocBook: ...
2736
      # temporarily replace commas inside function pointer definition
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2737
      while ($args =~ /(\([^\),]+),/) {
3c308798a   Randy Dunlap   scripts: kernel-d...
2738
  	$args =~ s/(\([^\),]+),/$1#/g;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2739
      }
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
2740

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2741
2742
2743
      foreach my $arg (split($splitter, $args)) {
  	# strip comments
  	$arg =~ s/\/\*.*\*\///;
3c308798a   Randy Dunlap   scripts: kernel-d...
2744
2745
  	# strip leading/trailing spaces
  	$arg =~ s/^\s*//;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2746
2747
2748
2749
2750
2751
2752
2753
  	$arg =~ s/\s*$//;
  	$arg =~ s/\s+/ /;
  
  	if ($arg =~ /^#/) {
  	    # Treat preprocessor directive as a typeless variable just to fill
  	    # corresponding data structures "correctly". Catch it later in
  	    # output_* subs.
  	    push_parameter($arg, "", $file);
00d629614   Richard Kennedy   kernel-doc: fix f...
2754
  	} elsif ($arg =~ m/\(.+\)\s*\(/) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2755
2756
  	    # pointer-to-function
  	    $arg =~ tr/#/,/;
00d629614   Richard Kennedy   kernel-doc: fix f...
2757
  	    $arg =~ m/[^\(]+\(\*?\s*(\w*)\s*\)/;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2758
2759
  	    $param = $1;
  	    $type = $arg;
00d629614   Richard Kennedy   kernel-doc: fix f...
2760
  	    $type =~ s/([^\(]+\(\*?)\s*$param/$1/;
a1d94aa55   Randy Dunlap   kernel-doc: check...
2761
  	    save_struct_actual($param);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2762
  	    push_parameter($param, $type, $file);
aeec46b97   Martin Waitz   [PATCH] DocBook: ...
2763
  	} elsif ($arg) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2764
2765
2766
2767
2768
2769
2770
  	    $arg =~ s/\s*:\s*/:/g;
  	    $arg =~ s/\s*\[/\[/g;
  
  	    my @args = split('\s*,\s*', $arg);
  	    if ($args[0] =~ m/\*/) {
  		$args[0] =~ s/(\*+)\s*/ $1/;
  	    }
884f2810b   Borislav Petkov   kernel-doc: handl...
2771
2772
2773
2774
2775
2776
2777
2778
2779
  
  	    my @first_arg;
  	    if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) {
  		    shift @args;
  		    push(@first_arg, split('\s+', $1));
  		    push(@first_arg, $2);
  	    } else {
  		    @first_arg = split('\s+', shift @args);
  	    }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2780
2781
2782
2783
2784
  	    unshift(@args, pop @first_arg);
  	    $type = join " ", @first_arg;
  
  	    foreach $param (@args) {
  		if ($param =~ m/^(\*+)\s*(.*)/) {
a1d94aa55   Randy Dunlap   kernel-doc: check...
2785
  		    save_struct_actual($2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2786
2787
2788
  		    push_parameter($2, "$type $1", $file);
  		}
  		elsif ($param =~ m/(.*?):(\d+)/) {
7b97887ea   Randy Dunlap   kernel-doc: allow...
2789
  		    if ($type ne "") { # skip unnamed bit-fields
a1d94aa55   Randy Dunlap   kernel-doc: check...
2790
  			save_struct_actual($1);
7b97887ea   Randy Dunlap   kernel-doc: allow...
2791
2792
  			push_parameter($1, "$type:$2", $file)
  		    }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2793
2794
  		}
  		else {
a1d94aa55   Randy Dunlap   kernel-doc: check...
2795
  		    save_struct_actual($param);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
  		    push_parameter($param, $type, $file);
  		}
  	    }
  	}
      }
  }
  
  sub push_parameter($$$) {
  	my $param = shift;
  	my $type = shift;
  	my $file = shift;
5f8c7c98a   Randy Dunlap   kernel-doc: fix u...
2807
2808
2809
2810
2811
2812
  	if (($anon_struct_union == 1) && ($type eq "") &&
  	    ($param eq "}")) {
  		return;		# ignore the ending }; from anon. struct/union
  	}
  
  	$anon_struct_union = 0;
f9b5c5304   Mauro Carvalho Chehab   scripts/kernel-do...
2813
  	$param =~ s/[\[\)].*//;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2814

a6d3fe77d   Martin Waitz   [PATCH] DocBook: ...
2815
  	if ($type eq "" && $param =~ /\.\.\.$/)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2816
  	{
c950a1739   Silvio Fricke   kernel-doc: bette...
2817
2818
2819
2820
  	    if (!$param =~ /\w\.\.\.$/) {
  	      # handles unnamed variable parameters
  	      $param = "...";
  	    }
ced69090c   Randy Dunlap   kernel-doc: handl...
2821
2822
2823
  	    if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq "") {
  		$parameterdescs{$param} = "variable arguments";
  	    }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2824
2825
2826
  	}
  	elsif ($type eq "" && ($param eq "" or $param eq "void"))
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2827
2828
2829
  	    $param="void";
  	    $parameterdescs{void} = "no arguments";
  	}
134fe01bf   Randy Dunlap   [PATCH] kernel-do...
2830
2831
2832
2833
  	elsif ($type eq "" && ($param eq "struct" or $param eq "union"))
  	# handle unnamed (anonymous) union or struct:
  	{
  		$type = $param;
5f8c7c98a   Randy Dunlap   kernel-doc: fix u...
2834
  		$param = "{unnamed_" . $param . "}";
134fe01bf   Randy Dunlap   [PATCH] kernel-do...
2835
2836
  		$parameterdescs{$param} = "anonymous
  ";
5f8c7c98a   Randy Dunlap   kernel-doc: fix u...
2837
  		$anon_struct_union = 1;
134fe01bf   Randy Dunlap   [PATCH] kernel-do...
2838
  	}
a6d3fe77d   Martin Waitz   [PATCH] DocBook: ...
2839
  	# warn if parameter has no description
134fe01bf   Randy Dunlap   [PATCH] kernel-do...
2840
2841
2842
  	# (but ignore ones starting with # as these are not parameters
  	# but inline preprocessor statements);
  	# also ignore unnamed structs/unions;
5f8c7c98a   Randy Dunlap   kernel-doc: fix u...
2843
  	if (!$anon_struct_union) {
f9b5c5304   Mauro Carvalho Chehab   scripts/kernel-do...
2844
  	if (!defined $parameterdescs{$param} && $param !~ /^#/) {
a6d3fe77d   Martin Waitz   [PATCH] DocBook: ...
2845

f9b5c5304   Mauro Carvalho Chehab   scripts/kernel-do...
2846
  	    $parameterdescs{$param} = $undescribed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2847
2848
  
  	    if (($type eq 'function') || ($type eq 'enum')) {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2849
  		print STDERR "${file}:$.: warning: Function parameter ".
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2850
2851
2852
2853
  		    "or member '$param' not " .
  		    "described in '$declaration_name'
  ";
  	    }
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2854
  	    print STDERR "${file}:$.: warning:" .
3c308798a   Randy Dunlap   scripts: kernel-d...
2855
2856
  			 " No description found for parameter '$param'
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2857
  	    ++$warnings;
3c308798a   Randy Dunlap   scripts: kernel-d...
2858
2859
  	}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2860

2b35f4d9c   Randy Dunlap   kernel-doc: escap...
2861
  	$param = xml_escape($param);
25985edce   Lucas De Marchi   Fix common misspe...
2862
  	# strip spaces from $param so that it is one continuous string
e34e7dbb3   Randy Dunlap   kernel-doc: fix p...
2863
2864
2865
2866
2867
2868
2869
2870
  	# on @parameterlist;
  	# this fixes a problem where check_sections() cannot find
  	# a parameter like "addr[6 + 2]" because it actually appears
  	# as "addr[6", "+", "2]" on the parameter list;
  	# but it's better to maintain the param string unchanged for output,
  	# so just weaken the string compare in check_sections() to ignore
  	# "[blah" in a parameter string;
  	###$param =~ s/\s*//g;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2871
  	push @parameterlist, $param;
02a4f4fe5   Paolo Bonzini   kernel-doc: clean...
2872
  	$type =~ s/\s\s+/ /g;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2873
2874
  	$parametertypes{$param} = $type;
  }
a1d94aa55   Randy Dunlap   kernel-doc: check...
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
  sub check_sections($$$$$$) {
  	my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck, $nested) = @_;
  	my @sects = split ' ', $sectcheck;
  	my @prms = split ' ', $prmscheck;
  	my $err;
  	my ($px, $sx);
  	my $prm_clean;		# strip trailing "[array size]" and/or beginning "*"
  
  	foreach $sx (0 .. $#sects) {
  		$err = 1;
  		foreach $px (0 .. $#prms) {
  			$prm_clean = $prms[$px];
  			$prm_clean =~ s/\[.*\]//;
1f3a66889   Johannes Berg   kernel-doc: ignor...
2888
  			$prm_clean =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//i;
e34e7dbb3   Randy Dunlap   kernel-doc: fix p...
2889
2890
2891
2892
2893
2894
2895
  			# ignore array size in a parameter string;
  			# however, the original param string may contain
  			# spaces, e.g.:  addr[6 + 2]
  			# and this appears in @prms as "addr[6" since the
  			# parameter list is split at spaces;
  			# hence just ignore "[..." for the sections check;
  			$prm_clean =~ s/\[.*//;
a1d94aa55   Randy Dunlap   kernel-doc: check...
2896
2897
2898
2899
2900
2901
2902
2903
  			##$prm_clean =~ s/^\**//;
  			if ($prm_clean eq $sects[$sx]) {
  				$err = 0;
  				last;
  			}
  		}
  		if ($err) {
  			if ($decl_type eq "function") {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2904
  				print STDERR "${file}:$.: warning: " .
a1d94aa55   Randy Dunlap   kernel-doc: check...
2905
2906
2907
2908
2909
2910
2911
  					"Excess function parameter " .
  					"'$sects[$sx]' " .
  					"description in '$decl_name'
  ";
  				++$warnings;
  			} else {
  				if ($nested !~ m/\Q$sects[$sx]\E/) {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2912
  				    print STDERR "${file}:$.: warning: " .
a1d94aa55   Randy Dunlap   kernel-doc: check...
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
  					"Excess struct/union/enum/typedef member " .
  					"'$sects[$sx]' " .
  					"description in '$decl_name'
  ";
  				    ++$warnings;
  				}
  			}
  		}
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2923
  ##
4092bac77   Yacine Belkadi   scripts/kernel-do...
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
  # Checks the section describing the return value of a function.
  sub check_return_section {
          my $file = shift;
          my $declaration_name = shift;
          my $return_type = shift;
  
          # Ignore an empty return type (It's a macro)
          # Ignore functions with a "void" return type. (But don't ignore "void *")
          if (($return_type eq "") || ($return_type =~ /void\s*\w*\s*$/)) {
                  return;
          }
  
          if (!defined($sections{$section_return}) ||
              $sections{$section_return} eq "") {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
2938
                  print STDERR "${file}:$.: warning: " .
4092bac77   Yacine Belkadi   scripts/kernel-do...
2939
2940
2941
2942
2943
2944
2945
2946
                          "No description found for return value of " .
                          "'$declaration_name'
  ";
                  ++$warnings;
          }
  }
  
  ##
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2947
2948
2949
2950
2951
2952
  # takes a function prototype and the name of the current file being
  # processed and spits out all the details stored in the global
  # arrays/hashes.
  sub dump_function($$) {
      my $prototype = shift;
      my $file = shift;
cbb4d3e65   Horia Geanta   scripts/kernel-do...
2953
      my $noret = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2954
2955
2956
  
      $prototype =~ s/^static +//;
      $prototype =~ s/^extern +//;
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
2957
      $prototype =~ s/^asmlinkage +//;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2958
2959
      $prototype =~ s/^inline +//;
      $prototype =~ s/^__inline__ +//;
32e794015   Randy Dunlap   [PATCH] kernel-do...
2960
2961
2962
      $prototype =~ s/^__inline +//;
      $prototype =~ s/^__always_inline +//;
      $prototype =~ s/^noinline +//;
74fc5c653   Randy Dunlap   kernel-doc: handl...
2963
      $prototype =~ s/__init +//;
20072205f   Randy Dunlap   scripts/kernel-do...
2964
      $prototype =~ s/__init_or_module +//;
270a00963   Randy Dunlap   scripts/kernel-do...
2965
      $prototype =~ s/__meminit +//;
70c95b00b   Randy Dunlap   scripts/kernel-do...
2966
      $prototype =~ s/__must_check +//;
0df7c0e3a   Randy Dunlap   scripts/kernel-do...
2967
      $prototype =~ s/__weak +//;
cbb4d3e65   Horia Geanta   scripts/kernel-do...
2968
      my $define = $prototype =~ s/^#\s*define\s+//; #ak added
b1aaa546b   Paolo Bonzini   kernel-doc: strip...
2969
2970
2971
2972
2973
2974
2975
      $prototype =~ s/__attribute__\s*\(\(
              (?:
                   [\w\s]++          # attribute name
                   (?:\([^)]*+\))?   # attribute arguments
                   \s*+,?            # optional comma at the end
              )+
            \)\)\s+//x;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
  
      # Yes, this truly is vile.  We are looking for:
      # 1. Return type (may be nothing if we're looking at a macro)
      # 2. Function name
      # 3. Function parameters.
      #
      # All the while we have to watch out for function pointer parameters
      # (which IIRC is what the two sections are for), C types (these
      # regexps don't even start to express all the possibilities), and
      # so on.
      #
      # If you mess with these regexps, it's a good idea to check that
      # the following functions' documentation still comes out right:
      # - parport_register_device (function pointer parameters)
      # - atomic_set (macro)
9598f91f2   Martin Waitz   [PATCH] DocBook: ...
2991
      # - pci_match_device, __copy_to_user (long return type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2992

cbb4d3e65   Horia Geanta   scripts/kernel-do...
2993
2994
2995
2996
2997
2998
2999
3000
3001
      if ($define && $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s+/) {
          # This is an object-like macro, it has no return type and no parameter
          # list.
          # Function-like macros are not allowed to have spaces between
          # declaration_name and opening parenthesis (notice the \s+).
          $return_type = $1;
          $declaration_name = $2;
          $noret = 1;
      } elsif ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3002
  	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
5a0bc578e   Matthew Wilcox   kernel-doc: Handl...
3003
  	$prototype =~ m/^(\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3004
  	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
94b3e03c8   Randy Dunlap   kernel-doc: fix f...
3005
  	$prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3006
  	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
5a0bc578e   Matthew Wilcox   kernel-doc: Handl...
3007
  	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3008
3009
  	$prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
  	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
5a0bc578e   Matthew Wilcox   kernel-doc: Handl...
3010
  	$prototype =~ m/^(\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3011
  	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
5a0bc578e   Matthew Wilcox   kernel-doc: Handl...
3012
  	$prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3013
  	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
5a0bc578e   Matthew Wilcox   kernel-doc: Handl...
3014
  	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
9598f91f2   Martin Waitz   [PATCH] DocBook: ...
3015
  	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
5a0bc578e   Matthew Wilcox   kernel-doc: Handl...
3016
3017
  	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
  	$prototype =~ m/^(\w+\s+\w+\s*\*+\s*\w+\s*\*+\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3018
3019
3020
3021
3022
3023
  	$return_type = $1;
  	$declaration_name = $2;
  	my $args = $3;
  
  	create_parameterlist($args, ',', $file);
      } else {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3024
3025
  	print STDERR "${file}:$.: warning: cannot understand function prototype: '$prototype'
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3026
3027
  	return;
      }
a1d94aa55   Randy Dunlap   kernel-doc: check...
3028
3029
  	my $prms = join " ", @parameterlist;
  	check_sections($file, $declaration_name, "function", $sectcheck, $prms, "");
4092bac77   Yacine Belkadi   scripts/kernel-do...
3030
3031
3032
3033
3034
          # This check emits a lot of warnings at the moment, because many
          # functions don't have a 'Return' doc section. So until the number
          # of warnings goes sufficiently down, the check is only performed in
          # verbose mode.
          # TODO: always perform the check.
cbb4d3e65   Horia Geanta   scripts/kernel-do...
3035
          if ($verbose && !$noret) {
4092bac77   Yacine Belkadi   scripts/kernel-do...
3036
3037
                  check_return_section($file, $declaration_name, $return_type);
          }
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
3038
      output_declaration($declaration_name,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
  		       'function',
  		       {'function' => $declaration_name,
  			'module' => $modulename,
  			'functiontype' => $return_type,
  			'parameterlist' => \@parameterlist,
  			'parameterdescs' => \%parameterdescs,
  			'parametertypes' => \%parametertypes,
  			'sectionlist' => \@sectionlist,
  			'sections' => \%sections,
  			'purpose' => $declaration_purpose
  		       });
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3051
3052
  sub reset_state {
      $function = "";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3053
3054
3055
3056
3057
      %parameterdescs = ();
      %parametertypes = ();
      @parameterlist = ();
      %sections = ();
      @sectionlist = ();
a1d94aa55   Randy Dunlap   kernel-doc: check...
3058
3059
      $sectcheck = "";
      $struct_actual = "";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3060
      $prototype = "";
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
3061

48af606ad   Jani Nikula   kernel-doc: add n...
3062
3063
      $state = STATE_NORMAL;
      $inline_doc_state = STATE_INLINE_NA;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3064
  }
56afb0f88   Jason Baron   kerneldoc, tracin...
3065
3066
3067
3068
  sub tracepoint_munge($) {
  	my $file = shift;
  	my $tracepointname = 0;
  	my $tracepointargs = 0;
3a9089fd7   Jason Baron   tracing: Add DEFI...
3069
  	if ($prototype =~ m/TRACE_EVENT\((.*?),/) {
56afb0f88   Jason Baron   kerneldoc, tracin...
3070
3071
  		$tracepointname = $1;
  	}
3a9089fd7   Jason Baron   tracing: Add DEFI...
3072
3073
3074
3075
3076
3077
3078
3079
  	if ($prototype =~ m/DEFINE_SINGLE_EVENT\((.*?),/) {
  		$tracepointname = $1;
  	}
  	if ($prototype =~ m/DEFINE_EVENT\((.*?),(.*?),/) {
  		$tracepointname = $2;
  	}
  	$tracepointname =~ s/^\s+//; #strip leading whitespace
  	if ($prototype =~ m/TP_PROTO\((.*?)\)/) {
56afb0f88   Jason Baron   kerneldoc, tracin...
3080
3081
3082
  		$tracepointargs = $1;
  	}
  	if (($tracepointname eq 0) || ($tracepointargs eq 0)) {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3083
3084
  		print STDERR "${file}:$.: warning: Unrecognized tracepoint format: 
  ".
56afb0f88   Jason Baron   kerneldoc, tracin...
3085
3086
3087
3088
3089
3090
  			     "$prototype
  ";
  	} else {
  		$prototype = "static inline void trace_$tracepointname($tracepointargs)";
  	}
  }
b4870bc5e   Randy Dunlap   kernel-doc: fix s...
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
  sub syscall_munge() {
  	my $void = 0;
  
  	$prototype =~ s@[\r
  \t]+@ @gos; # strip newlines/CR's/tabs
  ##	if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
  	if ($prototype =~ m/SYSCALL_DEFINE0/) {
  		$void = 1;
  ##		$prototype = "long sys_$1(void)";
  	}
  
  	$prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
  	if ($prototype =~ m/long (sys_.*?),/) {
  		$prototype =~ s/,/\(/;
  	} elsif ($void) {
  		$prototype =~ s/\)/\(void\)/;
  	}
  
  	# now delete all of the odd-number commas in $prototype
  	# so that arg types & arg names don't have a comma between them
  	my $count = 0;
  	my $len = length($prototype);
  	if ($void) {
  		$len = 0;	# skip the for-loop
  	}
  	for (my $ix = 0; $ix < $len; $ix++) {
  		if (substr($prototype, $ix, 1) eq ',') {
  			$count++;
  			if ($count % 2 == 1) {
  				substr($prototype, $ix, 1) = ' ';
  			}
  		}
  	}
  }
b7afa92b5   Daniel Vetter   scripts/kernel-do...
3125
  sub process_proto_function($$) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3126
3127
      my $x = shift;
      my $file = shift;
51f5a0c8f   Randy Dunlap   kernel-doc: strip...
3128
      $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
890c78c2d   Randy Dunlap   kernel-doc: allow...
3129
      if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3130
3131
3132
  	# do nothing
      }
      elsif ($x =~ /([^\{]*)/) {
3c308798a   Randy Dunlap   scripts: kernel-d...
3133
  	$prototype .= $1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3134
      }
b4870bc5e   Randy Dunlap   kernel-doc: fix s...
3135

890c78c2d   Randy Dunlap   kernel-doc: allow...
3136
      if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
3c308798a   Randy Dunlap   scripts: kernel-d...
3137
  	$prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3138
3139
3140
  	$prototype =~ s@[\r
  ]+@ @gos; # strip newlines/cr's.
  	$prototype =~ s@^\s+@@gos; # strip leading spaces
b4870bc5e   Randy Dunlap   kernel-doc: fix s...
3141
3142
3143
  	if ($prototype =~ /SYSCALL_DEFINE/) {
  		syscall_munge();
  	}
3a9089fd7   Jason Baron   tracing: Add DEFI...
3144
3145
3146
  	if ($prototype =~ /TRACE_EVENT/ || $prototype =~ /DEFINE_EVENT/ ||
  	    $prototype =~ /DEFINE_SINGLE_EVENT/)
  	{
56afb0f88   Jason Baron   kerneldoc, tracin...
3147
3148
  		tracepoint_munge($file);
  	}
b4870bc5e   Randy Dunlap   kernel-doc: fix s...
3149
  	dump_function($prototype, $file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3150
3151
3152
  	reset_state();
      }
  }
b7afa92b5   Daniel Vetter   scripts/kernel-do...
3153
  sub process_proto_type($$) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3154
3155
      my $x = shift;
      my $file = shift;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3156
3157
3158
3159
      $x =~ s@[\r
  ]+@ @gos; # strip newlines/cr's.
      $x =~ s@^\s+@@gos; # strip leading spaces
      $x =~ s@\s+$@@gos; # strip trailing spaces
51f5a0c8f   Randy Dunlap   kernel-doc: strip...
3160
      $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3161
3162
3163
3164
3165
3166
      if ($x =~ /^#/) {
  	# To distinguish preprocessor directive from regular declaration later.
  	$x .= ";";
      }
  
      while (1) {
3c308798a   Randy Dunlap   scripts: kernel-d...
3167
  	if ( $x =~ /([^{};]*)([{};])(.*)/ ) {
463a0fdc3   Markus Heiser   kernel-doc parser...
3168
3169
3170
              if( length $prototype ) {
                  $prototype .= " "
              }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3171
3172
3173
3174
  	    $prototype .= $1 . $2;
  	    ($2 eq '{') && $brcount++;
  	    ($2 eq '}') && $brcount--;
  	    if (($2 eq ';') && ($brcount == 0)) {
b9d97328e   Randy Dunlap   kernel-doc: clean...
3175
  		dump_declaration($prototype, $file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3176
  		reset_state();
3c308798a   Randy Dunlap   scripts: kernel-d...
3177
  		last;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3178
3179
  	    }
  	    $x = $3;
3c308798a   Randy Dunlap   scripts: kernel-d...
3180
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3181
3182
3183
3184
3185
  	    $prototype .= $x;
  	    last;
  	}
      }
  }
6b5b55f6c   Randy Dunlap   kernel-doc: fix d...
3186
3187
3188
3189
3190
3191
3192
  # xml_escape: replace <, >, and & in the text stream;
  #
  # however, formatting controls that are generated internally/locally in the
  # kernel-doc script are not escaped here; instead, they begin life like
  # $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings
  # are converted to their mnemonic-expected output, without the 4 * '\' & ':',
  # just before actual output; (this is done by local_unescape())
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3193
3194
  sub xml_escape($) {
  	my $text = shift;
ecfb251a9   Randy Dunlap   [PATCH] kernel-do...
3195
3196
3197
  	if (($output_mode eq "text") || ($output_mode eq "man")) {
  		return $text;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3198
3199
3200
3201
3202
  	$text =~ s/\&/\\\\\\amp;/g;
  	$text =~ s/\</\\\\\\lt;/g;
  	$text =~ s/\>/\\\\\\gt;/g;
  	return $text;
  }
c0d1b6ee7   Jonathan Corbet   kernel-doc: produ...
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
  # xml_unescape: reverse the effects of xml_escape
  sub xml_unescape($) {
  	my $text = shift;
  	if (($output_mode eq "text") || ($output_mode eq "man")) {
  		return $text;
  	}
  	$text =~ s/\\\\\\amp;/\&/g;
  	$text =~ s/\\\\\\lt;/</g;
  	$text =~ s/\\\\\\gt;/>/g;
  	return $text;
  }
6b5b55f6c   Randy Dunlap   kernel-doc: fix d...
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
  # convert local escape strings to html
  # local escape strings look like:  '\\\\menmonic:' (that's 4 backslashes)
  sub local_unescape($) {
  	my $text = shift;
  	if (($output_mode eq "text") || ($output_mode eq "man")) {
  		return $text;
  	}
  	$text =~ s/\\\\\\\\lt:/</g;
  	$text =~ s/\\\\\\\\gt:/>/g;
  	return $text;
  }
1ad560e43   Jani Nikula   kernel-doc: abstr...
3225
  sub map_filename($) {
2283a117f   Randy Dunlap   [PATCH] scripts/k...
3226
      my $file;
68f866623   Ben Hutchings   Documentation: Av...
3227
      my ($orig_file) = @_;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3228

2283a117f   Randy Dunlap   [PATCH] scripts/k...
3229
      if (defined($ENV{'SRCTREE'})) {
68f866623   Ben Hutchings   Documentation: Av...
3230
  	$file = "$ENV{'SRCTREE'}" . "/" . $orig_file;
1ad560e43   Jani Nikula   kernel-doc: abstr...
3231
      } else {
68f866623   Ben Hutchings   Documentation: Av...
3232
  	$file = $orig_file;
2283a117f   Randy Dunlap   [PATCH] scripts/k...
3233
      }
1ad560e43   Jani Nikula   kernel-doc: abstr...
3234

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3235
3236
3237
      if (defined($source_map{$file})) {
  	$file = $source_map{$file};
      }
1ad560e43   Jani Nikula   kernel-doc: abstr...
3238
3239
      return $file;
  }
88c2b57da   Jani Nikula   kernel-doc: add s...
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
  sub process_export_file($) {
      my ($orig_file) = @_;
      my $file = map_filename($orig_file);
  
      if (!open(IN,"<$file")) {
  	print STDERR "Error: Cannot open file $file
  ";
  	++$errors;
  	return;
      }
  
      while (<IN>) {
  	if (/$export_symbol/) {
  	    $function_table{$2} = 1;
  	}
      }
  
      close(IN);
  }
1ad560e43   Jani Nikula   kernel-doc: abstr...
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
  sub process_file($) {
      my $file;
      my $identifier;
      my $func;
      my $descr;
      my $in_purpose = 0;
      my $initial_section_counter = $section_counter;
      my ($orig_file) = @_;
      my $leading_space;
  
      $file = map_filename($orig_file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3270
3271
3272
3273
3274
3275
      if (!open(IN,"<$file")) {
  	print STDERR "Error: Cannot open file $file
  ";
  	++$errors;
  	return;
      }
a9e7314b7   Ilya Dryomov   kernel-doc: track...
3276
      $. = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3277
3278
      $section_counter = 0;
      while (<IN>) {
654784284   Daniel Santos   kernel-doc: bugfi...
3279
3280
3281
  	while (s/\\\s*$//) {
  	    $_ .= <IN>;
  	}
48af606ad   Jani Nikula   kernel-doc: add n...
3282
  	if ($state == STATE_NORMAL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3283
  	    if (/$doc_start/o) {
48af606ad   Jani Nikula   kernel-doc: add n...
3284
  		$state = STATE_NAME;	# next line is always the function name
850622dfa   Randy Dunlap   [PATCH] kernel-do...
3285
  		$in_doc_sect = 0;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
3286
  		$declaration_start_line = $. + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3287
  	    }
48af606ad   Jani Nikula   kernel-doc: add n...
3288
  	} elsif ($state == STATE_NAME) {# this line is the function name (always)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3289
  	    if (/$doc_block/o) {
48af606ad   Jani Nikula   kernel-doc: add n...
3290
  		$state = STATE_DOCBLOCK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3291
  		$contents = "";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
3292
                  $new_start_line = $. + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3293
3294
3295
3296
3297
  		if ( $1 eq "" ) {
  			$section = $section_intro;
  		} else {
  			$section = $1;
  		}
3c308798a   Randy Dunlap   scripts: kernel-d...
3298
  	    }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3299
3300
3301
3302
3303
  	    elsif (/$doc_decl/o) {
  		$identifier = $1;
  		if (/\s*([\w\s]+?)\s*-/) {
  		    $identifier = $1;
  		}
48af606ad   Jani Nikula   kernel-doc: add n...
3304
  		$state = STATE_FIELD;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
3305
3306
  		# if there's no @param blocks need to set up default section
  		# here
2f4ad40a0   Jani Nikula   kernel-doc: reset...
3307
3308
  		$contents = "";
  		$section = $section_default;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
3309
  		$new_start_line = $. + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3310
  		if (/-(.*)/) {
51f5a0c8f   Randy Dunlap   kernel-doc: strip...
3311
  		    # strip leading/trailing/multiple spaces
a21217daa   Randy Dunlap   [PATCH] kernel-do...
3312
3313
3314
  		    $descr= $1;
  		    $descr =~ s/^\s*//;
  		    $descr =~ s/\s*$//;
12ae67793   Daniel Santos   kernel-doc: don't...
3315
  		    $descr =~ s/\s+/ /g;
a21217daa   Randy Dunlap   [PATCH] kernel-do...
3316
  		    $declaration_purpose = xml_escape($descr);
6423133bd   Johannes Weiner   kernel-doc: allow...
3317
  		    $in_purpose = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3318
3319
3320
  		} else {
  		    $declaration_purpose = "";
  		}
77cc23b8c   Randy Dunlap   kernel-doc: warn ...
3321
3322
  
  		if (($declaration_purpose eq "") && $verbose) {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3323
3324
  			print STDERR "${file}:$.: warning: missing initial short description on line:
  ";
77cc23b8c   Randy Dunlap   kernel-doc: warn ...
3325
3326
3327
  			print STDERR $_;
  			++$warnings;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
  		if ($identifier =~ m/^struct/) {
  		    $decl_type = 'struct';
  		} elsif ($identifier =~ m/^union/) {
  		    $decl_type = 'union';
  		} elsif ($identifier =~ m/^enum/) {
  		    $decl_type = 'enum';
  		} elsif ($identifier =~ m/^typedef/) {
  		    $decl_type = 'typedef';
  		} else {
  		    $decl_type = 'function';
  		}
  
  		if ($verbose) {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3341
3342
  		    print STDERR "${file}:$.: info: Scanning doc for $identifier
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3343
3344
  		}
  	    } else {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3345
  		print STDERR "${file}:$.: warning: Cannot understand $_ on line $.",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3346
3347
3348
  		" - I thought it was a doc line
  ";
  		++$warnings;
48af606ad   Jani Nikula   kernel-doc: add n...
3349
  		$state = STATE_NORMAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3350
  	    }
48af606ad   Jani Nikula   kernel-doc: add n...
3351
  	} elsif ($state == STATE_FIELD) {	# look for head: lines, and include content
f624adef3   Jani Nikula   kernel-doc: limit...
3352
  	    if (/$doc_sect/i) { # case insensitive for supported section names
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3353
3354
  		$newsection = $1;
  		$newcontents = $2;
f624adef3   Jani Nikula   kernel-doc: limit...
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
  		# map the supported section names to the canonical names
  		if ($newsection =~ m/^description$/i) {
  		    $newsection = $section_default;
  		} elsif ($newsection =~ m/^context$/i) {
  		    $newsection = $section_context;
  		} elsif ($newsection =~ m/^returns?$/i) {
  		    $newsection = $section_return;
  		} elsif ($newsection =~ m/^\@return$/) {
  		    # special: @return is a section, not a param description
  		    $newsection = $section_return;
  		}
792aa2f2c   Randy Dunlap   kernel-doc: preve...
3366
3367
  		if (($contents ne "") && ($contents ne "
  ")) {
850622dfa   Randy Dunlap   [PATCH] kernel-do...
3368
  		    if (!$in_doc_sect && $verbose) {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3369
3370
  			print STDERR "${file}:$.: warning: contents before sections
  ";
850622dfa   Randy Dunlap   [PATCH] kernel-do...
3371
3372
  			++$warnings;
  		    }
94dc7ad55   Randy Dunlap   kernel-doc: detec...
3373
  		    dump_section($file, $section, xml_escape($contents));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3374
3375
  		    $section = $section_default;
  		}
850622dfa   Randy Dunlap   [PATCH] kernel-do...
3376
  		$in_doc_sect = 1;
6423133bd   Johannes Weiner   kernel-doc: allow...
3377
  		$in_purpose = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3378
  		$contents = $newcontents;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
3379
                  $new_start_line = $.;
0a7263014   Jani Nikula   kernel-doc: impro...
3380
3381
3382
3383
  		while ((substr($contents, 0, 1) eq " ") ||
  		       substr($contents, 0, 1) eq "\t") {
  		    $contents = substr($contents, 1);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3384
3385
3386
3387
3388
  		if ($contents ne "") {
  		    $contents .= "
  ";
  		}
  		$section = $newsection;
b7886de43   Jani Nikula   kernel-doc: strip...
3389
  		$leading_space = undef;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3390
  	    } elsif (/$doc_end/) {
4c98ecaf3   Randy Dunlap   scripts/kernel-do...
3391
3392
  		if (($contents ne "") && ($contents ne "
  ")) {
94dc7ad55   Randy Dunlap   kernel-doc: detec...
3393
  		    dump_section($file, $section, xml_escape($contents));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3394
3395
3396
  		    $section = $section_default;
  		    $contents = "";
  		}
46b958eb8   Randy Dunlap   kernel-doc: detec...
3397
3398
  		# look for doc_com + <text> + doc_end:
  		if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3399
  		    print STDERR "${file}:$.: warning: suspicious ending line: $_";
46b958eb8   Randy Dunlap   kernel-doc: detec...
3400
3401
  		    ++$warnings;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3402
3403
  
  		$prototype = "";
48af606ad   Jani Nikula   kernel-doc: add n...
3404
  		$state = STATE_PROTO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3405
  		$brcount = 0;
232acbcf5   Randy Dunlap   [PATCH] kernel-do...
3406
3407
  #		print STDERR "end of doc comment, looking for prototype
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3408
3409
3410
  	    } elsif (/$doc_content/) {
  		# miguel-style comment kludge, look for blank lines after
  		# @parameter line to signify start of description
6423133bd   Johannes Weiner   kernel-doc: allow...
3411
3412
3413
3414
3415
  		if ($1 eq "") {
  		    if ($section =~ m/^@/ || $section eq $section_context) {
  			dump_section($file, $section, xml_escape($contents));
  			$section = $section_default;
  			$contents = "";
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
3416
                          $new_start_line = $.;
6423133bd   Johannes Weiner   kernel-doc: allow...
3417
3418
3419
3420
3421
3422
3423
3424
3425
  		    } else {
  			$contents .= "
  ";
  		    }
  		    $in_purpose = 0;
  		} elsif ($in_purpose == 1) {
  		    # Continued declaration purpose
  		    chomp($declaration_purpose);
  		    $declaration_purpose .= " " . xml_escape($1);
12ae67793   Daniel Santos   kernel-doc: don't...
3426
  		    $declaration_purpose =~ s/\s+/ /g;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3427
  		} else {
b7886de43   Jani Nikula   kernel-doc: strip...
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
  		    my $cont = $1;
  		    if ($section =~ m/^@/ || $section eq $section_context) {
  			if (!defined $leading_space) {
  			    if ($cont =~ m/^(\s+)/) {
  				$leading_space = $1;
  			    } else {
  				$leading_space = "";
  			    }
  			}
  
  			$cont =~ s/^$leading_space//;
  		    }
  		    $contents .= $cont . "
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3442
3443
3444
  		}
  	    } else {
  		# i dont know - bad line?  ignore.
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3445
  		print STDERR "${file}:$.: warning: bad line: $_";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3446
3447
  		++$warnings;
  	    }
48af606ad   Jani Nikula   kernel-doc: add n...
3448
  	} elsif ($state == STATE_INLINE) { # scanning for inline parameters
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3449
  	    # First line (state 1) needs to be a @parameter
48af606ad   Jani Nikula   kernel-doc: add n...
3450
  	    if ($inline_doc_state == STATE_INLINE_NAME && /$doc_inline_sect/o) {
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3451
3452
  		$section = $1;
  		$contents = $2;
0b0f5f29b   Daniel Vetter   scripts/kernel-do...
3453
                  $new_start_line = $.;
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3454
3455
3456
3457
3458
  		if ($contents ne "") {
  		    while ((substr($contents, 0, 1) eq " ") ||
  		           substr($contents, 0, 1) eq "\t") {
  			$contents = substr($contents, 1);
  		    }
a0b96c2db   Jani Nikula   kernel-doc: fix w...
3459
3460
  		    $contents .= "
  ";
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3461
  		}
48af606ad   Jani Nikula   kernel-doc: add n...
3462
  		$inline_doc_state = STATE_INLINE_TEXT;
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3463
  	    # Documentation block end */
48af606ad   Jani Nikula   kernel-doc: add n...
3464
  	    } elsif (/$doc_inline_end/) {
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3465
3466
3467
3468
3469
3470
  		if (($contents ne "") && ($contents ne "
  ")) {
  		    dump_section($file, $section, xml_escape($contents));
  		    $section = $section_default;
  		    $contents = "";
  		}
48af606ad   Jani Nikula   kernel-doc: add n...
3471
3472
  		$state = STATE_PROTO;
  		$inline_doc_state = STATE_INLINE_NA;
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3473
3474
  	    # Regular text
  	    } elsif (/$doc_content/) {
48af606ad   Jani Nikula   kernel-doc: add n...
3475
  		if ($inline_doc_state == STATE_INLINE_TEXT) {
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3476
3477
  		    $contents .= $1 . "
  ";
6450c8957   Jani Nikula   kernel-doc: strip...
3478
3479
3480
3481
  		    # nuke leading blank lines
  		    if ($contents =~ /^\s*$/) {
  			$contents = "";
  		    }
48af606ad   Jani Nikula   kernel-doc: add n...
3482
3483
  		} elsif ($inline_doc_state == STATE_INLINE_NAME) {
  		    $inline_doc_state = STATE_INLINE_ERROR;
e7ca311e3   Daniel Vetter   kernel-doc: Fix u...
3484
  		    print STDERR "${file}:$.: warning: ";
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3485
3486
3487
3488
  		    print STDERR "Incorrect use of kernel-doc format: $_";
  		    ++$warnings;
  		}
  	    }
48af606ad   Jani Nikula   kernel-doc: add n...
3489
  	} elsif ($state == STATE_PROTO) {	# scanning for function '{' (end of prototype)
0c9aa2095   Jani Nikula   kernel-doc: add s...
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
  	    if (/$doc_inline_oneline/) {
  		$section = $1;
  		$contents = $2;
  		if ($contents ne "") {
  		    $contents .= "
  ";
  		    dump_section($file, $section, xml_escape($contents));
  		    $section = $section_default;
  		    $contents = "";
  		}
  	    } elsif (/$doc_inline_start/) {
48af606ad   Jani Nikula   kernel-doc: add n...
3501
3502
  		$state = STATE_INLINE;
  		$inline_doc_state = STATE_INLINE_NAME;
a4c6ebede   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3503
  	    } elsif ($decl_type eq 'function') {
b7afa92b5   Daniel Vetter   scripts/kernel-do...
3504
  		process_proto_function($_, $file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3505
  	    } else {
b7afa92b5   Daniel Vetter   scripts/kernel-do...
3506
  		process_proto_type($_, $file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3507
  	    }
48af606ad   Jani Nikula   kernel-doc: add n...
3508
  	} elsif ($state == STATE_DOCBLOCK) {
ebff7f929   Daniel Vetter   scripts/kernel-do...
3509
  		if (/$doc_end/)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3510
  		{
94dc7ad55   Randy Dunlap   kernel-doc: detec...
3511
  			dump_doc_section($file, $section, xml_escape($contents));
2f4ad40a0   Jani Nikula   kernel-doc: reset...
3512
  			$section = $section_default;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3513
3514
  			$contents = "";
  			$function = "";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3515
3516
3517
3518
3519
3520
  			%parameterdescs = ();
  			%parametertypes = ();
  			@parameterlist = ();
  			%sections = ();
  			@sectionlist = ();
  			$prototype = "";
48af606ad   Jani Nikula   kernel-doc: add n...
3521
  			$state = STATE_NORMAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
  		}
  		elsif (/$doc_content/)
  		{
  			if ( $1 eq "" )
  			{
  				$contents .= $blankline;
  			}
  			else
  			{
  				$contents .= $1 . "
  ";
3c3b809e2   Randy Dunlap   [PATCH] kernel-do...
3533
  			}
3c308798a   Randy Dunlap   scripts: kernel-d...
3534
3535
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3536
3537
      }
      if ($initial_section_counter == $section_counter) {
d40e1e653   Bart Van Assche   kerneldoc: Conver...
3538
3539
  	print STDERR "${file}:1: warning: no structured comments found
  ";
b6c3f456c   Jani Nikula   kernel-doc: add n...
3540
  	if (($output_selection == OUTPUT_INCLUDE) && ($show_not_found == 1)) {
e946c43a1   Johannes Berg   kernel-doc: impro...
3541
3542
3543
  	    print STDERR "    Was looking for '$_'.
  " for keys %function_table;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3544
3545
3546
3547
3548
3549
3550
3551
  	if ($output_mode eq "xml") {
  	    # The template wants at least one RefEntry here; make one.
  	    print "<refentry>
  ";
  	    print " <refnamediv>
  ";
  	    print "  <refname>
  ";
68f866623   Ben Hutchings   Documentation: Av...
3552
3553
  	    print "   ${orig_file}
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
  	    print "  </refname>
  ";
  	    print "  <refpurpose>
  ";
  	    print "   Document generation inconsistency
  ";
  	    print "  </refpurpose>
  ";
  	    print " </refnamediv>
  ";
  	    print " <refsect1>
  ";
  	    print "  <title>
  ";
  	    print "   Oops
  ";
  	    print "  </title>
  ";
  	    print "  <warning>
  ";
  	    print "   <para>
  ";
  	    print "    The template for this document tried to insert
  ";
  	    print "    the structured comment from the file
  ";
68f866623   Ben Hutchings   Documentation: Av...
3580
3581
  	    print "    <filename>${orig_file}</filename> at this point,
  ";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
  	    print "    but none was found.
  ";
  	    print "    This dummy section is inserted to allow
  ";
  	    print "    generation to continue.
  ";
  	    print "   </para>
  ";
  	    print "  </warning>
  ";
  	    print " </refsect1>
  ";
  	    print "</refentry>
  ";
  	}
      }
  }
8484baaa5   Randy Dunlap   kernel-doc: code ...
3599
3600
3601
3602
3603
3604
  
  
  $kernelversion = get_kernel_version();
  
  # generate a sequence of code that will splice in highlighting information
  # using the s// operator.
1ef062337   Mauro Carvalho Chehab   kernel-doc: Make ...
3605
  for (my $k = 0; $k < @highlights; $k++) {
4d7327019   Danilo Cesar Lemes de Paula   scripts/kernel-do...
3606
3607
3608
3609
3610
3611
      my $pattern = $highlights[$k][0];
      my $result = $highlights[$k][1];
  #   print STDERR "scanning pattern:$pattern, highlight:($result)
  ";
      $dohighlight .=  "\$contents =~ s:$pattern:$result:gs;
  ";
8484baaa5   Randy Dunlap   kernel-doc: code ...
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
  }
  
  # Read the file that maps relative names to absolute names for
  # separate source and object directories and for shadow trees.
  if (open(SOURCE_MAP, "<.tmp_filelist.txt")) {
  	my ($relname, $absname);
  	while(<SOURCE_MAP>) {
  		chop();
  		($relname, $absname) = (split())[0..1];
  		$relname =~ s:^/+::;
  		$source_map{$relname} = $absname;
  	}
  	close(SOURCE_MAP);
  }
88c2b57da   Jani Nikula   kernel-doc: add s...
3626
3627
  if ($output_selection == OUTPUT_EXPORTED ||
      $output_selection == OUTPUT_INTERNAL) {
c9b2cfb3f   Jani Nikula   kernel-doc: unify...
3628
3629
  
      push(@export_file_list, @ARGV);
88c2b57da   Jani Nikula   kernel-doc: add s...
3630
3631
3632
3633
3634
      foreach (@export_file_list) {
  	chomp;
  	process_export_file($_);
      }
  }
8484baaa5   Randy Dunlap   kernel-doc: code ...
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
  foreach (@ARGV) {
      chomp;
      process_file($_);
  }
  if ($verbose && $errors) {
    print STDERR "$errors errors
  ";
  }
  if ($verbose && $warnings) {
    print STDERR "$warnings warnings
  ";
  }
9537ff76f   Will Deacon   scripts/kernel-do...
3647
  exit($output_mode eq "none" ? 0 : $errors);