home *** CD-ROM | disk | FTP | other *** search
- // This is just a quick'n'dirty tool that will report on the DGROUP and
- // BSS usage of a program. It takes a detailed mapfile (BC++ v3.1 variety)
- // as input and uses stdout for the output.
- // Richard Applebee 5/23/93
-
-
- #include <dir.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- typedef enum dtype { DATA, BSS };
-
- char * typeStrings[] = {
- "DATA bytes used = ",
- "BSS bytes used = "
- };
-
- struct toptenType {
- unsigned int size;
- enum dtype type;
- char module_name[MAXPATH];
- };
-
- struct toptenType toptenList[10];
-
- int topten = 0;
- int num_in_list = 0;
-
- void top_ten( unsigned int, enum dtype, char * );
- void listtopten( void );
-
-
- void main( int argc, char ** argv )
- {
- unsigned int DATASize = 0, BSSsize = 0, size;
- char moduleName[64],
- in[132], addr[10], group[16], code[8], segment[8],
- fname[MAXPATH];
- FILE * fp;
-
- if( argc != 2 )
- {
- puts( " Usage: DGROUP mapfile[.map]" );
- exit(0);
- }
-
- strcpy( fname, argv[1] );
- strupr( fname );
- if( !strstr( fname, ".MAP" ) )
- strcat( fname, ".MAP" );
-
- if( ( fp = fopen( fname, "r" ) ) != NULL )
- {
- // Read a line at a time
- while( ( fgets( in, 132, fp ) ) != NULL )
- {
- // Look for line containing DGROUP info
- if( strstr( in, "C=DATA" ) )
- {
- sscanf( in, "%s %x %s %s %s %s", &addr, &size, &code, &segment,
- &group, &moduleName );
- DATASize += size;
- if( size > topten )
- top_ten( size, DATA, moduleName );
- if( size > 0 )
- printf( "DATA bytes used = %5u - %s\n", size, moduleName + 2 );
- }
- else
- // Look for BSS info
- if( strstr( in, "C=BSS" ) )
- {
- sscanf( in, "%s %x %s %s %s %s", &addr, &size, &code, &segment,
- &group, &moduleName );
- BSSsize += size;
- if( size > topten )
- top_ten( size, BSS, moduleName );
- if( size > 0 )
- printf( "BSS bytes used = %5u - %s\n", size, moduleName + 2 );
- }
-
- }
-
- fclose( fp );
-
- printf( "\n\nTotal DGROUP size = %u bytes\n", DATASize + BSSsize );
-
- // List the top ten
- listtopten();
-
- }
- else
- printf( "Couldn't open %s", fname );
-
- return;
-
- }
-
- void top_ten( unsigned int size, enum dtype type, char * modName )
- {
- int i, j, done = 0;
-
- for( i = 0; i < 10, !done; i++ )
- if( size > toptenList[i].size ) {
- // Make a hole for new entry.
- for( j = 9; j > i; j-- )
- toptenList[j] = toptenList[j-1];
-
- // Set the fields
- toptenList[i].size = size;
- toptenList[i].type = type;
- strcpy( toptenList[i].module_name, modName + 2 );
-
- // Update the lowest top ten size
- topten = toptenList[9].size;
-
- if( num_in_list < 10 )
- num_in_list++;
-
- // Bust out of for loop
- done++;
- }
- }
-
- void listtopten( void )
- {
- int i;
-
- puts( "\nTop Ten List" );
- for( i = 0; i < num_in_list; i++ )
- if( toptenList[i].size > 0 )
- printf( "#%2d %s%5u - %s\n", i + 1, typeStrings[toptenList[i].type],
- toptenList[i].size, toptenList[i].module_name );
- }
-