Commit Diff


commit - baa6e34b72e5d978fb0da4266c4527e7e582e675
commit + 1076c720dff8ea5f05dfc8f5c7c1cd192330eb63
blob - 922a3a80837ef4e99c931af128227c5463ce981e
blob + d04fd0377e7b6660df94758f8371e872812f78b8
--- src/cmd/troff/fns.h
+++ src/cmd/troff/fns.h
@@ -172,6 +172,7 @@ void	casefl(void);
 void	caseev(void);
 void	envcopy(Env *e1, Env *e2);
 void	caseel(void);
+void caseei(void);
 void	caseie(void);
 void	casexif(void);
 void	caseif(void);
blob - 2c7d3287ba98116598ddf6f26f0243c37196c6b1
blob + 72f9bbb6ad4813b7c58cce93f80b2502178929fb
--- src/cmd/troff/n5.c
+++ src/cmd/troff/n5.c
@@ -8,7 +8,7 @@
 #include "fns.h"
 #include "ext.h"
 
-int	iflist[NIF];
+int	iflist[NIF];	/* whether 'else' is true */
 int	ifx;
 int	ifnum = 0;	/* trying numeric expression for .if or .ie condition */
 
@@ -610,7 +610,17 @@ void envcopy(Env *e1, Env *e2)	/* copy env e2 to e1 */
 {
 	*e1 = *e2;	/* rumor hath that this fails on some machines */
 }
+
 
+void caseei(void)
+{
+	if (--ifx < 0) {
+		ifx = 0;
+		iflist[0] = 0;
+	}
+	caseif1(1);
+	ifx++;
+}
 
 void caseel(void)
 {
@@ -621,7 +631,6 @@ void caseel(void)
 	caseif1(2);
 }
 
-
 void caseie(void)
 {
 	if (ifx >= NIF) {
@@ -629,11 +638,11 @@ void caseie(void)
 		ifx = 0;
 		edone(040);
 	}
+	iflist[ifx] = 1;
 	caseif1(1);
 	ifx++;
 }
 
-
 void caseif(void)
 {
 	caseif1(0);
@@ -645,7 +654,7 @@ void caseif1(int x)
 	int notflag, true;
 	Tchar i;
 
-	if (x == 2) {
+	if (x == 2) {	/* .el */
 		notflag = 0;
 		true = iflist[ifx];
 		goto i1;
@@ -691,8 +700,10 @@ void caseif1(int x)
 	}
 i1:
 	true ^= notflag;
-	if (x == 1)
-		iflist[ifx] = !true;
+	if (x == 1) {	/* .ie or .ei */
+		true = true && iflist[ifx];
+		iflist[ifx] = iflist[ifx] && !true;
+	}
 	if (true) {
 i2:
 		while ((cbits(i = getch())) == ' ')
blob - a80cec6437edd23dfd4e7ec144b8a0d061e126b7
blob + 27a0ff3dd64e33178a3915b348d738bab915c28c
--- src/cmd/troff/ni.c
+++ src/cmd/troff/ni.c
@@ -70,6 +70,7 @@ Contab contab[NM] = {
 	C(PAIR('n', 'r'), casenr),
 	C(PAIR('i', 'f'), caseif),
 	C(PAIR('i', 'e'), caseie),
+	C(PAIR('e', 'i'), caseei),
 	C(PAIR('e', 'l'), caseel),
 	C(PAIR('p', 'o'), casepo),
 	C(PAIR('t', 'l'), casetl),