summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2006-09-07 13:07:29 +0000
committerrsc <rsc>2006-09-07 13:07:29 +0000
commit7678a19ecf6fc9d8f0ded5b590df4e3499701139 (patch)
treeddfe0015251b7d8bf61f1cf5bfac31ae6c82f469
parent44e6909a6d33689cefb283ecb91dfe1d874f8e0b (diff)
downloadxv6-labs-7678a19ecf6fc9d8f0ded5b590df4e3499701139.tar.gz
xv6-labs-7678a19ecf6fc9d8f0ded5b590df4e3499701139.tar.bz2
xv6-labs-7678a19ecf6fc9d8f0ded5b590df4e3499701139.zip
better page breaks
-rwxr-xr-xrunoff97
1 files changed, 89 insertions, 8 deletions
diff --git a/runoff b/runoff
index 1d0fbb5..5a1b556 100755
--- a/runoff
+++ b/runoff
@@ -16,13 +16,94 @@ files=`grep -v '^#' runoff.list | awk '{print $1}'`
n=99
for i in $files
do
- awk -v 'n='$n '
- BEGIN{n=int((n+49)/50)*50-1; nb=0; nr=0}
- NF==0 { nb++; next }
- {for(i=0; i<nb; i++) printf("%04d\n", n+ ++nr); nb=0; printf("%04d %s\n", n+ ++nr, $0)}
- END{for(nr++; nr%50 != 1; nr++) printf("%04d\n", n+nr);}
- ' $i >fmt/$i
- n=`tail -1 fmt/$i | awk '{print $1}'`
+ perl -e '$n='$n';' -e '
+ $n = int(($n+49)/50)*50 - 1;
+
+ @lines = <>;
+ foreach (@lines) {
+ chomp;
+ s/\s+$//;
+ if(length() >= 75){
+ print "$ARGV[0]:$.: line too long";
+ }
+ }
+ @outlines = ();
+ $nextout = 0;
+ for($i=0; $i<@lines; ){
+ # Skip leading blank lines.
+ $i++ while $i<@lines && $lines[$i] =~ /^$/;
+ last if $i>=@lines;
+
+ # If the rest of the file fits, use the whole thing.
+ if(@lines <= $i+50){
+ $breakbefore = @lines;
+ }else{
+ # Find a good next page break;
+ # Hope for end of function.
+ # but settle for a blank line (but not first blank line
+ # in function, which comes after variable declarations).
+ $breakbefore = $i;
+ $lastblank = $i;
+ $sawbrace = 0;
+ $breaksize = 15; # 15 lines to get to function
+ for($j=$i; $j<$i+50 && $j < @lines; $j++){
+ if($lines[$j] =~ /PAGEBREAK:\s*([0-9]+)/){
+ $breaksize = int($2);
+ $breakbefore = $j;
+ $lines[$j] = "";
+ }
+ if($lines[$j] =~ /^}$/){
+ $breakbefore = $j+1;
+ }
+ if($lines[$j] =~ /^{$/){
+ $sawbrace = 1;
+ }
+ if($lines[$j] =~ /^$/){
+ if($sawbrace){
+ $sawbrace = 0;
+ }else{
+ $lastblank = $j;
+ }
+ }
+ }
+ if($j<@lines && $lines[$j] =~ /^$/){
+ $lastblank = $j;
+ }
+
+ # If we are not putting enough on a page, try a blank line.
+ if($breakbefore - $i < 50 - $breaksize && $lastblank > $breakbefore && $lastblank >= $i+50 - 5){
+ $breakbefore = $lastblank;
+ $breaksize = 5; # only 5 lines to get to blank line
+ }
+
+ # If we are not putting enough on a page, force a full page.
+ if($breakbefore - $i < 50 - $breaksize && $breakbefore != @lines){
+ $breakbefore = $i + 50;
+ $breakbefore = @lines if @lines < $breakbefore;
+ }
+
+ if($breakbefore < $i+2){
+ $breakbefore = $i+2;
+ }
+ }
+
+ # Emit the page.
+ $i50 = $i + 50;
+ for(; $i<$breakbefore; $i++){
+ printf "%04d %s\n", ++$n, $lines[$i];
+ }
+
+ # Finish page
+ for($j=$i; $j<$i50; $j++){
+ printf "%04d \n", ++$n;
+ }
+ }
+ ' $i >fmt/$i
+
+ nn=`tail -1 fmt/$i | sed 's/ .*//; s/^0*//'`
+ if [ "x$nn" != x ]; then
+ n=$nn
+ fi
done
# create table of contents
@@ -117,7 +198,7 @@ awk '
# format the whole thing
(
pr -l60 -e8 README
- pr -l60 -e8 -2 toc
+ pr -l60 -h "table of contents" -e8 -2 toc
pr -l60 -h "definitions" -2 t.defs | pad
pr -l60 -h "cross-references" -2 refs | pad
for i in $files