chris@mimsy.UUCP (Chris Torek) (07/13/87)
Index: bin/sh/xec.c 4.3BSD Fix Description: The Bourne shell aborts a script too soon when the test part of an `if' or `while' is false. Repeat-By: % sh -ce 'if false; then :; else echo bug is fixed; fi' This should print `bug is fixed'; since -e is set, it exits because `false' is false. Fix: (from someone at BRL, ages ago) It would be prettier to pass a `do not abort' flag into execute(). The fix given below works, though. RCS file: RCS/xec.c,v retrieving revision 1.1 diff -c2 -r1.1 xec.c *** /tmp/,RCSt1003727 Mon Jul 13 05:02:22 1987 --- xec.c Mon Jul 13 05:02:04 1987 *************** *** 363,371 **** case TUN: BEGIN ! INT i=0; loopcnt++; ! WHILE execbrk==0 ANDF (execute(t->whtre,0)==0)==(type==TWH) ! DO i=execute(t->dotre,0); IF execbrk<0 THEN execbrk=0 FI OD --- 363,376 ---- case TUN: BEGIN ! INT i=0, saveflg; + saveflg = flags&errflg; loopcnt++; ! WHILE execbrk==0 ! DO flags &= ~errflg; ! i=execute(t->whtre,0); ! flags |= saveflg; ! IF (i==0)!=(type==TWH) THEN break FI ! i=execute(t->dotre,0); IF execbrk<0 THEN execbrk=0 FI OD *************** *** 376,383 **** case TIF: ! IF execute(t->iftre,0)==0 ! THEN execute(t->thtre,execflg); ! ELSE execute(t->eltre,execflg); ! FI break; --- 381,396 ---- case TIF: ! BEGIN ! INT i, saveflg; ! ! saveflg = flags&errflg; ! flags &= ~errflg; ! i=execute(t->iftre,0); ! flags |= saveflg; ! IF i==0 ! THEN execute(t->thtre,execflg); ! ELSE execute(t->eltre,execflg); ! FI ! END break; -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7690) Domain: chris@mimsy.umd.edu Path: seismo!mimsy!chris