[unix-pc.general] GNU cpp

alex@umbc3.UMD.EDU (Alex S. Crain) (04/04/88)

	Hey Kids! Lots of people are touting the advantages of using GNU's
C Preprocessor as opposed to the stock one. And there really are advantages,
too, like the -M option (swiped from BSD, dumps make(1) dependency lines 
derived from the include files) and the larger hash tables (good for when
you need to compile GNU software).

	There's a catch though. GNU cpp breaks the C compiler :-(. The SGS
C compiler depends on a couple of idiosynchrosies (sp?) of the stock 
/lib/cpp, namely

	a) /lib/cpp never puts #line directives on consecutive lines.
	b) the first line out of /lib/cpp is a #line directive.

	If either if these conditions is not met, /lib/ccom forgets what
file it is reading and generates bogus .s files (bogus file directives) so
that sdb gets really confused and doesn't work right.

	GNU cpp gets b ok, but sometimes likes to put #line directives on
consecutive lines. The fix for this is to modify the sprintf call near 
line 3438 in cccp.c to preceed the line directive with a \n, so that they
will always be at least 1 line apart. (we can't add a \n to the end because
that would put out phony line numbers). Unfortunately, that breaks condition
a, because now the first character in the file is a \n. so now we have to
add a flag so that we only preceed the line directive if its not the first 
line directive. Yuk!

	The result looks like:

(somewhere in the file)
int i_hate_att_braindamaged_software = 0;

	----
	----
	----

	if (i_hate_att_braindamaged_software == 0)
	 {
	     i_hate_att_braindamaged_software = 1;
	     sprintf (line_cmd_buf, "# %d \"%s\"\n", ip->lineno, ip-fname);
	 }
	else
	     sprintf (line_cmd_buf, "\n# %d \"%s\"\n", ip->lineno, ip-fname);

	----
	----
	----

	Note that #line directives don't really use the "line" part.

	I'm going to go throw up now.

-- 
					:alex.

nerwin!alex@umbc3.umd.edu
alex@umbc3.umd.edu