124 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #!/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;
 | |
| }
 | |
| 
 | |
| 
 | 
