[comp.bugs.4bsd] `t' command of sed does not work fine.

katsu@srava.sra.JUNET (Katsuhiro Watanabe) (08/18/89)

	Hello, world. I am using 4.3BSD on VAX.
 	I found a bug on sed of BSDs, so I would like to report it.

	Even if no substitution have been made before `t'(since
the most recent reading of and input line), it often branches.

	For example:
n125:104%cat t.sed
#
1{
        s/.*//
        d
}
t set
s/.*/t flag have been reset./
q
: set
s/.*/t flag is still set./
q
n125:105%echo '1\
2' | sed -f t.sed

	Then, on VAX, I get	"t flag is still set.".
	On SUN, 		"t flag have been reset.".

	On VAX, there is an inconsistency with manual.
	I think it occurs on most BSDs except SUN.

	Is this known yet?
							thank you.
----____----____
WATANABE Katsuhiro
Software Tools and Technology Division, SRA Inc., Japan.
Not compute f(x), but evaluate it.

diomidis@ecrcvax.UUCP (Diomidis Spinellis) (08/23/89)

In article <2427@srava.sra.JUNET> katsu@sra.JUNET (Katsuhiro Watanabe) writes:
>
>	Hello, world. I am using 4.3BSD on VAX.
> 	I found a bug on sed of BSDs, so I would like to report it.
>
>	Even if no substitution have been made before `t'(since
>the most recent reading of and input line), it often branches.
>
> [...]
>
>	Is this known yet?

I sent a bug report and fix to 4bsd-bugs@BERKELEY.EDU on May 18th 1989.
The acknowledgement from CSRG gave it ``bulk'' precedence.  Here is the 
report and fix:

Subject: Sed does not clear the flag used by `t' when reading new input
Index: 	bin/sed 4.3BSD

Description:
	According to the sed manual page the test command `t'
	branches to the : command bearing the label specified
	if any substitutions have been made since the most recent
	reading of an input line or execution of a `t'.
	In the 4.3BSD version of sed the reading of an input line
	does not cancel the effect of substitutions made before
	reading the new line.  Thus if any of those substitutions
	succeded the first `t' to be executed will succeeed even if
	a new input line has been read.

Repeat-By:
	Execute the following:

sed -e '
s/hello/goodbye/
/goodbye/d
t n
a\
t failed
b
: n
a\
t succeeded' <<EOF
hello
world
EOF

	After reading the line containing `hello' the substitution will 
	succeed.  The d command starts a new cycle and thus the next t 
	should fail unless a substitution succeeds again.  After reading 
	`world' the substitution fails, but because of the bug, t succeeds 
	and the message `t succeeded' is printed.

Fix:
	Modify "bin/sed/sed1.c" as follows:

*** sed1.c.orig	Thu May 18 14:24:39 1989
--- sed1.c	Thu May 18 14:19:48 1989
***************
*** 650,655 ****
--- 650,656 ----
  {
  	register char	*p1, *p2;
  	register	c;
+ 	sflag = 0;
  	p1 = addr;
  	p2 = cbp;
  	for (;;) {


-- 
Diomidis Spinellis          European Computer-Industry Research Centre (ECRC)
Arabellastrasse 17, D-8000 Muenchen 81, West Germany        +49 (89) 92699199
USA: diomidis%ecrcvax.uucp@pyramid.pyramid.com   ...!pyramid!ecrcvax!diomidis
Europe: diomidis@ecrcvax.uucp                      ...!unido!ecrcvax!diomidis