]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - Documentation/sphinx/parse-headers.pl
doc-rst: auto-generate video.h.rst
[mirror_ubuntu-bionic-kernel.git] / Documentation / sphinx / parse-headers.pl
CommitLineData
dabf8be3
MCC
1#!/usr/bin/perl
2use strict;
3use Text::Tabs;
4
5# Uncomment if debug is needed
6#use Data::Dumper;
7
8# change to 1 to generate some debug prints
9my $debug = 0;
10
11if (scalar @ARGV < 2 || scalar @ARGV > 3) {
12 die "Usage:\n\t$0 <file in> <file out> [<exceptions file>]\n";
13}
14
15my ($file_in, $file_out, $file_exceptions) = @ARGV;
16
17my $data;
18my %ioctls;
19my %defines;
20my %typedefs;
21my %enums;
22my %enum_symbols;
23my %structs;
24
25#
26# read the file and get identifiers
27#
28
29my $is_enum = 0;
30open IN, $file_in or die "Can't open $file_in";
31while (<IN>) {
9afe5112
MCC
32 my $ln = $_;
33 $ln =~ s,/\*.*\*/,,;
34
dabf8be3
MCC
35 $data .= $_;
36
9c80c745 37 if ($is_enum && $ln =~ m/^\s*([_\w][\w\d_]+)\s*[\,=]?/) {
dabf8be3
MCC
38 my $s = $1;
39 my $n = $1;
40 $n =~ tr/A-Z/a-z/;
41 $n =~ tr/_/-/;
42
43 $enum_symbols{$s} = $n;
44
45 $is_enum = 0 if ($is_enum && m/\}/);
46 next;
47 }
48 $is_enum = 0 if ($is_enum && m/\}/);
49
9c80c745 50 if ($ln =~ m/^\s*#\s*define\s+([_\w][\w\d_]+)\s+_IO/) {
dabf8be3
MCC
51 my $s = $1;
52 my $n = $1;
53 $n =~ tr/A-Z/a-z/;
54
55 $ioctls{$s} = $n;
56 next;
57 }
58
9c80c745 59 if ($ln =~ m/^\s*#\s*define\s+([_\w][\w\d_]+)\s+/) {
dabf8be3
MCC
60 my $s = $1;
61 my $n = $1;
62 $n =~ tr/A-Z/a-z/;
63 $n =~ tr/_/-/;
64
65 $defines{$s} = $n;
66 next;
67 }
68
9c80c745 69 if ($ln =~ m/^\s*typedef\s+.*\s+([_\w][\w\d_]+);/) {
dabf8be3
MCC
70 my $s = $1;
71 my $n = $1;
72 $n =~ tr/A-Z/a-z/;
73 $n =~ tr/_/-/;
74
75 $typedefs{$s} = $n;
76 next;
77 }
9c80c745 78 if ($ln =~ m/^\s*enum\s+([_\w][\w\d_]+)\s+\{/
6c4c7dad
MCC
79 || $ln =~ m/^\s*enum\s+([_\w][\w\d_]+)$/
80 || $ln =~ m/^\s*typedef\s*enum\s+([_\w][\w\d_]+)\s+\{/
81 || $ln =~ m/^\s*typedef\s*enum\s+([_\w][\w\d_]+)$/) {
dabf8be3
MCC
82 my $s = $1;
83 my $n = $1;
84 $n =~ tr/A-Z/a-z/;
85 $n =~ tr/_/-/;
86
87 $enums{$s} = $n;
88
89 $is_enum = $1;
90 next;
91 }
9c80c745 92 if ($ln =~ m/^\s*struct\s+([_\w][\w\d_]+)\s+\{/
6c4c7dad
MCC
93 || $ln =~ m/^\s*struct\s+([[_\w][\w\d_]+)$/
94 || $ln =~ m/^\s*typedef\s*struct\s+([_\w][\w\d_]+)\s+\{/
95 || $ln =~ m/^\s*typedef\s*struct\s+([[_\w][\w\d_]+)$/
96 ) {
dabf8be3
MCC
97 my $s = $1;
98 my $n = $1;
99 $n =~ tr/A-Z/a-z/;
100 $n =~ tr/_/-/;
101
102 $structs{$s} = $n;
103 next;
104 }
105}
106close IN;
107
108#
109# Handle multi-line typedefs
110#
111
4ff916a0
MCC
112my @matches = ($data =~ m/typedef\s+struct\s+\S+?\s*\{[^\}]+\}\s*(\S+)\s*\;/g,
113 $data =~ m/typedef\s+enum\s+\S+?\s*\{[^\}]+\}\s*(\S+)\s*\;/g,);
dabf8be3 114foreach my $m (@matches) {
4ff916a0
MCC
115 my $s = $m;
116 my $n = $m;
dabf8be3
MCC
117 $n =~ tr/A-Z/a-z/;
118 $n =~ tr/_/-/;
119
120 $typedefs{$s} = $n;
121 next;
122}
123
124#
125# Handle exceptions, if any
126#
127
128if ($file_exceptions) {
129 open IN, $file_exceptions or die "Can't read $file_exceptions";
130 while (<IN>) {
131 next if (m/^\s*$/ || m/^\s*#/);
132
133 # Parsers to ignore a symbol
134
135 if (m/^ignore\s+ioctl\s+(\S+)/) {
136 delete $ioctls{$1} if (exists($ioctls{$1}));
137 next;
138 }
139 if (m/^ignore\s+define\s+(\S+)/) {
140 delete $defines{$1} if (exists($defines{$1}));
141 next;
142 }
143 if (m/^ignore\s+typedef\s+(\S+)/) {
144 delete $typedefs{$1} if (exists($typedefs{$1}));
145 next;
146 }
147 if (m/^ignore\s+enum\s+(\S+)/) {
148 delete $enums{$1} if (exists($enums{$1}));
149 next;
150 }
151 if (m/^ignore\s+struct\s+(\S+)/) {
152 delete $structs{$1} if (exists($structs{$1}));
153 next;
154 }
155
156 # Parsers to replace a symbol
157
158 if (m/^replace\s+ioctl\s+(\S+)\s+(\S+)/) {
159 $ioctls{$1} = $2 if (exists($ioctls{$1}));
160 next;
161 }
162 if (m/^replace\s+define\s+(\S+)\s+(\S+)/) {
163 $defines{$1} = $2 if (exists($defines{$1}));
164 next;
165 }
166 if (m/^replace\s+typedef\s+(\S+)\s+(\S+)/) {
167 $typedefs{$1} = $2 if (exists($typedefs{$1}));
168 next;
169 }
170 if (m/^replace\s+enum\s+(\S+)\s+(\S+)/) {
171 $enums{$1} = $2 if (exists($enums{$1}));
172 next;
173 }
174 if (m/^replace\s+symbol\s+(\S+)\s+(\S+)/) {
175 $enum_symbols{$1} = $2 if (exists($enum_symbols{$1}));
176 next;
177 }
178 if (m/^replace\s+struct\s+(\S+)\s+(\S+)/) {
179 $structs{$1} = $2 if (exists($structs{$1}));
180 next;
181 }
182
183 die "Can't parse $file_exceptions: $_";
184 }
185}
186
187if ($debug) {
188 print Data::Dumper->Dump([\%ioctls], [qw(*ioctls)]) if (%ioctls);
189 print Data::Dumper->Dump([\%typedefs], [qw(*typedefs)]) if (%typedefs);
190 print Data::Dumper->Dump([\%enums], [qw(*enums)]) if (%enums);
191 print Data::Dumper->Dump([\%structs], [qw(*structs)]) if (%structs);
192 print Data::Dumper->Dump([\%defines], [qw(*defines)]) if (%defines);
193 print Data::Dumper->Dump([\%enum_symbols], [qw(*enum_symbols)]) if (%enum_symbols);
194}
195
196#
197# Align block
198#
199$data = expand($data);
200$data = " " . $data;
201$data =~ s/\n/\n /g;
202$data =~ s/\n\s+$/\n/g;
203$data =~ s/\n\s+\n/\n\n/g;
204
205#
206# Add escape codes for special characters
207#
208$data =~ s,([\_\`\*\<\>\&\\\\:\/]),\\$1,g;
209
7d95fa8d
MCC
210$data =~ s,DEPRECATED,**DEPRECATED**,g;
211
dabf8be3
MCC
212#
213# Add references
214#
215
6fe79d1e
MCC
216my $start_delim = "[ \n\t\(\=\*\@]";
217my $end_delim = "(\\s|,|\\\\=|\\\\:|\\;|\\\)|\\}|\\{)";
dabf8be3
MCC
218
219foreach my $r (keys %ioctls) {
220 my $n = $ioctls{$r};
221
6fe79d1e 222 my $s = "\\ :ref:`$r <$n>`\\ ";
dabf8be3
MCC
223
224 $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g;
225
226 print "$r -> $s\n" if ($debug);
227
6fe79d1e 228 $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g;
dabf8be3
MCC
229}
230
231foreach my $r (keys %defines) {
232 my $n = $defines{$r};
233
6fe79d1e 234 my $s = "\\ :ref:`$r <$n>`\\ ";
dabf8be3
MCC
235
236 $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g;
237
238 print "$r -> $s\n" if ($debug);
239
6fe79d1e 240 $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g;
dabf8be3
MCC
241}
242
243foreach my $r (keys %enum_symbols) {
244 my $n = $enum_symbols{$r};
245
6fe79d1e 246 my $s = "\\ :ref:`$r <$n>`\\ ";
dabf8be3
MCC
247
248 $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g;
249
250 print "$r -> $s\n" if ($debug);
251
6fe79d1e 252 $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g;
dabf8be3
MCC
253}
254
255foreach my $r (keys %enums) {
256 my $n = $enums{$r};
257
6fe79d1e 258 my $s = "\\ :ref:`enum $r <$n>`\\ ";
dabf8be3
MCC
259
260 $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g;
261
262 print "$r -> $s\n" if ($debug);
263
6fe79d1e 264 $data =~ s/enum\s+($r)$end_delim/$s$2/g;
dabf8be3
MCC
265}
266
267foreach my $r (keys %structs) {
268 my $n = $structs{$r};
269
6fe79d1e 270 my $s = "\\ :ref:`struct $r <$n>`\\ ";
dabf8be3
MCC
271
272 $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g;
273
274 print "$r -> $s\n" if ($debug);
275
6fe79d1e 276 $data =~ s/struct\s+($r)$end_delim/$s$2/g;
dabf8be3
MCC
277}
278
279foreach my $r (keys %typedefs) {
280 my $n = $typedefs{$r};
281
6fe79d1e 282 my $s = "\\ :ref:`$r <$n>`\\ ";
dabf8be3
MCC
283
284 $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g;
285
286 print "$r -> $s\n" if ($debug);
287
6fe79d1e 288 $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g;
dabf8be3
MCC
289}
290
291#
292# Generate output file
293#
294
295my $title = $file_in;
296$title =~ s,.*/,,;
297
298open OUT, "> $file_out" or die "Can't open $file_out";
299print OUT ".. -*- coding: utf-8; mode: rst -*-\n\n";
300print OUT "$title\n";
301print OUT "=" x length($title);
302print OUT "\n\n.. parsed-literal::\n\n";
303print OUT $data;
304close OUT;