home *** CD-ROM | disk | FTP | other *** search
/ Borland Programmer's Resource / Borland_Programmers_Resource_CD_1995.iso / code / bcpp / file4 / dgroup.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-19  |  3.2 KB  |  135 lines

  1. // This is just a quick'n'dirty tool that will report on the DGROUP and
  2. // BSS usage of a program.  It takes a detailed mapfile (BC++ v3.1 variety)
  3. // as input and uses stdout for the output.
  4. // Richard Applebee  5/23/93
  5.  
  6.  
  7. #include <dir.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11.  
  12. typedef enum dtype { DATA, BSS };
  13.  
  14. char * typeStrings[] = {
  15.   "DATA bytes used = ",
  16.   "BSS bytes used  = "
  17. };
  18.  
  19. struct toptenType {
  20.   unsigned int size;
  21.   enum dtype type;
  22.   char module_name[MAXPATH];
  23. };
  24.  
  25. struct toptenType toptenList[10];
  26.  
  27. int topten = 0;
  28. int num_in_list = 0;
  29.  
  30. void top_ten( unsigned int, enum dtype, char * );
  31. void listtopten( void );
  32.  
  33.  
  34. void main( int argc, char ** argv )
  35. {
  36.   unsigned int DATASize = 0, BSSsize = 0, size;
  37.   char moduleName[64],
  38.        in[132], addr[10], group[16], code[8], segment[8],
  39.        fname[MAXPATH];
  40.   FILE * fp;
  41.  
  42.   if( argc != 2 )
  43.     {
  44.     puts( "  Usage: DGROUP mapfile[.map]" );
  45.     exit(0);
  46.     }
  47.  
  48.   strcpy( fname, argv[1] );
  49.   strupr( fname );
  50.   if( !strstr( fname, ".MAP" ) )
  51.     strcat( fname, ".MAP" );
  52.  
  53.   if( ( fp = fopen( fname, "r" ) ) != NULL )
  54.     {
  55.     // Read a line at a time
  56.     while( ( fgets( in, 132, fp ) ) != NULL )
  57.       {
  58.       // Look for line containing DGROUP info
  59.       if( strstr( in, "C=DATA" ) )
  60.         {
  61.         sscanf( in, "%s %x %s %s %s %s", &addr, &size, &code, &segment,
  62.                 &group, &moduleName );
  63.         DATASize += size;
  64.         if( size > topten )
  65.           top_ten( size, DATA, moduleName );
  66.         if( size > 0 )
  67.           printf( "DATA bytes used = %5u - %s\n", size, moduleName + 2 );
  68.         }
  69.       else
  70.         // Look for BSS info
  71.         if( strstr( in, "C=BSS" ) )
  72.           {
  73.           sscanf( in, "%s %x %s %s %s %s", &addr, &size, &code, &segment,
  74.                   &group, &moduleName );
  75.           BSSsize += size;
  76.           if( size > topten )
  77.             top_ten( size, BSS, moduleName );
  78.           if( size > 0 )
  79.             printf( "BSS bytes used =  %5u - %s\n", size, moduleName + 2 );
  80.           }
  81.  
  82.       }
  83.  
  84.     fclose( fp );
  85.  
  86.     printf( "\n\nTotal DGROUP size = %u bytes\n",  DATASize + BSSsize );
  87.  
  88.     // List the top ten
  89.     listtopten();
  90.  
  91.     }
  92.   else
  93.     printf( "Couldn't open %s", fname );
  94.  
  95.   return;
  96.  
  97. }
  98.  
  99. void top_ten( unsigned int size, enum dtype type, char * modName )
  100. {
  101.   int i, j, done = 0;
  102.  
  103.   for( i = 0; i < 10, !done; i++ )
  104.     if( size > toptenList[i].size ) {
  105.       // Make a hole for new entry.
  106.       for( j = 9; j > i; j-- )
  107.         toptenList[j] = toptenList[j-1];
  108.  
  109.       // Set the fields
  110.       toptenList[i].size = size;
  111.       toptenList[i].type = type;
  112.       strcpy( toptenList[i].module_name, modName + 2 );
  113.  
  114.       // Update the lowest top ten size
  115.       topten = toptenList[9].size;
  116.  
  117.       if( num_in_list < 10 )
  118.         num_in_list++;
  119.  
  120.       // Bust out of for loop
  121.       done++;
  122.     }
  123. }
  124.  
  125. void listtopten( void )
  126. {
  127.   int i;
  128.  
  129.   puts( "\nTop Ten List" );
  130.   for( i = 0; i < num_in_list; i++ )
  131.     if( toptenList[i].size > 0 )
  132.       printf( "#%2d %s%5u - %s\n", i + 1, typeStrings[toptenList[i].type],
  133.               toptenList[i].size, toptenList[i].module_name );
  134. }
  135.