superfluous #include spotter
Gregory Bloom
gregory at agcsun.UUCP
Thu Oct 4 02:33:44 AEST 1990
Here is incspot.c, a REE-LEE-CHEE-ZEE program that I use to ferret out
unnecessary #include statements in a project so as to minimize impact
of header file changes.
To use, just compile and invoke it in the directory of your choice.
incspot will test each #include in *.c using cc. Of course, this
could take a while, so you should plan to go get a ham sandwich
or something while it is running.
It does not recurse to identify superfluous dependent #includes, so
you might want to run it a second time after cleaning up a first pass
to be sure you got everything.
-------------------------------CUT HERE----------------------------------------
/*-----------------------------------------------------------------------------
/*
/* incspot.c
/*
/* An incredibly crude program to point out unnecessary #include statements
/*
/* G. Bloom 7/19/90
/*
/* agcsun!gregory at boulder.colorado.edu
/*
/*-----------------------------------------------------------------------------
*/
#include <stdio.h>
#define MAX_LINE_LEN 1024
main ()
{
FILE *ls, *source_file, *temp_file, *temp_source;
char source_file_name[256];
char source_line[MAX_LINE_LEN], temp_line[MAX_LINE_LEN];
int line_count, temp_count;
/* open a pipe to an ls of all .c source files */
ls = popen ("ls *.c", "r");
/* while there are .c files left to process */
while (fgets (source_file_name, 256, ls) != (char *)NULL)
{
/* blow newline */
source_file_name[strlen (source_file_name) - 1] = 0;
/* open a read stream into this .c source */
source_file = fopen (source_file_name, "r");
/* for each line in this file... */
for (line_count = 0;
fgets (source_line, MAX_LINE_LEN, source_file) != (char *)NULL;
line_count++)
{
if (strncmp (source_line, "#include", 8) == 0)
{
/* create a new temp file to compile without one #include */
temp_file = fopen ("incspot_temp.c", "w");
/* open a second read stream to copy this source to temp */
temp_source = fopen (source_file_name, "r");
/* copy this source to temp except this #include */
for (temp_count = 0;
fgets (temp_line, 1024, temp_source) != (char *)NULL;
temp_count++)
{
/* skip #include */
if (temp_count != line_count)
fputs (temp_line, temp_file);
}
fclose (temp_source);
fclose (temp_file);
/* see if the temp compiles without this #include */
if (system ("cc -c incspot_temp.c 2> /dev/null") == 0)
{
/* blow newline */
source_line[strlen (source_line) - 1] = 0;
/* tell the user this #include in this file is bogus */
printf ("%s line #%d: %s\n",
source_file_name, line_count + 1, source_line);
}
}
}
/* we're through checking this source */
fclose (source_file);
} /* while (there are sources to check) */
/* tidy up */
pclose (ls);
unlink ("incspot_temp.c");
unlink ("incspot_temp.o");
}
-------------------------------CUT HERE----------------------------------------
Have fun.
Gregory Bloom
agcsun!gregory at boulder.colorado.edu
More information about the Alt.sources
mailing list