Blame view

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