[comp.os.minix] Bugfix for agcpp adjacent string merge

sme@computing-maths.cardiff.ac.uk (Simon Elliott) (06/21/89)

This posting fixes a bug in agcpp (Alitair G Crookes' Pre-processor)
which led agcpp to not concatenate multiple adjacent strings correctly.
To reproduce the bug, run agcpp on the following:

main()
{
	printf("first " "second " "third " "fourth\n");
}

The output is:

main()
{
	printf("first second " "third fourth\n");
}

i.e. the 1st, 3rd, 5th ... concatenations are performed, but 2nd, 4th ...
are not.  The following context diff will fix the problem.

*** agcpp.c	Fri May 19 01:11:15 1989
--- agcpp.c.new	Wed May 24 01:09:06 1989
***************
*** 183,190
  	op += n;
  	*op = 0;
  	if (s[n-1] == '\n') {
! 		for (cp = op = obuf ; *op ; ) {
! 			while (*op && *op != '"')
  				*cp++ = *op++;
  			if (*op == 0)
  				break;

--- 183,191 -----
  	op += n;
  	*op = 0;
  	if (s[n-1] == '\n') {
! 		cp = op = obuf;
! 		do {
! 			while (*op && *op != '"') {
  				*cp++ = *op++;
  			}
  			if (*op == 0)
***************
*** 186,191
  		for (cp = op = obuf ; *op ; ) {
  			while (*op && *op != '"')
  				*cp++ = *op++;
  			if (*op == 0)
  				break;
  			for (*cp++ = *op++ ; *op && *op != '"' ; *cp++ = *op++)

--- 187,193 -----
  		do {
  			while (*op && *op != '"') {
  				*cp++ = *op++;
+ 			}
  			if (*op == 0)
  				break;
  			*cp++ = *op++;
***************
*** 188,207
  				*cp++ = *op++;
  			if (*op == 0)
  				break;
! 			for (*cp++ = *op++ ; *op && *op != '"' ; *cp++ = *op++)
! 				if (*op == '\\')
! 					*cp++ = *op++;
! 			if (*op == 0)
! 				break;
! 			for (was = op++ ; *op && isspace(*op) ; op++)
! 				;
! 			if (*op == 0)
! 				break;
! 			if (*op == '"')
! 				op++;
! 			else
! 				op = was;
! 		}
  		for (*cp-- = 0 ; cp != obuf && isspace(*cp) ; --cp)
  			;
  		if (*cp == '"')

--- 190,212 -----
  			}
  			if (*op == 0)
  				break;
! 			*cp++ = *op++;
! 			while (*op && *op != '"') {
! 				for (*cp++ = *op++ ; *op && *op != '"' ; *cp++ = *op++)
! 					if (*op == '\\')
! 						*cp++ = *op++;
! 				if (*op == 0)
! 					break;
! 				for (was = op++ ; *op && isspace(*op) ; op++)
! 					;
! 				if (*op == 0)
! 					break;
! 				if (*op == '"')
! 					op++;
! 				else
! 					op = was;
! 			}
! 		} while (*op);
  		for (*cp-- = 0 ; cp != obuf && isspace(*cp) ; --cp)
  			;
  		if (*cp == '"')


Alastair: I tried to send this to you first, but mail bounced.
-- 
--------------------------------------------------------------------------
Simon Elliott            Internet: sme%v1.cm.cf.ac.uk@nsfnet-relay.ac.uk
UWCC Computer Centre     JANET:    sme@uk.ac.cf.cm.v1
40/41 Park Place         UUCP:     {backbones}!mcvax!ukc!reading!cf-cm!sme
Cardiff, Wales           PHONE:    +44 222 874300