From 1076c720dff8ea5f05dfc8f5c7c1cd192330eb63 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 14 Dec 2005 19:58:32 +0000 Subject: add .ei for else-if --- src/cmd/troff/fns.h | 1 + src/cmd/troff/n5.c | 23 +++++++++++++++++------ src/cmd/troff/ni.c | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) (limited to 'src/cmd/troff') diff --git a/src/cmd/troff/fns.h b/src/cmd/troff/fns.h index 922a3a80..d04fd037 100644 --- a/src/cmd/troff/fns.h +++ b/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); diff --git a/src/cmd/troff/n5.c b/src/cmd/troff/n5.c index 2c7d3287..72f9bbb6 100644 --- a/src/cmd/troff/n5.c +++ b/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 */ @@ -612,6 +612,16 @@ void envcopy(Env *e1, Env *e2) /* copy env e2 to e1 */ } +void caseei(void) +{ + if (--ifx < 0) { + ifx = 0; + iflist[0] = 0; + } + caseif1(1); + ifx++; +} + void caseel(void) { if (--ifx < 0) { @@ -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())) == ' ') diff --git a/src/cmd/troff/ni.c b/src/cmd/troff/ni.c index a80cec64..27a0ff3d 100644 --- a/src/cmd/troff/ni.c +++ b/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), -- cgit v1.2.3