18c2ecf20Sopenharmony_ci#!/usr/bin/env perl 28c2ecf20Sopenharmony_ciuse strict; 38c2ecf20Sopenharmony_ciuse Text::Tabs; 48c2ecf20Sopenharmony_ciuse Getopt::Long; 58c2ecf20Sopenharmony_ciuse Pod::Usage; 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_cimy $debug; 88c2ecf20Sopenharmony_cimy $help; 98c2ecf20Sopenharmony_cimy $man; 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ciGetOptions( 128c2ecf20Sopenharmony_ci "debug" => \$debug, 138c2ecf20Sopenharmony_ci 'usage|?' => \$help, 148c2ecf20Sopenharmony_ci 'help' => \$man 158c2ecf20Sopenharmony_ci) or pod2usage(2); 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cipod2usage(1) if $help; 188c2ecf20Sopenharmony_cipod2usage(-exitstatus => 0, -verbose => 2) if $man; 198c2ecf20Sopenharmony_cipod2usage(2) if (scalar @ARGV < 2 || scalar @ARGV > 3); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cimy ($file_in, $file_out, $file_exceptions) = @ARGV; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cimy $data; 248c2ecf20Sopenharmony_cimy %ioctls; 258c2ecf20Sopenharmony_cimy %defines; 268c2ecf20Sopenharmony_cimy %typedefs; 278c2ecf20Sopenharmony_cimy %enums; 288c2ecf20Sopenharmony_cimy %enum_symbols; 298c2ecf20Sopenharmony_cimy %structs; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cirequire Data::Dumper if ($debug); 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci# 348c2ecf20Sopenharmony_ci# read the file and get identifiers 358c2ecf20Sopenharmony_ci# 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cimy $is_enum = 0; 388c2ecf20Sopenharmony_cimy $is_comment = 0; 398c2ecf20Sopenharmony_ciopen IN, $file_in or die "Can't open $file_in"; 408c2ecf20Sopenharmony_ciwhile (<IN>) { 418c2ecf20Sopenharmony_ci $data .= $_; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci my $ln = $_; 448c2ecf20Sopenharmony_ci if (!$is_comment) { 458c2ecf20Sopenharmony_ci $ln =~ s,/\*.*(\*/),,g; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci $is_comment = 1 if ($ln =~ s,/\*.*,,); 488c2ecf20Sopenharmony_ci } else { 498c2ecf20Sopenharmony_ci if ($ln =~ s,^(.*\*/),,) { 508c2ecf20Sopenharmony_ci $is_comment = 0; 518c2ecf20Sopenharmony_ci } else { 528c2ecf20Sopenharmony_ci next; 538c2ecf20Sopenharmony_ci } 548c2ecf20Sopenharmony_ci } 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci if ($is_enum && $ln =~ m/^\s*([_\w][\w\d_]+)\s*[\,=]?/) { 578c2ecf20Sopenharmony_ci my $s = $1; 588c2ecf20Sopenharmony_ci my $n = $1; 598c2ecf20Sopenharmony_ci $n =~ tr/A-Z/a-z/; 608c2ecf20Sopenharmony_ci $n =~ tr/_/-/; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci $enum_symbols{$s} = "\\ :ref:`$s <$n>`\\ "; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci $is_enum = 0 if ($is_enum && m/\}/); 658c2ecf20Sopenharmony_ci next; 668c2ecf20Sopenharmony_ci } 678c2ecf20Sopenharmony_ci $is_enum = 0 if ($is_enum && m/\}/); 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci if ($ln =~ m/^\s*#\s*define\s+([_\w][\w\d_]+)\s+_IO/) { 708c2ecf20Sopenharmony_ci my $s = $1; 718c2ecf20Sopenharmony_ci my $n = $1; 728c2ecf20Sopenharmony_ci $n =~ tr/A-Z/a-z/; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci $ioctls{$s} = "\\ :ref:`$s <$n>`\\ "; 758c2ecf20Sopenharmony_ci next; 768c2ecf20Sopenharmony_ci } 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci if ($ln =~ m/^\s*#\s*define\s+([_\w][\w\d_]+)\s+/) { 798c2ecf20Sopenharmony_ci my $s = $1; 808c2ecf20Sopenharmony_ci my $n = $1; 818c2ecf20Sopenharmony_ci $n =~ tr/A-Z/a-z/; 828c2ecf20Sopenharmony_ci $n =~ tr/_/-/; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci $defines{$s} = "\\ :ref:`$s <$n>`\\ "; 858c2ecf20Sopenharmony_ci next; 868c2ecf20Sopenharmony_ci } 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci if ($ln =~ m/^\s*typedef\s+([_\w][\w\d_]+)\s+(.*)\s+([_\w][\w\d_]+);/) { 898c2ecf20Sopenharmony_ci my $s = $2; 908c2ecf20Sopenharmony_ci my $n = $3; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci $typedefs{$n} = "\\ :c:type:`$n <$s>`\\ "; 938c2ecf20Sopenharmony_ci next; 948c2ecf20Sopenharmony_ci } 958c2ecf20Sopenharmony_ci if ($ln =~ m/^\s*enum\s+([_\w][\w\d_]+)\s+\{/ 968c2ecf20Sopenharmony_ci || $ln =~ m/^\s*enum\s+([_\w][\w\d_]+)$/ 978c2ecf20Sopenharmony_ci || $ln =~ m/^\s*typedef\s*enum\s+([_\w][\w\d_]+)\s+\{/ 988c2ecf20Sopenharmony_ci || $ln =~ m/^\s*typedef\s*enum\s+([_\w][\w\d_]+)$/) { 998c2ecf20Sopenharmony_ci my $s = $1; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci $enums{$s} = "enum :c:type:`$s`\\ "; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci $is_enum = $1; 1048c2ecf20Sopenharmony_ci next; 1058c2ecf20Sopenharmony_ci } 1068c2ecf20Sopenharmony_ci if ($ln =~ m/^\s*struct\s+([_\w][\w\d_]+)\s+\{/ 1078c2ecf20Sopenharmony_ci || $ln =~ m/^\s*struct\s+([[_\w][\w\d_]+)$/ 1088c2ecf20Sopenharmony_ci || $ln =~ m/^\s*typedef\s*struct\s+([_\w][\w\d_]+)\s+\{/ 1098c2ecf20Sopenharmony_ci || $ln =~ m/^\s*typedef\s*struct\s+([[_\w][\w\d_]+)$/ 1108c2ecf20Sopenharmony_ci ) { 1118c2ecf20Sopenharmony_ci my $s = $1; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci $structs{$s} = "struct $s\\ "; 1148c2ecf20Sopenharmony_ci next; 1158c2ecf20Sopenharmony_ci } 1168c2ecf20Sopenharmony_ci} 1178c2ecf20Sopenharmony_ciclose IN; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci# 1208c2ecf20Sopenharmony_ci# Handle multi-line typedefs 1218c2ecf20Sopenharmony_ci# 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cimy @matches = ($data =~ m/typedef\s+struct\s+\S+?\s*\{[^\}]+\}\s*(\S+)\s*\;/g, 1248c2ecf20Sopenharmony_ci $data =~ m/typedef\s+enum\s+\S+?\s*\{[^\}]+\}\s*(\S+)\s*\;/g,); 1258c2ecf20Sopenharmony_ciforeach my $m (@matches) { 1268c2ecf20Sopenharmony_ci my $s = $m; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci $typedefs{$s} = "\\ :c:type:`$s`\\ "; 1298c2ecf20Sopenharmony_ci next; 1308c2ecf20Sopenharmony_ci} 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci# 1338c2ecf20Sopenharmony_ci# Handle exceptions, if any 1348c2ecf20Sopenharmony_ci# 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cimy %def_reftype = ( 1378c2ecf20Sopenharmony_ci "ioctl" => ":ref", 1388c2ecf20Sopenharmony_ci "define" => ":ref", 1398c2ecf20Sopenharmony_ci "symbol" => ":ref", 1408c2ecf20Sopenharmony_ci "typedef" => ":c:type", 1418c2ecf20Sopenharmony_ci "enum" => ":c:type", 1428c2ecf20Sopenharmony_ci "struct" => ":c:type", 1438c2ecf20Sopenharmony_ci); 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ciif ($file_exceptions) { 1468c2ecf20Sopenharmony_ci open IN, $file_exceptions or die "Can't read $file_exceptions"; 1478c2ecf20Sopenharmony_ci while (<IN>) { 1488c2ecf20Sopenharmony_ci next if (m/^\s*$/ || m/^\s*#/); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci # Parsers to ignore a symbol 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci if (m/^ignore\s+ioctl\s+(\S+)/) { 1538c2ecf20Sopenharmony_ci delete $ioctls{$1} if (exists($ioctls{$1})); 1548c2ecf20Sopenharmony_ci next; 1558c2ecf20Sopenharmony_ci } 1568c2ecf20Sopenharmony_ci if (m/^ignore\s+define\s+(\S+)/) { 1578c2ecf20Sopenharmony_ci delete $defines{$1} if (exists($defines{$1})); 1588c2ecf20Sopenharmony_ci next; 1598c2ecf20Sopenharmony_ci } 1608c2ecf20Sopenharmony_ci if (m/^ignore\s+typedef\s+(\S+)/) { 1618c2ecf20Sopenharmony_ci delete $typedefs{$1} if (exists($typedefs{$1})); 1628c2ecf20Sopenharmony_ci next; 1638c2ecf20Sopenharmony_ci } 1648c2ecf20Sopenharmony_ci if (m/^ignore\s+enum\s+(\S+)/) { 1658c2ecf20Sopenharmony_ci delete $enums{$1} if (exists($enums{$1})); 1668c2ecf20Sopenharmony_ci next; 1678c2ecf20Sopenharmony_ci } 1688c2ecf20Sopenharmony_ci if (m/^ignore\s+struct\s+(\S+)/) { 1698c2ecf20Sopenharmony_ci delete $structs{$1} if (exists($structs{$1})); 1708c2ecf20Sopenharmony_ci next; 1718c2ecf20Sopenharmony_ci } 1728c2ecf20Sopenharmony_ci if (m/^ignore\s+symbol\s+(\S+)/) { 1738c2ecf20Sopenharmony_ci delete $enum_symbols{$1} if (exists($enum_symbols{$1})); 1748c2ecf20Sopenharmony_ci next; 1758c2ecf20Sopenharmony_ci } 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci # Parsers to replace a symbol 1788c2ecf20Sopenharmony_ci my ($type, $old, $new, $reftype); 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci if (m/^replace\s+(\S+)\s+(\S+)\s+(\S+)/) { 1818c2ecf20Sopenharmony_ci $type = $1; 1828c2ecf20Sopenharmony_ci $old = $2; 1838c2ecf20Sopenharmony_ci $new = $3; 1848c2ecf20Sopenharmony_ci } else { 1858c2ecf20Sopenharmony_ci die "Can't parse $file_exceptions: $_"; 1868c2ecf20Sopenharmony_ci } 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci if ($new =~ m/^\:c\:(data|func|macro|type)\:\`(.+)\`/) { 1898c2ecf20Sopenharmony_ci $reftype = ":c:$1"; 1908c2ecf20Sopenharmony_ci $new = $2; 1918c2ecf20Sopenharmony_ci } elsif ($new =~ m/\:ref\:\`(.+)\`/) { 1928c2ecf20Sopenharmony_ci $reftype = ":ref"; 1938c2ecf20Sopenharmony_ci $new = $1; 1948c2ecf20Sopenharmony_ci } else { 1958c2ecf20Sopenharmony_ci $reftype = $def_reftype{$type}; 1968c2ecf20Sopenharmony_ci } 1978c2ecf20Sopenharmony_ci $new = "$reftype:`$old <$new>`"; 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci if ($type eq "ioctl") { 2008c2ecf20Sopenharmony_ci $ioctls{$old} = $new if (exists($ioctls{$old})); 2018c2ecf20Sopenharmony_ci next; 2028c2ecf20Sopenharmony_ci } 2038c2ecf20Sopenharmony_ci if ($type eq "define") { 2048c2ecf20Sopenharmony_ci $defines{$old} = $new if (exists($defines{$old})); 2058c2ecf20Sopenharmony_ci next; 2068c2ecf20Sopenharmony_ci } 2078c2ecf20Sopenharmony_ci if ($type eq "symbol") { 2088c2ecf20Sopenharmony_ci $enum_symbols{$old} = $new if (exists($enum_symbols{$old})); 2098c2ecf20Sopenharmony_ci next; 2108c2ecf20Sopenharmony_ci } 2118c2ecf20Sopenharmony_ci if ($type eq "typedef") { 2128c2ecf20Sopenharmony_ci $typedefs{$old} = $new if (exists($typedefs{$old})); 2138c2ecf20Sopenharmony_ci next; 2148c2ecf20Sopenharmony_ci } 2158c2ecf20Sopenharmony_ci if ($type eq "enum") { 2168c2ecf20Sopenharmony_ci $enums{$old} = $new if (exists($enums{$old})); 2178c2ecf20Sopenharmony_ci next; 2188c2ecf20Sopenharmony_ci } 2198c2ecf20Sopenharmony_ci if ($type eq "struct") { 2208c2ecf20Sopenharmony_ci $structs{$old} = $new if (exists($structs{$old})); 2218c2ecf20Sopenharmony_ci next; 2228c2ecf20Sopenharmony_ci } 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci die "Can't parse $file_exceptions: $_"; 2258c2ecf20Sopenharmony_ci } 2268c2ecf20Sopenharmony_ci} 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ciif ($debug) { 2298c2ecf20Sopenharmony_ci print Data::Dumper->Dump([\%ioctls], [qw(*ioctls)]) if (%ioctls); 2308c2ecf20Sopenharmony_ci print Data::Dumper->Dump([\%typedefs], [qw(*typedefs)]) if (%typedefs); 2318c2ecf20Sopenharmony_ci print Data::Dumper->Dump([\%enums], [qw(*enums)]) if (%enums); 2328c2ecf20Sopenharmony_ci print Data::Dumper->Dump([\%structs], [qw(*structs)]) if (%structs); 2338c2ecf20Sopenharmony_ci print Data::Dumper->Dump([\%defines], [qw(*defines)]) if (%defines); 2348c2ecf20Sopenharmony_ci print Data::Dumper->Dump([\%enum_symbols], [qw(*enum_symbols)]) if (%enum_symbols); 2358c2ecf20Sopenharmony_ci} 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci# 2388c2ecf20Sopenharmony_ci# Align block 2398c2ecf20Sopenharmony_ci# 2408c2ecf20Sopenharmony_ci$data = expand($data); 2418c2ecf20Sopenharmony_ci$data = " " . $data; 2428c2ecf20Sopenharmony_ci$data =~ s/\n/\n /g; 2438c2ecf20Sopenharmony_ci$data =~ s/\n\s+$/\n/g; 2448c2ecf20Sopenharmony_ci$data =~ s/\n\s+\n/\n\n/g; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci# 2478c2ecf20Sopenharmony_ci# Add escape codes for special characters 2488c2ecf20Sopenharmony_ci# 2498c2ecf20Sopenharmony_ci$data =~ s,([\_\`\*\<\>\&\\\\:\/\|\%\$\#\{\}\~\^]),\\$1,g; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci$data =~ s,DEPRECATED,**DEPRECATED**,g; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci# 2548c2ecf20Sopenharmony_ci# Add references 2558c2ecf20Sopenharmony_ci# 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_cimy $start_delim = "[ \n\t\(\=\*\@]"; 2588c2ecf20Sopenharmony_cimy $end_delim = "(\\s|,|\\\\=|\\\\:|\\;|\\\)|\\}|\\{)"; 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ciforeach my $r (keys %ioctls) { 2618c2ecf20Sopenharmony_ci my $s = $ioctls{$r}; 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci print "$r -> $s\n" if ($debug); 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 2688c2ecf20Sopenharmony_ci} 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ciforeach my $r (keys %defines) { 2718c2ecf20Sopenharmony_ci my $s = $defines{$r}; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci print "$r -> $s\n" if ($debug); 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 2788c2ecf20Sopenharmony_ci} 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ciforeach my $r (keys %enum_symbols) { 2818c2ecf20Sopenharmony_ci my $s = $enum_symbols{$r}; 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci print "$r -> $s\n" if ($debug); 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 2888c2ecf20Sopenharmony_ci} 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ciforeach my $r (keys %enums) { 2918c2ecf20Sopenharmony_ci my $s = $enums{$r}; 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci print "$r -> $s\n" if ($debug); 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci $data =~ s/enum\s+($r)$end_delim/$s$2/g; 2988c2ecf20Sopenharmony_ci} 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ciforeach my $r (keys %structs) { 3018c2ecf20Sopenharmony_ci my $s = $structs{$r}; 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci print "$r -> $s\n" if ($debug); 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci $data =~ s/struct\s+($r)$end_delim/$s$2/g; 3088c2ecf20Sopenharmony_ci} 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ciforeach my $r (keys %typedefs) { 3118c2ecf20Sopenharmony_ci my $s = $typedefs{$r}; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci print "$r -> $s\n" if ($debug); 3168c2ecf20Sopenharmony_ci $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 3178c2ecf20Sopenharmony_ci} 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci$data =~ s/\\ ([\n\s])/\1/g; 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ci# 3228c2ecf20Sopenharmony_ci# Generate output file 3238c2ecf20Sopenharmony_ci# 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_cimy $title = $file_in; 3268c2ecf20Sopenharmony_ci$title =~ s,.*/,,; 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ciopen OUT, "> $file_out" or die "Can't open $file_out"; 3298c2ecf20Sopenharmony_ciprint OUT ".. -*- coding: utf-8; mode: rst -*-\n\n"; 3308c2ecf20Sopenharmony_ciprint OUT "$title\n"; 3318c2ecf20Sopenharmony_ciprint OUT "=" x length($title); 3328c2ecf20Sopenharmony_ciprint OUT "\n\n.. parsed-literal::\n\n"; 3338c2ecf20Sopenharmony_ciprint OUT $data; 3348c2ecf20Sopenharmony_ciclose OUT; 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci__END__ 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci=head1 NAME 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ciparse_headers.pl - parse a C file, in order to identify functions, structs, 3418c2ecf20Sopenharmony_cienums and defines and create cross-references to a Sphinx book. 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci=head1 SYNOPSIS 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_ciB<parse_headers.pl> [<options>] <C_FILE> <OUT_FILE> [<EXCEPTIONS_FILE>] 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ciWhere <options> can be: --debug, --help or --usage. 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci=head1 OPTIONS 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci=over 8 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_ci=item B<--debug> 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ciPut the script in verbose mode, useful for debugging. 3568c2ecf20Sopenharmony_ci 3578c2ecf20Sopenharmony_ci=item B<--usage> 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ciPrints a brief help message and exits. 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci=item B<--help> 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ciPrints a more detailed help message and exits. 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci=back 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci=head1 DESCRIPTION 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ciConvert a C header or source file (C_FILE), into a ReStructured Text 3708c2ecf20Sopenharmony_ciincluded via ..parsed-literal block with cross-references for the 3718c2ecf20Sopenharmony_cidocumentation files that describe the API. It accepts an optional 3728c2ecf20Sopenharmony_ciEXCEPTIONS_FILE with describes what elements will be either ignored or 3738c2ecf20Sopenharmony_cibe pointed to a non-default reference. 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ciThe output is written at the (OUT_FILE). 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ciIt is capable of identifying defines, functions, structs, typedefs, 3788c2ecf20Sopenharmony_cienums and enum symbols and create cross-references for all of them. 3798c2ecf20Sopenharmony_ciIt is also capable of distinguish #define used for specifying a Linux 3808c2ecf20Sopenharmony_ciioctl. 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ciThe EXCEPTIONS_FILE contain two rules to allow ignoring a symbol or 3838c2ecf20Sopenharmony_cito replace the default references by a custom one. 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ciPlease read Documentation/doc-guide/parse-headers.rst at the Kernel's 3868c2ecf20Sopenharmony_citree for more details. 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci=head1 BUGS 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ciReport bugs to Mauro Carvalho Chehab <mchehab@kernel.org> 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci=head1 COPYRIGHT 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ciCopyright (c) 2016 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>. 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ciLicense GPLv2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>. 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ciThis is free software: you are free to change and redistribute it. 3998c2ecf20Sopenharmony_ciThere is NO WARRANTY, to the extent permitted by law. 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci=cut 402