From 290354ff4630b705c97f40e2f15820d2b7f70a4c Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Sun, 5 Jul 2015 18:15:43 +0100
Subject: [PATCH] 35688: Improved attempt to turn case wordcode into text.
---
ChangeLog | 5 +++++
Src/text.c | 17 ++++++++++-------
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 19b72edb0..a52014b14 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-07-05 Peter Stephenson
+
+ * 35688: Src/text.c: Slightly more nearly definitive version of
+ turning wordcode case statements back to text.
+
2015-07-04 Peter Stephenson
* 35682: Src/text.c, plus Test/A01grammar.ztst: turning case
diff --git a/Src/text.c b/Src/text.c
index d63141b20..cf73004d5 100644
--- a/Src/text.c
+++ b/Src/text.c
@@ -681,7 +681,7 @@ gettext2(Estate state)
case WC_CASE:
if (!s) {
Wordcode end = state->pc + WC_CASE_SKIP(code);
- wordcode nalts, ialts;
+ wordcode ialts;
taddstr("case ");
taddstr(ecgetstr(state, EC_NODUP, NULL));
@@ -695,6 +695,7 @@ gettext2(Estate state)
taddstr("esac");
stack = 1;
} else {
+ Wordcode prev_pc;
tindent++;
if (tnewlins)
taddnl(0);
@@ -702,7 +703,8 @@ gettext2(Estate state)
taddchr(' ');
taddstr("(");
code = *state->pc++;
- nalts = ialts = *state->pc++;
+ prev_pc = state->pc++;
+ ialts = *prev_pc;
while (ialts--) {
taddstr(ecgetstr(state, EC_NODUP, NULL));
state->pc++;
@@ -713,11 +715,11 @@ gettext2(Estate state)
tindent++;
n = tpush(code, 0);
n->u._case.end = end;
- n->pop = (state->pc - 2 - nalts + WC_CASE_SKIP(code)
- >= end);
+ n->pop = (prev_pc + WC_CASE_SKIP(code) >= end);
}
} else if (state->pc < s->u._case.end) {
- wordcode nalts, ialts;
+ Wordcode prev_pc;
+ wordcode ialts;
dec_tindent();
switch (WC_CASE_TYPE(code)) {
case WC_CASE_OR:
@@ -738,7 +740,8 @@ gettext2(Estate state)
taddchr(' ');
taddstr("(");
code = *state->pc++;
- nalts = ialts = *state->pc++;
+ prev_pc = state->pc++;
+ ialts = *prev_pc;
while (ialts--) {
taddstr(ecgetstr(state, EC_NODUP, NULL));
state->pc++;
@@ -748,7 +751,7 @@ gettext2(Estate state)
taddstr(") ");
tindent++;
s->code = code;
- s->pop = ((state->pc - 2 - nalts + WC_CASE_SKIP(code)) >=
+ s->pop = (prev_pc + WC_CASE_SKIP(code) >=
s->u._case.end);
} else {
dec_tindent();