dep.pl revision f7fc46c63fdc8f39234fea409b8dbe116d73ebf8
1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#!/usr/bin/perl
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# Walk through source, add labels and make classes
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#use strict;
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmy %deplist;
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#open class file and write preamble
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectopen(CLASS, ">tommath_class.h") or die "Couldn't open tommath_class.h for writing\n";
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint CLASS "#if !(defined(LTM1) && defined(LTM2) && defined(LTM3))\n#if defined(LTM2)\n#define LTM3\n#endif\n#if defined(LTM1)\n#define LTM2\n#endif\n#define LTM1\n\n#if defined(LTM_ALL)\n";
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectforeach my $filename (glob "bn*.c") {
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   my $define = $filename;
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "Processing $filename\n";
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   # convert filename to upper case so we can use it as a define
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   $define =~ tr/[a-z]/[A-Z]/;
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   $define =~ tr/\./_/;
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   print CLASS "#define $define\n";
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   # now copy text and apply #ifdef as required
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   my $apply = 0;
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   open(SRC, "<$filename");
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   open(OUT, ">tmp");
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   # first line will be the #ifdef
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   my $line = <SRC>;
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ($line =~ /include/) {
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT $line;
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else {
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT "#include <tommath.h>\n#ifdef $define\n$line";
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $apply = 1;
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   while (<SRC>) {
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      if (!($_ =~ /tommath\.h/)) {
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         print OUT $_;
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ($apply == 1) {
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      print OUT "#endif\n";
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   close SRC;
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   close OUT;
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unlink($filename);
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   rename("tmp", $filename);
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint CLASS "#endif\n\n";
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# now do classes
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectforeach my $filename (glob "bn*.c") {
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   open(SRC, "<$filename") or die "Can't open source file!\n";
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   # convert filename to upper case so we can use it as a define
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   $filename =~ tr/[a-z]/[A-Z]/;
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   $filename =~ tr/\./_/;
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   print CLASS "#if defined($filename)\n";
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   my $list = $filename;
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   # scan for mp_* and make classes
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   while (<SRC>) {
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      my $line = $_;
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      while ($line =~ m/(fast_)*(s_)*mp\_[a-z_0-9]*/) {
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          $line = $';
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          # now $& is the match, we want to skip over LTM keywords like
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          # mp_int, mp_word, mp_digit
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          if (!($& eq "mp_digit") && !($& eq "mp_word") && !($& eq "mp_int")) {
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             my $a = $&;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             $a =~ tr/[a-z]/[A-Z]/;
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             $a = "BN_" . $a . "_C";
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             if (!($list =~ /$a/)) {
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project                print CLASS "   #define $a\n";
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             }
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project             $list = $list . "," . $a;
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          }
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      }
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @deplist{$filename} = $list;
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   print CLASS "#endif\n\n";
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   close SRC;
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint CLASS "#ifdef LTM3\n#define LTM_LAST\n#endif\n#include <tommath_superclass.h>\n#include <tommath_class.h>\n#else\n#define LTM_LAST\n#endif\n";
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectclose CLASS;
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#now let's make a cool call graph...
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectopen(OUT,">callgraph.txt");
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project$indent = 0;
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectforeach (keys %deplist) {
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   $list = "";
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   draw_func(@deplist{$_});
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   print OUT "\n\n";
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectclose(OUT);
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectsub draw_func()
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   my @funcs = split(",", $_[0]);
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ($list =~ /@funcs[0]/) {
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return;
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } else {
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $list = $list . @funcs[0];
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ($indent == 0) { }
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   elsif ($indent >= 1) { print OUT "|   " x ($indent - 1) . "+--->"; }
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   print OUT @funcs[0] . "\n";
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   shift @funcs;
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      my $temp = $list;
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   foreach my $i (@funcs) {
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      ++$indent;
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      draw_func(@deplist{$i});
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      --$indent;
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      $list = $temp;
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124