[net.bugs] Bug in C preprocessor and fix

stewart (12/28/82)

The C Preprocessor has a bug which causes Lint to fail under certain
conditions.  (This does not affect C compilations.)  If the -C flag
is defined, comments are passed along with the source language (conditional
upon the #if... statements).  The problem is that when the conditional
is false, and comments are being parsed, the logic which inserts
characters to split long comments still (unconditionally) outputs certain
characters.  You should not change the putc calls which output
newlines; this will screw up the line numbers in diagnostic messages.
(The following changes were made to a heavily modified version of
cpp.c, which runs on the pdp11 but supports long names as on 4.1.)
	John Stewart, Teledyne Geotech, (703)276-7900
................................................................
*** cpp.c	Mon Dec 27 08:45:15 1982
--- cpp.c_	Mon Dec 20 13:25:48 1982
***************
*** 8,14
  /* C command
  /* written by John F. Reiser
  /* July/August 1978
-  * 27 Dec 82--added cputc macro to fix bug with -C flag--JCStewart
  */
  
  #define STATIC

--- 8,13 -----
  /* C command
  /* written by John F. Reiser
  /* July/August 1978
  */
  
  #define STATIC
***************
*** 103,110
  #define eob(a) ((a)>=pend)
  #define bob(a) (pbeg>=(a))
  
- #define	cputc(a,b)	if(!flslvl) putc(a,b)
- 
  char buffer[NCPS+BUFSIZ+BUFSIZ+NCPS];
  
  # define SBSIZE 25000	/* was 12000 -- JCStewart, 27 Oct 82 */

--- 102,107 -----
  #define eob(a) ((a)>=pend)
  #define bob(a) (pbeg>=(a))
  
  char buffer[NCPS+BUFSIZ+BUFSIZ+NCPS];
  
  # define SBSIZE 25000	/* was 12000 -- JCStewart, 27 Oct 82 */
***************
*** 383,389
  						if (!passcom) {inp=p; p=refill(p);}
  						else if ((p-inp)>=BUFSIZ) {/* split long comment */
  							inp=p; p=refill(p);	/* last char written is '*' */
! 							cputc('/',fout);	/* terminate first part */
  							/* and fake start of 2nd */
  							outp=inp=p-=3; *p++='/'; *p++='*'; *p++='*';
  						} else p=refill(p);

--- 380,386 -----
  						if (!passcom) {inp=p; p=refill(p);}
  						else if ((p-inp)>=BUFSIZ) {/* split long comment */
  							inp=p; p=refill(p);	/* last char written is '*' */
! 							putc('/',fout);	/* terminate first part */
  							/* and fake start of 2nd */
  							outp=inp=p-=3; *p++='/'; *p++='*'; *p++='*';
  						} else p=refill(p);
***************
*** 394,400
  					if (!passcom) {inp=p; p=refill(p);}
  					else if ((p-inp)>=BUFSIZ) {/* split long comment */
  						inp=p; p=refill(p);
! 						cputc('*',fout); cputc('/',fout);
  						outp=inp=p-=2; *p++='/'; *p++='*';
  					} else p=refill(p);
  				} else ++p; /* ignore null byte */

--- 391,397 -----
  					if (!passcom) {inp=p; p=refill(p);}
  					else if ((p-inp)>=BUFSIZ) {/* split long comment */
  						inp=p; p=refill(p);
! 						putc('*',fout); putc('/',fout);
  						outp=inp=p-=2; *p++='/'; *p++='*';
  					} else p=refill(p);
  				} else ++p; /* ignore null byte */