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