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