1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#!/bin/perl
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#Used to prepare the book "tommath.src" for LaTeX by pre-processing it into a .tex file
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#Essentially you write the "tommath.src" as normal LaTex except where you want code snippets you put
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#EXAM,file
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#This preprocessor will then open "file" and insert it as a verbatim copy.
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#Tom St Denis
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#get graphics type
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectif (shift =~ /PDF/) {
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   $graph = "";
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} else {
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   $graph = ".ps";
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectopen(IN,"<tommath.src") or die "Can't open source file";
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectopen(OUT,">tommath.tex") or die "Can't open destination file";
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "Scanning for sections\n";
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project$chapter = $section = $subsection = 0;
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project$x = 0;
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectwhile (<IN>) {
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   print ".";
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (!(++$x % 80)) { print "\n"; }
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #update the headings
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (~($_ =~ /\*/)) {
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if ($_ =~ /\\chapter{.+}/) {
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          ++$chapter;
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          $section = $subsection = 0;
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      } elsif ($_ =~ /\\section{.+}/) {
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          ++$section;
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          $subsection = 0;
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      } elsif ($_ =~ /\\subsection{.+}/) {
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          ++$subsection;
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ($_ =~ m/MARK/) {
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      @m = split(",",$_);
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      chomp(@m[1]);
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $index1{@m[1]} = $chapter;
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $index2{@m[1]} = $section;
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $index3{@m[1]} = $subsection;
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectclose(IN);
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectopen(IN,"<tommath.src") or die "Can't open source file";
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project$readline = $wroteline = 0;
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project$srcline = 0;
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectwhile (<IN>) {
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ++$readline;
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ++$srcline;
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ($_ =~ m/MARK/) {
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } elsif ($_ =~ m/EXAM/ || $_ =~ m/LIST/) {
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if ($_ =~ m/EXAM/) {
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $skipheader = 1;
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      } else {
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $skipheader = 0;
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      # EXAM,file
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      chomp($_);
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      @m = split(",",$_);
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      open(SRC,"<$m[1]") or die "Error:$srcline:Can't open source file $m[1]";
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print "$srcline:Inserting $m[1]:";
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $line = 0;
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $tmp = $m[1];
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $tmp =~ s/_/"\\_"/ge;
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT "\\vspace{+3mm}\\begin{small}\n\\hspace{-5.1mm}{\\bf File}: $tmp\n\\vspace{-3mm}\n\\begin{alltt}\n";
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $wroteline += 5;
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if ($skipheader == 1) {
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         # scan till next end of comment, e.g. skip license
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         while (<SRC>) {
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            $text[$line++] = $_;
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            last if ($_ =~ /math\.libtomcrypt\.com/);
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         }
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         <SRC>;
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $inline = 0;
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      while (<SRC>) {
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      next if ($_ =~ /\$Source/);
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      next if ($_ =~ /\$Revision/);
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      next if ($_ =~ /\$Date/);
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $text[$line++] = $_;
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         ++$inline;
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         chomp($_);
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $_ =~ s/\t/"    "/ge;
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $_ =~ s/{/"^{"/ge;
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $_ =~ s/}/"^}"/ge;
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $_ =~ s/\\/'\symbol{92}'/ge;
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $_ =~ s/\^/"\\"/ge;
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         printf OUT ("%03d   ", $line);
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         for ($x = 0; $x < length($_); $x++) {
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             print OUT chr(vec($_, $x, 8));
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             if ($x == 75) {
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                 print OUT "\n      ";
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                 ++$wroteline;
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             }
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         }
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         print OUT "\n";
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         ++$wroteline;
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $totlines = $line;
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT "\\end{alltt}\n\\end{small}\n";
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      close(SRC);
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print "$inline lines\n";
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $wroteline += 2;
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } elsif ($_ =~ m/@\d+,.+@/) {
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     # line contains [number,text]
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     # e.g. @14,for (ix = 0)@
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     $txt = $_;
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     while ($txt =~ m/@\d+,.+@/) {
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        @m = split("@",$txt);      # splits into text, one, two
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        @parms = split(",",$m[1]);  # splits one,two into two elements
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        # now search from $parms[0] down for $parms[1]
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        $found1 = 0;
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        $found2 = 0;
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        for ($i = $parms[0]; $i < $totlines && $found1 == 0; $i++) {
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ($text[$i] =~ m/\Q$parms[1]\E/) {
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              $foundline1 = $i + 1;
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              $found1 = 1;
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        # now search backwards
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        for ($i = $parms[0] - 1; $i >= 0 && $found2 == 0; $i--) {
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if ($text[$i] =~ m/\Q$parms[1]\E/) {
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              $foundline2 = $i + 1;
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              $found2 = 1;
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        # now use the closest match or the first if tied
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ($found1 == 1 && $found2 == 0) {
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $found = 1;
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $foundline = $foundline1;
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        } elsif ($found1 == 0 && $found2 == 1) {
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $found = 1;
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $foundline = $foundline2;
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        } elsif ($found1 == 1 && $found2 == 1) {
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $found = 1;
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           if (($foundline1 - $parms[0]) <= ($parms[0] - $foundline2)) {
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              $foundline = $foundline1;
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           } else {
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project              $foundline = $foundline2;
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           }
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        } else {
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $found = 0;
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        # if found replace
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        if ($found == 1) {
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $delta = $parms[0] - $foundline;
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           print "Found replacement tag for \"$parms[1]\" on line $srcline which refers to line $foundline (delta $delta)\n";
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           $_ =~ s/@\Q$m[1]\E@/$foundline/;
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        } else {
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           print "ERROR:  The tag \"$parms[1]\" on line $srcline was not found in the most recently parsed source!\n";
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        # remake the rest of the line
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        $cnt = @m;
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        $txt = "";
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        for ($i = 2; $i < $cnt; $i++) {
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            $txt = $txt . $m[$i] . "@";
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     }
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     print OUT $_;
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     ++$wroteline;
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } elsif ($_ =~ /~.+~/) {
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      # line contains a ~text~ pair used to refer to indexing :-)
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $txt = $_;
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      while ($txt =~ /~.+~/) {
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         @m = split("~", $txt);
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         # word is the second position
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $word = @m[1];
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $a = $index1{$word};
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $b = $index2{$word};
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $c = $index3{$word};
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         # if chapter (a) is zero it wasn't found
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         if ($a == 0) {
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            print "ERROR: the tag \"$word\" on line $srcline was not found previously marked.\n";
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         } else {
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            # format the tag as x, x.y or x.y.z depending on the values
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            $str = $a;
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            $str = $str . ".$b" if ($b != 0);
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            $str = $str . ".$c" if ($c != 0);
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            if ($b == 0 && $c == 0) {
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project               # its a chapter
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project               if ($a <= 10) {
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  if ($a == 1) {
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter one";
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 2) {
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter two";
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 3) {
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter three";
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 4) {
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter four";
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 5) {
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter five";
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 6) {
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter six";
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 7) {
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter seven";
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 8) {
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter eight";
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 9) {
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter nine";
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  } elsif ($a == 10) {
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                     $str = "chapter ten";
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  }
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project               } else {
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                  $str = "chapter " . $str;
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project               }
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            } else {
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project               $str = "section " . $str     if ($b != 0 && $c == 0);
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project               $str = "sub-section " . $str if ($b != 0 && $c != 0);
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            }
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            #substitute
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            $_ =~ s/~\Q$word\E~/$str/;
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            print "Found replacement tag for marker \"$word\" on line $srcline which refers to $str\n";
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         }
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         # remake rest of the line
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $cnt = @m;
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         $txt = "";
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         for ($i = 2; $i < $cnt; $i++) {
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             $txt = $txt . $m[$i] . "~";
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         }
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT $_;
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      ++$wroteline;
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } elsif ($_ =~ m/FIGU/) {
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      # FIGU,file,caption
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      chomp($_);
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      @m = split(",", $_);
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT "\\begin{center}\n\\begin{figure}[here]\n\\includegraphics{pics/$m[1]$graph}\n";
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT "\\caption{$m[2]}\n\\label{pic:$m[1]}\n\\end{figure}\n\\end{center}\n";
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $wroteline += 4;
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else {
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT $_;
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      ++$wroteline;
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "Read $readline lines, wrote $wroteline lines\n";
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectclose (OUT);
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectclose (IN);
266