[net.sources.bugs] important fix to vc

afs@bunker.UUCP (Andrew F. Seirup) (03/14/85)

   The fix to the ^J function in vc that I posted a while back has at least
two very serious bugs in it.  The ^J fix that Mitch Bradly posted works
correctly, but if you try to install it after installing my fix, it dumps
core.  Since a diff is therfore useless, I am including the code in question
(about 35 lines) in its entirity.  If you installed my fix, you MUST replace
the code (it only looks like it works).  If you installed Mitch's fix, and
you don't get core dumps, you should be ok.  If you get nothing but core dumps
no matter what, check if your compiler handles structure assignment (a = b,
where both a and b are structures, and the entire contents of b is copied).

Andrew Seirup - Bunker Ramo, Trumbull CT - (203)386-2086 
uucp address:  {decvax|ittvax}!bunker!afs



From file interp.c:

struct enode *copye (e, Rdelta, Cdelta)
register struct enode *e; {
    register struct enode *ret;
    if (e==0) ret = 0;
    else {
	ret = (struct enode *) calloc (1,sizeof (struct enode));
	*ret = *e;
	switch (ret->op) {
	case 'v':
		ret->e.v = lookat (ret->e.v->row+Rdelta, ret->e.v->col+Cdelta);
		break;
	case 'k':
		break;
	case 'f':
		ret->e.o.right = copye (ret->e.o.right,0,0);
		break;
	case O_REDUCE('+'):
	case O_REDUCE('*'):
		(struct ent *) ret->e.o.right =
		   lookat (
		          ((struct ent *)ret->e.o.right)->row+Rdelta,
		          ((struct ent *)ret->e.o.right)->col+Cdelta
		   );
		(struct ent *) ret->e.o.left =
		   lookat (
		          ((struct ent *)ret->e.o.left)->row+Rdelta,
		          ((struct ent *)ret->e.o.left)->col+Cdelta
		   );
		break;
	default:
		ret->e.o.right = copye (ret->e.o.right,Rdelta,Cdelta);
		ret->e.o.left = copye (ret->e.o.left,Rdelta,Cdelta);
		break;
	}
    }
    return ret;
}