1*c25ce589SFinn Behrens#!/usr/bin/env perl 2dabf8be3SMauro Carvalho Chehabuse strict; 3dabf8be3SMauro Carvalho Chehabuse Text::Tabs; 4327f5a75SMauro Carvalho Chehabuse Getopt::Long; 5327f5a75SMauro Carvalho Chehabuse Pod::Usage; 6dabf8be3SMauro Carvalho Chehab 7327f5a75SMauro Carvalho Chehabmy $debug; 8327f5a75SMauro Carvalho Chehabmy $help; 9327f5a75SMauro Carvalho Chehabmy $man; 10dabf8be3SMauro Carvalho Chehab 11327f5a75SMauro Carvalho ChehabGetOptions( 12327f5a75SMauro Carvalho Chehab "debug" => \$debug, 13c3396656SMauro Carvalho Chehab 'usage|?' => \$help, 14c3396656SMauro Carvalho Chehab 'help' => \$man 15327f5a75SMauro Carvalho Chehab) or pod2usage(2); 16bcec7c21SMauro Carvalho Chehab 17327f5a75SMauro Carvalho Chehabpod2usage(1) if $help; 18327f5a75SMauro Carvalho Chehabpod2usage(-exitstatus => 0, -verbose => 2) if $man; 19327f5a75SMauro Carvalho Chehabpod2usage(2) if (scalar @ARGV < 2 || scalar @ARGV > 3); 20dabf8be3SMauro Carvalho Chehab 21dabf8be3SMauro Carvalho Chehabmy ($file_in, $file_out, $file_exceptions) = @ARGV; 22dabf8be3SMauro Carvalho Chehab 23dabf8be3SMauro Carvalho Chehabmy $data; 24dabf8be3SMauro Carvalho Chehabmy %ioctls; 25dabf8be3SMauro Carvalho Chehabmy %defines; 26dabf8be3SMauro Carvalho Chehabmy %typedefs; 27dabf8be3SMauro Carvalho Chehabmy %enums; 28dabf8be3SMauro Carvalho Chehabmy %enum_symbols; 29dabf8be3SMauro Carvalho Chehabmy %structs; 30dabf8be3SMauro Carvalho Chehab 31327f5a75SMauro Carvalho Chehabrequire Data::Dumper if ($debug); 32327f5a75SMauro Carvalho Chehab 33dabf8be3SMauro Carvalho Chehab# 34dabf8be3SMauro Carvalho Chehab# read the file and get identifiers 35dabf8be3SMauro Carvalho Chehab# 36dabf8be3SMauro Carvalho Chehab 37dabf8be3SMauro Carvalho Chehabmy $is_enum = 0; 38034e6c8eSMauro Carvalho Chehabmy $is_comment = 0; 39dabf8be3SMauro Carvalho Chehabopen IN, $file_in or die "Can't open $file_in"; 40dabf8be3SMauro Carvalho Chehabwhile (<IN>) { 41dabf8be3SMauro Carvalho Chehab $data .= $_; 42dabf8be3SMauro Carvalho Chehab 43034e6c8eSMauro Carvalho Chehab my $ln = $_; 44034e6c8eSMauro Carvalho Chehab if (!$is_comment) { 45034e6c8eSMauro Carvalho Chehab $ln =~ s,/\*.*(\*/),,g; 46034e6c8eSMauro Carvalho Chehab 47034e6c8eSMauro Carvalho Chehab $is_comment = 1 if ($ln =~ s,/\*.*,,); 48034e6c8eSMauro Carvalho Chehab } else { 49034e6c8eSMauro Carvalho Chehab if ($ln =~ s,^(.*\*/),,) { 50034e6c8eSMauro Carvalho Chehab $is_comment = 0; 51034e6c8eSMauro Carvalho Chehab } else { 52034e6c8eSMauro Carvalho Chehab next; 53034e6c8eSMauro Carvalho Chehab } 54034e6c8eSMauro Carvalho Chehab } 55034e6c8eSMauro Carvalho Chehab 569c80c745SMauro Carvalho Chehab if ($is_enum && $ln =~ m/^\s*([_\w][\w\d_]+)\s*[\,=]?/) { 57dabf8be3SMauro Carvalho Chehab my $s = $1; 58dabf8be3SMauro Carvalho Chehab my $n = $1; 59dabf8be3SMauro Carvalho Chehab $n =~ tr/A-Z/a-z/; 60dabf8be3SMauro Carvalho Chehab $n =~ tr/_/-/; 61dabf8be3SMauro Carvalho Chehab 6222c40033SMauro Carvalho Chehab $enum_symbols{$s} = "\\ :ref:`$s <$n>`\\ "; 63dabf8be3SMauro Carvalho Chehab 64dabf8be3SMauro Carvalho Chehab $is_enum = 0 if ($is_enum && m/\}/); 65dabf8be3SMauro Carvalho Chehab next; 66dabf8be3SMauro Carvalho Chehab } 67dabf8be3SMauro Carvalho Chehab $is_enum = 0 if ($is_enum && m/\}/); 68dabf8be3SMauro Carvalho Chehab 699c80c745SMauro Carvalho Chehab if ($ln =~ m/^\s*#\s*define\s+([_\w][\w\d_]+)\s+_IO/) { 70dabf8be3SMauro Carvalho Chehab my $s = $1; 71dabf8be3SMauro Carvalho Chehab my $n = $1; 72dabf8be3SMauro Carvalho Chehab $n =~ tr/A-Z/a-z/; 73dabf8be3SMauro Carvalho Chehab 7422c40033SMauro Carvalho Chehab $ioctls{$s} = "\\ :ref:`$s <$n>`\\ "; 75dabf8be3SMauro Carvalho Chehab next; 76dabf8be3SMauro Carvalho Chehab } 77dabf8be3SMauro Carvalho Chehab 789c80c745SMauro Carvalho Chehab if ($ln =~ m/^\s*#\s*define\s+([_\w][\w\d_]+)\s+/) { 79dabf8be3SMauro Carvalho Chehab my $s = $1; 80dabf8be3SMauro Carvalho Chehab my $n = $1; 81dabf8be3SMauro Carvalho Chehab $n =~ tr/A-Z/a-z/; 82dabf8be3SMauro Carvalho Chehab $n =~ tr/_/-/; 83dabf8be3SMauro Carvalho Chehab 8422c40033SMauro Carvalho Chehab $defines{$s} = "\\ :ref:`$s <$n>`\\ "; 85dabf8be3SMauro Carvalho Chehab next; 86dabf8be3SMauro Carvalho Chehab } 87dabf8be3SMauro Carvalho Chehab 8822c40033SMauro Carvalho Chehab if ($ln =~ m/^\s*typedef\s+([_\w][\w\d_]+)\s+(.*)\s+([_\w][\w\d_]+);/) { 8922c40033SMauro Carvalho Chehab my $s = $2; 9022c40033SMauro Carvalho Chehab my $n = $3; 91dabf8be3SMauro Carvalho Chehab 9222c40033SMauro Carvalho Chehab $typedefs{$n} = "\\ :c:type:`$n <$s>`\\ "; 93dabf8be3SMauro Carvalho Chehab next; 94dabf8be3SMauro Carvalho Chehab } 959c80c745SMauro Carvalho Chehab if ($ln =~ m/^\s*enum\s+([_\w][\w\d_]+)\s+\{/ 966c4c7dadSMauro Carvalho Chehab || $ln =~ m/^\s*enum\s+([_\w][\w\d_]+)$/ 976c4c7dadSMauro Carvalho Chehab || $ln =~ m/^\s*typedef\s*enum\s+([_\w][\w\d_]+)\s+\{/ 986c4c7dadSMauro Carvalho Chehab || $ln =~ m/^\s*typedef\s*enum\s+([_\w][\w\d_]+)$/) { 99dabf8be3SMauro Carvalho Chehab my $s = $1; 100dabf8be3SMauro Carvalho Chehab 10122c40033SMauro Carvalho Chehab $enums{$s} = "enum :c:type:`$s`\\ "; 102dabf8be3SMauro Carvalho Chehab 103dabf8be3SMauro Carvalho Chehab $is_enum = $1; 104dabf8be3SMauro Carvalho Chehab next; 105dabf8be3SMauro Carvalho Chehab } 1069c80c745SMauro Carvalho Chehab if ($ln =~ m/^\s*struct\s+([_\w][\w\d_]+)\s+\{/ 1076c4c7dadSMauro Carvalho Chehab || $ln =~ m/^\s*struct\s+([[_\w][\w\d_]+)$/ 1086c4c7dadSMauro Carvalho Chehab || $ln =~ m/^\s*typedef\s*struct\s+([_\w][\w\d_]+)\s+\{/ 1096c4c7dadSMauro Carvalho Chehab || $ln =~ m/^\s*typedef\s*struct\s+([[_\w][\w\d_]+)$/ 1106c4c7dadSMauro Carvalho Chehab ) { 111dabf8be3SMauro Carvalho Chehab my $s = $1; 112dabf8be3SMauro Carvalho Chehab 1139303c9d5SMauro Carvalho Chehab $structs{$s} = "struct $s\\ "; 114dabf8be3SMauro Carvalho Chehab next; 115dabf8be3SMauro Carvalho Chehab } 116dabf8be3SMauro Carvalho Chehab} 117dabf8be3SMauro Carvalho Chehabclose IN; 118dabf8be3SMauro Carvalho Chehab 119dabf8be3SMauro Carvalho Chehab# 120dabf8be3SMauro Carvalho Chehab# Handle multi-line typedefs 121dabf8be3SMauro Carvalho Chehab# 122dabf8be3SMauro Carvalho Chehab 1234ff916a0SMauro Carvalho Chehabmy @matches = ($data =~ m/typedef\s+struct\s+\S+?\s*\{[^\}]+\}\s*(\S+)\s*\;/g, 1244ff916a0SMauro Carvalho Chehab $data =~ m/typedef\s+enum\s+\S+?\s*\{[^\}]+\}\s*(\S+)\s*\;/g,); 125dabf8be3SMauro Carvalho Chehabforeach my $m (@matches) { 1264ff916a0SMauro Carvalho Chehab my $s = $m; 127dabf8be3SMauro Carvalho Chehab 12822c40033SMauro Carvalho Chehab $typedefs{$s} = "\\ :c:type:`$s`\\ "; 129dabf8be3SMauro Carvalho Chehab next; 130dabf8be3SMauro Carvalho Chehab} 131dabf8be3SMauro Carvalho Chehab 132dabf8be3SMauro Carvalho Chehab# 133dabf8be3SMauro Carvalho Chehab# Handle exceptions, if any 134dabf8be3SMauro Carvalho Chehab# 135dabf8be3SMauro Carvalho Chehab 13622c40033SMauro Carvalho Chehabmy %def_reftype = ( 13722c40033SMauro Carvalho Chehab "ioctl" => ":ref", 13822c40033SMauro Carvalho Chehab "define" => ":ref", 13922c40033SMauro Carvalho Chehab "symbol" => ":ref", 14022c40033SMauro Carvalho Chehab "typedef" => ":c:type", 14122c40033SMauro Carvalho Chehab "enum" => ":c:type", 14222c40033SMauro Carvalho Chehab "struct" => ":c:type", 14322c40033SMauro Carvalho Chehab); 14422c40033SMauro Carvalho Chehab 145dabf8be3SMauro Carvalho Chehabif ($file_exceptions) { 146dabf8be3SMauro Carvalho Chehab open IN, $file_exceptions or die "Can't read $file_exceptions"; 147dabf8be3SMauro Carvalho Chehab while (<IN>) { 148dabf8be3SMauro Carvalho Chehab next if (m/^\s*$/ || m/^\s*#/); 149dabf8be3SMauro Carvalho Chehab 150dabf8be3SMauro Carvalho Chehab # Parsers to ignore a symbol 151dabf8be3SMauro Carvalho Chehab 152dabf8be3SMauro Carvalho Chehab if (m/^ignore\s+ioctl\s+(\S+)/) { 153dabf8be3SMauro Carvalho Chehab delete $ioctls{$1} if (exists($ioctls{$1})); 154dabf8be3SMauro Carvalho Chehab next; 155dabf8be3SMauro Carvalho Chehab } 156dabf8be3SMauro Carvalho Chehab if (m/^ignore\s+define\s+(\S+)/) { 157dabf8be3SMauro Carvalho Chehab delete $defines{$1} if (exists($defines{$1})); 158dabf8be3SMauro Carvalho Chehab next; 159dabf8be3SMauro Carvalho Chehab } 160dabf8be3SMauro Carvalho Chehab if (m/^ignore\s+typedef\s+(\S+)/) { 161dabf8be3SMauro Carvalho Chehab delete $typedefs{$1} if (exists($typedefs{$1})); 162dabf8be3SMauro Carvalho Chehab next; 163dabf8be3SMauro Carvalho Chehab } 164dabf8be3SMauro Carvalho Chehab if (m/^ignore\s+enum\s+(\S+)/) { 165dabf8be3SMauro Carvalho Chehab delete $enums{$1} if (exists($enums{$1})); 166dabf8be3SMauro Carvalho Chehab next; 167dabf8be3SMauro Carvalho Chehab } 168dabf8be3SMauro Carvalho Chehab if (m/^ignore\s+struct\s+(\S+)/) { 169dabf8be3SMauro Carvalho Chehab delete $structs{$1} if (exists($structs{$1})); 170dabf8be3SMauro Carvalho Chehab next; 171dabf8be3SMauro Carvalho Chehab } 172526b8848SMauro Carvalho Chehab if (m/^ignore\s+symbol\s+(\S+)/) { 173526b8848SMauro Carvalho Chehab delete $enum_symbols{$1} if (exists($enum_symbols{$1})); 174526b8848SMauro Carvalho Chehab next; 175526b8848SMauro Carvalho Chehab } 176dabf8be3SMauro Carvalho Chehab 177dabf8be3SMauro Carvalho Chehab # Parsers to replace a symbol 17822c40033SMauro Carvalho Chehab my ($type, $old, $new, $reftype); 179dabf8be3SMauro Carvalho Chehab 18022c40033SMauro Carvalho Chehab if (m/^replace\s+(\S+)\s+(\S+)\s+(\S+)/) { 18122c40033SMauro Carvalho Chehab $type = $1; 18222c40033SMauro Carvalho Chehab $old = $2; 18322c40033SMauro Carvalho Chehab $new = $3; 18422c40033SMauro Carvalho Chehab } else { 18522c40033SMauro Carvalho Chehab die "Can't parse $file_exceptions: $_"; 18622c40033SMauro Carvalho Chehab } 18722c40033SMauro Carvalho Chehab 18822c40033SMauro Carvalho Chehab if ($new =~ m/^\:c\:(data|func|macro|type)\:\`(.+)\`/) { 18922c40033SMauro Carvalho Chehab $reftype = ":c:$1"; 19022c40033SMauro Carvalho Chehab $new = $2; 19122c40033SMauro Carvalho Chehab } elsif ($new =~ m/\:ref\:\`(.+)\`/) { 19222c40033SMauro Carvalho Chehab $reftype = ":ref"; 19322c40033SMauro Carvalho Chehab $new = $1; 19422c40033SMauro Carvalho Chehab } else { 19522c40033SMauro Carvalho Chehab $reftype = $def_reftype{$type}; 19622c40033SMauro Carvalho Chehab } 19722c40033SMauro Carvalho Chehab $new = "$reftype:`$old <$new>`"; 19822c40033SMauro Carvalho Chehab 19922c40033SMauro Carvalho Chehab if ($type eq "ioctl") { 20022c40033SMauro Carvalho Chehab $ioctls{$old} = $new if (exists($ioctls{$old})); 201dabf8be3SMauro Carvalho Chehab next; 202dabf8be3SMauro Carvalho Chehab } 20322c40033SMauro Carvalho Chehab if ($type eq "define") { 20422c40033SMauro Carvalho Chehab $defines{$old} = $new if (exists($defines{$old})); 205dabf8be3SMauro Carvalho Chehab next; 206dabf8be3SMauro Carvalho Chehab } 20722c40033SMauro Carvalho Chehab if ($type eq "symbol") { 20822c40033SMauro Carvalho Chehab $enum_symbols{$old} = $new if (exists($enum_symbols{$old})); 209dabf8be3SMauro Carvalho Chehab next; 210dabf8be3SMauro Carvalho Chehab } 21122c40033SMauro Carvalho Chehab if ($type eq "typedef") { 21222c40033SMauro Carvalho Chehab $typedefs{$old} = $new if (exists($typedefs{$old})); 213dabf8be3SMauro Carvalho Chehab next; 214dabf8be3SMauro Carvalho Chehab } 21522c40033SMauro Carvalho Chehab if ($type eq "enum") { 21622c40033SMauro Carvalho Chehab $enums{$old} = $new if (exists($enums{$old})); 217dabf8be3SMauro Carvalho Chehab next; 218dabf8be3SMauro Carvalho Chehab } 21922c40033SMauro Carvalho Chehab if ($type eq "struct") { 22022c40033SMauro Carvalho Chehab $structs{$old} = $new if (exists($structs{$old})); 221dabf8be3SMauro Carvalho Chehab next; 222dabf8be3SMauro Carvalho Chehab } 223dabf8be3SMauro Carvalho Chehab 224dabf8be3SMauro Carvalho Chehab die "Can't parse $file_exceptions: $_"; 225dabf8be3SMauro Carvalho Chehab } 226dabf8be3SMauro Carvalho Chehab} 227dabf8be3SMauro Carvalho Chehab 228dabf8be3SMauro Carvalho Chehabif ($debug) { 229dabf8be3SMauro Carvalho Chehab print Data::Dumper->Dump([\%ioctls], [qw(*ioctls)]) if (%ioctls); 230dabf8be3SMauro Carvalho Chehab print Data::Dumper->Dump([\%typedefs], [qw(*typedefs)]) if (%typedefs); 231dabf8be3SMauro Carvalho Chehab print Data::Dumper->Dump([\%enums], [qw(*enums)]) if (%enums); 232dabf8be3SMauro Carvalho Chehab print Data::Dumper->Dump([\%structs], [qw(*structs)]) if (%structs); 233dabf8be3SMauro Carvalho Chehab print Data::Dumper->Dump([\%defines], [qw(*defines)]) if (%defines); 234dabf8be3SMauro Carvalho Chehab print Data::Dumper->Dump([\%enum_symbols], [qw(*enum_symbols)]) if (%enum_symbols); 235dabf8be3SMauro Carvalho Chehab} 236dabf8be3SMauro Carvalho Chehab 237dabf8be3SMauro Carvalho Chehab# 238dabf8be3SMauro Carvalho Chehab# Align block 239dabf8be3SMauro Carvalho Chehab# 240dabf8be3SMauro Carvalho Chehab$data = expand($data); 241dabf8be3SMauro Carvalho Chehab$data = " " . $data; 242dabf8be3SMauro Carvalho Chehab$data =~ s/\n/\n /g; 243dabf8be3SMauro Carvalho Chehab$data =~ s/\n\s+$/\n/g; 244dabf8be3SMauro Carvalho Chehab$data =~ s/\n\s+\n/\n\n/g; 245dabf8be3SMauro Carvalho Chehab 246dabf8be3SMauro Carvalho Chehab# 247dabf8be3SMauro Carvalho Chehab# Add escape codes for special characters 248dabf8be3SMauro Carvalho Chehab# 249999d998eSMauro Carvalho Chehab$data =~ s,([\_\`\*\<\>\&\\\\:\/\|\%\$\#\{\}\~\^]),\\$1,g; 250dabf8be3SMauro Carvalho Chehab 2517d95fa8dSMauro Carvalho Chehab$data =~ s,DEPRECATED,**DEPRECATED**,g; 2527d95fa8dSMauro Carvalho Chehab 253dabf8be3SMauro Carvalho Chehab# 254dabf8be3SMauro Carvalho Chehab# Add references 255dabf8be3SMauro Carvalho Chehab# 256dabf8be3SMauro Carvalho Chehab 2576fe79d1eSMauro Carvalho Chehabmy $start_delim = "[ \n\t\(\=\*\@]"; 2586fe79d1eSMauro Carvalho Chehabmy $end_delim = "(\\s|,|\\\\=|\\\\:|\\;|\\\)|\\}|\\{)"; 259dabf8be3SMauro Carvalho Chehab 260dabf8be3SMauro Carvalho Chehabforeach my $r (keys %ioctls) { 26122c40033SMauro Carvalho Chehab my $s = $ioctls{$r}; 262dabf8be3SMauro Carvalho Chehab 263dabf8be3SMauro Carvalho Chehab $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 264dabf8be3SMauro Carvalho Chehab 265dabf8be3SMauro Carvalho Chehab print "$r -> $s\n" if ($debug); 266dabf8be3SMauro Carvalho Chehab 2676fe79d1eSMauro Carvalho Chehab $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 268dabf8be3SMauro Carvalho Chehab} 269dabf8be3SMauro Carvalho Chehab 270dabf8be3SMauro Carvalho Chehabforeach my $r (keys %defines) { 27122c40033SMauro Carvalho Chehab my $s = $defines{$r}; 272dabf8be3SMauro Carvalho Chehab 273dabf8be3SMauro Carvalho Chehab $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 274dabf8be3SMauro Carvalho Chehab 275dabf8be3SMauro Carvalho Chehab print "$r -> $s\n" if ($debug); 276dabf8be3SMauro Carvalho Chehab 2776fe79d1eSMauro Carvalho Chehab $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 278dabf8be3SMauro Carvalho Chehab} 279dabf8be3SMauro Carvalho Chehab 280dabf8be3SMauro Carvalho Chehabforeach my $r (keys %enum_symbols) { 28122c40033SMauro Carvalho Chehab my $s = $enum_symbols{$r}; 282dabf8be3SMauro Carvalho Chehab 283dabf8be3SMauro Carvalho Chehab $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 284dabf8be3SMauro Carvalho Chehab 285dabf8be3SMauro Carvalho Chehab print "$r -> $s\n" if ($debug); 286dabf8be3SMauro Carvalho Chehab 2876fe79d1eSMauro Carvalho Chehab $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 288dabf8be3SMauro Carvalho Chehab} 289dabf8be3SMauro Carvalho Chehab 290dabf8be3SMauro Carvalho Chehabforeach my $r (keys %enums) { 29122c40033SMauro Carvalho Chehab my $s = $enums{$r}; 292dabf8be3SMauro Carvalho Chehab 293dabf8be3SMauro Carvalho Chehab $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 294dabf8be3SMauro Carvalho Chehab 295dabf8be3SMauro Carvalho Chehab print "$r -> $s\n" if ($debug); 296dabf8be3SMauro Carvalho Chehab 2976fe79d1eSMauro Carvalho Chehab $data =~ s/enum\s+($r)$end_delim/$s$2/g; 298dabf8be3SMauro Carvalho Chehab} 299dabf8be3SMauro Carvalho Chehab 300dabf8be3SMauro Carvalho Chehabforeach my $r (keys %structs) { 30122c40033SMauro Carvalho Chehab my $s = $structs{$r}; 302dabf8be3SMauro Carvalho Chehab 303dabf8be3SMauro Carvalho Chehab $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 304dabf8be3SMauro Carvalho Chehab 305dabf8be3SMauro Carvalho Chehab print "$r -> $s\n" if ($debug); 306dabf8be3SMauro Carvalho Chehab 3076fe79d1eSMauro Carvalho Chehab $data =~ s/struct\s+($r)$end_delim/$s$2/g; 308dabf8be3SMauro Carvalho Chehab} 309dabf8be3SMauro Carvalho Chehab 310dabf8be3SMauro Carvalho Chehabforeach my $r (keys %typedefs) { 31122c40033SMauro Carvalho Chehab my $s = $typedefs{$r}; 312dabf8be3SMauro Carvalho Chehab 313dabf8be3SMauro Carvalho Chehab $r =~ s,([\_\`\*\<\>\&\\\\:\/]),\\\\$1,g; 314dabf8be3SMauro Carvalho Chehab 315dabf8be3SMauro Carvalho Chehab print "$r -> $s\n" if ($debug); 3166fe79d1eSMauro Carvalho Chehab $data =~ s/($start_delim)($r)$end_delim/$1$s$3/g; 317dabf8be3SMauro Carvalho Chehab} 318dabf8be3SMauro Carvalho Chehab 31922c40033SMauro Carvalho Chehab$data =~ s/\\ ([\n\s])/\1/g; 320fb6fc6c9SMauro Carvalho Chehab 321dabf8be3SMauro Carvalho Chehab# 322dabf8be3SMauro Carvalho Chehab# Generate output file 323dabf8be3SMauro Carvalho Chehab# 324dabf8be3SMauro Carvalho Chehab 325dabf8be3SMauro Carvalho Chehabmy $title = $file_in; 326dabf8be3SMauro Carvalho Chehab$title =~ s,.*/,,; 327dabf8be3SMauro Carvalho Chehab 328dabf8be3SMauro Carvalho Chehabopen OUT, "> $file_out" or die "Can't open $file_out"; 329dabf8be3SMauro Carvalho Chehabprint OUT ".. -*- coding: utf-8; mode: rst -*-\n\n"; 330dabf8be3SMauro Carvalho Chehabprint OUT "$title\n"; 331dabf8be3SMauro Carvalho Chehabprint OUT "=" x length($title); 332dabf8be3SMauro Carvalho Chehabprint OUT "\n\n.. parsed-literal::\n\n"; 333dabf8be3SMauro Carvalho Chehabprint OUT $data; 334dabf8be3SMauro Carvalho Chehabclose OUT; 335327f5a75SMauro Carvalho Chehab 336327f5a75SMauro Carvalho Chehab__END__ 337327f5a75SMauro Carvalho Chehab 338327f5a75SMauro Carvalho Chehab=head1 NAME 339327f5a75SMauro Carvalho Chehab 340327f5a75SMauro Carvalho Chehabparse_headers.pl - parse a C file, in order to identify functions, structs, 341327f5a75SMauro Carvalho Chehabenums and defines and create cross-references to a Sphinx book. 342327f5a75SMauro Carvalho Chehab 343327f5a75SMauro Carvalho Chehab=head1 SYNOPSIS 344327f5a75SMauro Carvalho Chehab 345327f5a75SMauro Carvalho ChehabB<parse_headers.pl> [<options>] <C_FILE> <OUT_FILE> [<EXCEPTIONS_FILE>] 346327f5a75SMauro Carvalho Chehab 347f3821276SFederico VagaWhere <options> can be: --debug, --help or --usage. 348327f5a75SMauro Carvalho Chehab 349327f5a75SMauro Carvalho Chehab=head1 OPTIONS 350327f5a75SMauro Carvalho Chehab 351327f5a75SMauro Carvalho Chehab=over 8 352327f5a75SMauro Carvalho Chehab 353327f5a75SMauro Carvalho Chehab=item B<--debug> 354327f5a75SMauro Carvalho Chehab 355327f5a75SMauro Carvalho ChehabPut the script in verbose mode, useful for debugging. 356327f5a75SMauro Carvalho Chehab 357c3396656SMauro Carvalho Chehab=item B<--usage> 358327f5a75SMauro Carvalho Chehab 359327f5a75SMauro Carvalho ChehabPrints a brief help message and exits. 360327f5a75SMauro Carvalho Chehab 361c3396656SMauro Carvalho Chehab=item B<--help> 362327f5a75SMauro Carvalho Chehab 363c3396656SMauro Carvalho ChehabPrints a more detailed help message and exits. 364327f5a75SMauro Carvalho Chehab 365327f5a75SMauro Carvalho Chehab=back 366327f5a75SMauro Carvalho Chehab 367327f5a75SMauro Carvalho Chehab=head1 DESCRIPTION 368327f5a75SMauro Carvalho Chehab 369327f5a75SMauro Carvalho ChehabConvert a C header or source file (C_FILE), into a ReStructured Text 370327f5a75SMauro Carvalho Chehabincluded via ..parsed-literal block with cross-references for the 371327f5a75SMauro Carvalho Chehabdocumentation files that describe the API. It accepts an optional 372327f5a75SMauro Carvalho ChehabEXCEPTIONS_FILE with describes what elements will be either ignored or 373327f5a75SMauro Carvalho Chehabbe pointed to a non-default reference. 374327f5a75SMauro Carvalho Chehab 375327f5a75SMauro Carvalho ChehabThe output is written at the (OUT_FILE). 376327f5a75SMauro Carvalho Chehab 377327f5a75SMauro Carvalho ChehabIt is capable of identifying defines, functions, structs, typedefs, 378327f5a75SMauro Carvalho Chehabenums and enum symbols and create cross-references for all of them. 379327f5a75SMauro Carvalho ChehabIt is also capable of distinguish #define used for specifying a Linux 380327f5a75SMauro Carvalho Chehabioctl. 381327f5a75SMauro Carvalho Chehab 382c3396656SMauro Carvalho ChehabThe EXCEPTIONS_FILE contain two rules to allow ignoring a symbol or 383c3396656SMauro Carvalho Chehabto replace the default references by a custom one. 384327f5a75SMauro Carvalho Chehab 385c3396656SMauro Carvalho ChehabPlease read Documentation/doc-guide/parse-headers.rst at the Kernel's 386c3396656SMauro Carvalho Chehabtree for more details. 387327f5a75SMauro Carvalho Chehab 388327f5a75SMauro Carvalho Chehab=head1 BUGS 389327f5a75SMauro Carvalho Chehab 39032590819SMauro Carvalho ChehabReport bugs to Mauro Carvalho Chehab <[email protected]> 391327f5a75SMauro Carvalho Chehab 392327f5a75SMauro Carvalho Chehab=head1 COPYRIGHT 393327f5a75SMauro Carvalho Chehab 39432590819SMauro Carvalho ChehabCopyright (c) 2016 by Mauro Carvalho Chehab <[email protected]>. 395327f5a75SMauro Carvalho Chehab 396a5989e29SAlexander A. KlimovLicense GPLv2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>. 397327f5a75SMauro Carvalho Chehab 398327f5a75SMauro Carvalho ChehabThis is free software: you are free to change and redistribute it. 399327f5a75SMauro Carvalho ChehabThere is NO WARRANTY, to the extent permitted by law. 400327f5a75SMauro Carvalho Chehab 401327f5a75SMauro Carvalho Chehab=cut 402