Mercurial > dropbear
view libtommath/booker.pl @ 447:278805938dcf
Patch from Nicolai Ehemann to try binding before going to the background,
so that if it exits early (because something's already listening etc)
then it will return an exitcode of 1.
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 19 Jul 2007 15:54:18 +0000 |
parents | 5ff8218bcee9 |
children | 60fc6476e044 |
line wrap: on
line source
#!/bin/perl # #Used to prepare the book "tommath.src" for LaTeX by pre-processing it into a .tex file # #Essentially you write the "tommath.src" as normal LaTex except where you want code snippets you put # #EXAM,file # #This preprocessor will then open "file" and insert it as a verbatim copy. # #Tom St Denis #get graphics type if (shift =~ /PDF/) { $graph = ""; } else { $graph = ".ps"; } open(IN,"<tommath.src") or die "Can't open source file"; open(OUT,">tommath.tex") or die "Can't open destination file"; print "Scanning for sections\n"; $chapter = $section = $subsection = 0; $x = 0; while (<IN>) { print "."; if (!(++$x % 80)) { print "\n"; } #update the headings if (~($_ =~ /\*/)) { if ($_ =~ /\\chapter{.+}/) { ++$chapter; $section = $subsection = 0; } elsif ($_ =~ /\\section{.+}/) { ++$section; $subsection = 0; } elsif ($_ =~ /\\subsection{.+}/) { ++$subsection; } } if ($_ =~ m/MARK/) { @m = split(",",$_); chomp(@m[1]); $index1{@m[1]} = $chapter; $index2{@m[1]} = $section; $index3{@m[1]} = $subsection; } } close(IN); open(IN,"<tommath.src") or die "Can't open source file"; $readline = $wroteline = 0; $srcline = 0; while (<IN>) { ++$readline; ++$srcline; if ($_ =~ m/MARK/) { } elsif ($_ =~ m/EXAM/ || $_ =~ m/LIST/) { if ($_ =~ m/EXAM/) { $skipheader = 1; } else { $skipheader = 0; } # EXAM,file chomp($_); @m = split(",",$_); open(SRC,"<$m[1]") or die "Error:$srcline:Can't open source file $m[1]"; print "$srcline:Inserting $m[1]:"; $line = 0; $tmp = $m[1]; $tmp =~ s/_/"\\_"/ge; print OUT "\\vspace{+3mm}\\begin{small}\n\\hspace{-5.1mm}{\\bf File}: $tmp\n\\vspace{-3mm}\n\\begin{alltt}\n"; $wroteline += 5; if ($skipheader == 1) { # scan till next end of comment, e.g. skip license while (<SRC>) { $text[$line++] = $_; last if ($_ =~ /math\.libtomcrypt\.com/); } <SRC>; } $inline = 0; while (<SRC>) { next if ($_ =~ /\$Source/); next if ($_ =~ /\$Revision/); next if ($_ =~ /\$Date/); $text[$line++] = $_; ++$inline; chomp($_); $_ =~ s/\t/" "/ge; $_ =~ s/{/"^{"/ge; $_ =~ s/}/"^}"/ge; $_ =~ s/\\/'\symbol{92}'/ge; $_ =~ s/\^/"\\"/ge; printf OUT ("%03d ", $line); for ($x = 0; $x < length($_); $x++) { print OUT chr(vec($_, $x, 8)); if ($x == 75) { print OUT "\n "; ++$wroteline; } } print OUT "\n"; ++$wroteline; } $totlines = $line; print OUT "\\end{alltt}\n\\end{small}\n"; close(SRC); print "$inline lines\n"; $wroteline += 2; } elsif ($_ =~ m/@\d+,.+@/) { # line contains [number,text] # e.g. @14,for (ix = 0)@ $txt = $_; while ($txt =~ m/@\d+,.+@/) { @m = split("@",$txt); # splits into text, one, two @parms = split(",",$m[1]); # splits one,two into two elements # now search from $parms[0] down for $parms[1] $found1 = 0; $found2 = 0; for ($i = $parms[0]; $i < $totlines && $found1 == 0; $i++) { if ($text[$i] =~ m/\Q$parms[1]\E/) { $foundline1 = $i + 1; $found1 = 1; } } # now search backwards for ($i = $parms[0] - 1; $i >= 0 && $found2 == 0; $i--) { if ($text[$i] =~ m/\Q$parms[1]\E/) { $foundline2 = $i + 1; $found2 = 1; } } # now use the closest match or the first if tied if ($found1 == 1 && $found2 == 0) { $found = 1; $foundline = $foundline1; } elsif ($found1 == 0 && $found2 == 1) { $found = 1; $foundline = $foundline2; } elsif ($found1 == 1 && $found2 == 1) { $found = 1; if (($foundline1 - $parms[0]) <= ($parms[0] - $foundline2)) { $foundline = $foundline1; } else { $foundline = $foundline2; } } else { $found = 0; } # if found replace if ($found == 1) { $delta = $parms[0] - $foundline; print "Found replacement tag for \"$parms[1]\" on line $srcline which refers to line $foundline (delta $delta)\n"; $_ =~ s/@\Q$m[1]\E@/$foundline/; } else { print "ERROR: The tag \"$parms[1]\" on line $srcline was not found in the most recently parsed source!\n"; } # remake the rest of the line $cnt = @m; $txt = ""; for ($i = 2; $i < $cnt; $i++) { $txt = $txt . $m[$i] . "@"; } } print OUT $_; ++$wroteline; } elsif ($_ =~ /~.+~/) { # line contains a ~text~ pair used to refer to indexing :-) $txt = $_; while ($txt =~ /~.+~/) { @m = split("~", $txt); # word is the second position $word = @m[1]; $a = $index1{$word}; $b = $index2{$word}; $c = $index3{$word}; # if chapter (a) is zero it wasn't found if ($a == 0) { print "ERROR: the tag \"$word\" on line $srcline was not found previously marked.\n"; } else { # format the tag as x, x.y or x.y.z depending on the values $str = $a; $str = $str . ".$b" if ($b != 0); $str = $str . ".$c" if ($c != 0); if ($b == 0 && $c == 0) { # its a chapter if ($a <= 10) { if ($a == 1) { $str = "chapter one"; } elsif ($a == 2) { $str = "chapter two"; } elsif ($a == 3) { $str = "chapter three"; } elsif ($a == 4) { $str = "chapter four"; } elsif ($a == 5) { $str = "chapter five"; } elsif ($a == 6) { $str = "chapter six"; } elsif ($a == 7) { $str = "chapter seven"; } elsif ($a == 8) { $str = "chapter eight"; } elsif ($a == 9) { $str = "chapter nine"; } elsif ($a == 10) { $str = "chapter ten"; } } else { $str = "chapter " . $str; } } else { $str = "section " . $str if ($b != 0 && $c == 0); $str = "sub-section " . $str if ($b != 0 && $c != 0); } #substitute $_ =~ s/~\Q$word\E~/$str/; print "Found replacement tag for marker \"$word\" on line $srcline which refers to $str\n"; } # remake rest of the line $cnt = @m; $txt = ""; for ($i = 2; $i < $cnt; $i++) { $txt = $txt . $m[$i] . "~"; } } print OUT $_; ++$wroteline; } elsif ($_ =~ m/FIGU/) { # FIGU,file,caption chomp($_); @m = split(",", $_); print OUT "\\begin{center}\n\\begin{figure}[here]\n\\includegraphics{pics/$m[1]$graph}\n"; print OUT "\\caption{$m[2]}\n\\label{pic:$m[1]}\n\\end{figure}\n\\end{center}\n"; $wroteline += 4; } else { print OUT $_; ++$wroteline; } } print "Read $readline lines, wrote $wroteline lines\n"; close (OUT); close (IN);