| 
									
										
										
										
											2011-11-08 17:43:19 +01:00
										 |  |  | #! /usr/bin/perl | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-08 17:43:19 +01:00
										 |  |  | use warnings; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | use strict; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-08 17:44:12 +01:00
										 |  |  | sub visitDir($) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     my ($dir) = @_; | 
					
						
							|  |  |  |     my @ret = (); | 
					
						
							|  |  |  |     my @subret = (); | 
					
						
							|  |  |  |     opendir DIR, $dir or die "$dir: $!\n"; | 
					
						
							|  |  |  |     my @ents = readdir DIR; | 
					
						
							|  |  |  |     closedir DIR; | 
					
						
							|  |  |  |     for my $ent (grep !/^\./, @ents) { | 
					
						
							|  |  |  |         my $ret = $dir."/".$ent; | 
					
						
							|  |  |  |         if (-d $ret) { | 
					
						
							|  |  |  |             push @subret, &visitDir($ret); | 
					
						
							|  |  |  |         } elsif ($ret =~ /\.qdoc$/) { | 
					
						
							|  |  |  |             push @ret, $ret; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return @ret, @subret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  | my @files = (); | 
					
						
							|  |  |  | my %defines = (); | 
					
						
							|  |  |  | for (@ARGV) { | 
					
						
							|  |  |  |     if (/^-D(.*)$/) { | 
					
						
							|  |  |  |         $defines{$1} = 1; | 
					
						
							|  |  |  |     } elsif (/^-/) { | 
					
						
							|  |  |  |         printf STDERR "Unknown option '".$_."'\n"; | 
					
						
							|  |  |  |         exit 1; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-11-08 17:44:12 +01:00
										 |  |  |         if (-d $_) { | 
					
						
							|  |  |  |             push @files, visitDir($_); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             push @files, $_; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-08 17:43:58 +01:00
										 |  |  | int(@files) or die "usage: $0 [-D<define>]... <qdoc-file>...\n"; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | my @toc = (); | 
					
						
							| 
									
										
										
										
											2015-09-21 16:07:50 +02:00
										 |  |  | my %title2type = (); | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | my %title2page = (); | 
					
						
							|  |  |  | my $doctitle = ""; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  | my %prev_skips = (); | 
					
						
							|  |  |  | my %next_skips = (); | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  | my %prev_define_skips = (); | 
					
						
							|  |  |  | my %next_define_skips = (); | 
					
						
							|  |  |  | my %prev_polarity_skips = (); | 
					
						
							|  |  |  | my %next_polarity_skips = (); | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  | for my $file (@files) { | 
					
						
							| 
									
										
										
										
											2015-09-21 16:07:50 +02:00
										 |  |  |     my ($curtype, $curpage, $inhdr, $havetoc, $intoc, $inif) = ("", 0, 0, 0, 0); | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |     my ($define_skip, $polarity_skip, $skipping) = ("", 0, 0); | 
					
						
							|  |  |  |     my ($prev_define_skip, $prev_polarity_skip, $prev_skip, | 
					
						
							|  |  |  |         $next_define_skip, $next_polarity_skip, $next_skip) = ("", 0, "", "", 0, ""); | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |     open FILE, $file or die "File $file cannot be opened.\n"; | 
					
						
							|  |  |  |     while (<FILE>) { | 
					
						
							|  |  |  |         if (/^\h*\\if\h+defined\h*\(\h*(\H+)\h*\)/) { | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |             die "Nested \\if at $file:$.\n" if ($inif); | 
					
						
							|  |  |  |             $inif = 1; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |             $skipping = !defined($defines{$1}); | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |             if ($inhdr) { | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                 $define_skip = $1; | 
					
						
							|  |  |  |                 $polarity_skip = $skipping; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } elsif (/^\h*\\else/) { | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |             die "Unmatched \\else in $file:$.\n" if (!$inif); | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |             $skipping = 1 - $skipping; | 
					
						
							|  |  |  |         } elsif (/^\h*\\endif/) { | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |             die "Unmatched \\endif in $file:$.\n" if (!$inif); | 
					
						
							|  |  |  |             $inif = 0; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |             $skipping = 0; | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |             $define_skip = ""; | 
					
						
							| 
									
										
										
										
											2013-11-01 19:22:50 +01:00
										 |  |  |         } elsif (keys(%title2page) == 1 && /^\h*\\section1 Table Of Contents/) { | 
					
						
							|  |  |  |             $havetoc = 1; | 
					
						
							|  |  |  |         } elsif ($havetoc && /^\h*\\list/) { | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |             $intoc++; | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |         } elsif ($intoc) { | 
					
						
							|  |  |  |             if (/^\h*\\endlist/) { | 
					
						
							|  |  |  |                 $intoc--; | 
					
						
							| 
									
										
										
										
											2013-02-28 11:41:22 +01:00
										 |  |  |             } elsif (!$skipping && /^\h*\\li\h+\\l\h*{(.*)}$/) { | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |                 push @toc, $1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } elsif ($inhdr) { | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |             if (/^\h*\\previouspage\h+(\H+)/) { | 
					
						
							|  |  |  |                 $prev_skip = $1 if ($skipping); | 
					
						
							|  |  |  |                 ($prev_define_skip, $prev_polarity_skip) = ($define_skip, $polarity_skip); | 
					
						
							|  |  |  |             } elsif (/^\h*\\nextpage\h+(\H+)/) { | 
					
						
							|  |  |  |                 $next_skip = $1 if ($skipping); | 
					
						
							|  |  |  |                 ($next_define_skip, $next_polarity_skip) = ($define_skip, $polarity_skip); | 
					
						
							| 
									
										
										
										
											2015-09-21 16:07:50 +02:00
										 |  |  |             } elsif (/^\h*\\(page|example)\h+(\H+)/) { | 
					
						
							|  |  |  |                 $curtype = $1; | 
					
						
							|  |  |  |                 $curpage = $2; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |             } elsif (/^\h*\\title\h+(.+)$/) { | 
					
						
							|  |  |  |                 if ($curpage eq "") { | 
					
						
							| 
									
										
										
										
											2015-09-21 16:07:50 +02:00
										 |  |  |                     die "Title '$1' appears in no \\page or \\example.\n"; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |                 if (length($prev_define_skip)) { | 
					
						
							|  |  |  |                     ($prev_define_skips{$1}, $prev_polarity_skips{$1}, $prev_skips{$1}) = | 
					
						
							|  |  |  |                             ($prev_define_skip, $prev_polarity_skip, $prev_skip); | 
					
						
							|  |  |  |                     $prev_define_skip = $prev_skip = ""; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (length($next_define_skip)) { | 
					
						
							|  |  |  |                     ($next_define_skips{$1}, $next_polarity_skips{$1}, $next_skips{$1}) = | 
					
						
							|  |  |  |                             ($next_define_skip, $next_polarity_skip, $next_skip); | 
					
						
							|  |  |  |                     $next_define_skip = $next_skip = ""; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2015-09-21 16:07:50 +02:00
										 |  |  |                 $title2type{$1} = $curtype; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                 $title2page{$1} = $curpage; | 
					
						
							|  |  |  |                 $doctitle = $1 if (!$doctitle); | 
					
						
							|  |  |  |                 $curpage = ""; | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |                 $inhdr = 0; | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |             if (/^\h*\\contentspage\b/) { | 
					
						
							| 
									
										
										
										
											2013-11-01 19:22:50 +01:00
										 |  |  |                 $havetoc = 0; | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |                 $inhdr = 1; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-11-08 20:08:26 +01:00
										 |  |  |     die "Missing \\title in $file\n" if ($inhdr); | 
					
						
							|  |  |  |     die "Unclosed TOC in $file\n" if ($intoc); | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |     close FILE; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my %prev = (); | 
					
						
							|  |  |  | my %next = (); | 
					
						
							|  |  |  | my $last = $doctitle; | 
					
						
							| 
									
										
										
										
											2013-11-01 19:21:07 +01:00
										 |  |  | my $lastpage = $title2page{$last}; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | for my $title (@toc) { | 
					
						
							| 
									
										
										
										
											2013-11-01 19:21:07 +01:00
										 |  |  |     my $page = $title2page{$title}; | 
					
						
							| 
									
										
										
										
											2015-09-21 16:07:50 +02:00
										 |  |  |     defined($page) or die "TOC refers to unknown page/example '$title'.\n"; | 
					
						
							| 
									
										
										
										
											2013-11-01 19:21:07 +01:00
										 |  |  |     $next{$last} = $page; | 
					
						
							|  |  |  |     $prev{$title} = $lastpage; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  |     $last = $title; | 
					
						
							| 
									
										
										
										
											2013-11-01 19:21:07 +01:00
										 |  |  |     $lastpage = $page; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  | for my $file (@files) { | 
					
						
							|  |  |  |     open IN, $file or die "File $file cannot be opened a second time?!\n"; | 
					
						
							|  |  |  |     open OUT, '>'.$file.".out" or die "File $file.out cannot be created.\n"; | 
					
						
							|  |  |  |     my $cutting = 0; | 
					
						
							|  |  |  |     while (<IN>) { | 
					
						
							|  |  |  |         if (!$cutting) { | 
					
						
							|  |  |  |             if (/^\h*\\contentspage/) { | 
					
						
							|  |  |  |                 $cutting = 1; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |             if (/^\h*\\title\h+(.+)$/) { | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |                 if (defined($prev_define_skips{$1})) { | 
					
						
							|  |  |  |                     print OUT "    \\if defined(".$prev_define_skips{$1}.")\n"; | 
					
						
							|  |  |  |                     if ($prev_polarity_skips{$1}) { | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                         print OUT "    \\previouspage ".$prev_skips{$1} if ($prev_skips{$1}); | 
					
						
							|  |  |  |                         print OUT "    \\else\n"; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 print OUT "    \\previouspage ".$prev{$1} if ($prev{$1}); | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |                 if (defined($prev_define_skips{$1})) { | 
					
						
							|  |  |  |                     if (!$prev_polarity_skips{$1}) { | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                         print OUT "    \\else\n"; | 
					
						
							|  |  |  |                         print OUT "    \\previouspage ".$prev_skips{$1} if ($prev_skips{$1}); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     print OUT "    \\endif\n"; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2015-09-21 16:07:50 +02:00
										 |  |  |                 print OUT "    \\".$title2type{$1}." ".$title2page{$1}; | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |                 if (defined($next_define_skips{$1})) { | 
					
						
							|  |  |  |                     print OUT "    \\if defined(".$next_define_skips{$1}.")\n"; | 
					
						
							|  |  |  |                     if ($next_polarity_skips{$1}) { | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                         print OUT "    \\nextpage ".$next_skips{$1} if ($next_skips{$1}); | 
					
						
							|  |  |  |                         print OUT "    \\else\n"; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 print OUT "    \\nextpage ".$next{$1} if ($next{$1}); | 
					
						
							| 
									
										
										
										
											2012-01-06 17:45:46 +01:00
										 |  |  |                 if (defined($next_define_skips{$1})) { | 
					
						
							|  |  |  |                     if (!$next_polarity_skips{$1}) { | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |                         print OUT "    \\else\n"; | 
					
						
							|  |  |  |                         print OUT "    \\nextpage ".$next_skips{$1} if ($next_skips{$1}); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     print OUT "    \\endif\n"; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 print OUT "\n"; | 
					
						
							|  |  |  |                 $cutting = 0; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 next; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |         print OUT $_; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-12-08 14:46:26 +01:00
										 |  |  |     close OUT; | 
					
						
							|  |  |  |     close IN; | 
					
						
							|  |  |  |     rename($file.".out", $file) or die "Cannot replace $file with new version.\n"; | 
					
						
							| 
									
										
										
										
											2009-11-24 17:27:59 +01:00
										 |  |  | } |