From 66c2b597dca56fbec91488637262ed2a713cfc3f Mon Sep 17 00:00:00 2001 From: Paul Ackersviller Date: Wed, 14 Nov 2007 23:57:51 +0000 Subject: Merge of 23308: stop tindent becoming negative, which causes infinite use of memory; add debug test to see where it would become negative. --- Src/text.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'Src') diff --git a/Src/text.c b/Src/text.c index 55e03c579..eac0d21a0 100644 --- a/Src/text.c +++ b/Src/text.c @@ -33,6 +33,14 @@ static char *tptr, *tbuf, *tlim; static int tsiz, tindent, tnewlins, tjob; +static void +dec_tindent(void) +{ + DPUTS(tindent == 0, "attempting to decrement tindent below zero"); + if (tindent > 0) + tindent--; +} + /* add a character to the text buffer */ /**/ @@ -354,7 +362,7 @@ gettext2(Estate state) state->pc++; } else { state->pc = s->u._subsh.end; - tindent--; + dec_tindent(); taddnl(); taddstr(")"); stack = 1; @@ -371,7 +379,7 @@ gettext2(Estate state) state->pc++; } else { state->pc = s->u._subsh.end; - tindent--; + dec_tindent(); taddnl(); taddstr("}"); stack = 1; @@ -387,7 +395,7 @@ gettext2(Estate state) } else stack = 1; } else { - tindent--; + dec_tindent(); stack = 1; } break; @@ -414,7 +422,7 @@ gettext2(Estate state) } else { state->strs = s->u._funcdef.strs; state->pc = s->u._funcdef.end; - tindent--; + dec_tindent(); taddnl(); taddstr("}"); stack = 1; @@ -444,7 +452,7 @@ gettext2(Estate state) taddnl(); tpush(code, 1); } else { - tindent--; + dec_tindent(); taddnl(); taddstr("done"); stack = 1; @@ -462,7 +470,7 @@ gettext2(Estate state) taddnl(); tpush(code, 1); } else { - tindent--; + dec_tindent(); taddnl(); taddstr("done"); stack = 1; @@ -475,14 +483,14 @@ gettext2(Estate state) tindent++; tpush(code, 0); } else if (!s->pop) { - tindent--; + dec_tindent(); taddnl(); taddstr("do"); tindent++; taddnl(); s->pop = 1; } else { - tindent--; + dec_tindent(); taddnl(); taddstr("done"); stack = 1; @@ -498,7 +506,7 @@ gettext2(Estate state) taddnl(); tpush(code, 1); } else { - tindent--; + dec_tindent(); taddnl(); taddstr("done"); stack = 1; @@ -536,7 +544,7 @@ gettext2(Estate state) n->pop = (state->pc - 2 + WC_CASE_SKIP(code) >= end); } } else if (state->pc < s->u._case.end) { - tindent--; + dec_tindent(); switch (WC_CASE_TYPE(code)) { case WC_CASE_OR: taddstr(" ;;"); @@ -564,7 +572,7 @@ gettext2(Estate state) s->pop = ((state->pc - 2 + WC_CASE_SKIP(code)) >= s->u._case.end); } else { - tindent--; + dec_tindent(); switch (WC_CASE_TYPE(code)) { case WC_CASE_OR: taddstr(" ;;"); @@ -578,7 +586,7 @@ gettext2(Estate state) taddstr(";|"); break; } - tindent--; + dec_tindent(); if (tnewlins) taddnl(); else @@ -601,14 +609,14 @@ gettext2(Estate state) } else if (s->pop) { stack = 1; } else if (s->u._if.cond) { - tindent--; + dec_tindent(); taddnl(); taddstr("then"); tindent++; taddnl(); s->u._if.cond = 0; } else if (state->pc < s->u._if.end) { - tindent--; + dec_tindent(); taddnl(); code = *state->pc++; if (WC_IF_TYPE(code) == WC_IF_ELIF) { @@ -622,7 +630,7 @@ gettext2(Estate state) } } else { s->pop = 1; - tindent--; + dec_tindent(); taddnl(); taddstr("fi"); stack = 1; @@ -760,14 +768,14 @@ gettext2(Estate state) n->u._subsh.end = state->pc + WC_CURSH_SKIP(state->pc[-1]); } else if (!s->pop) { state->pc = s->u._subsh.end; - tindent--; + dec_tindent(); taddnl(); taddstr("} always {"); tindent++; taddnl(); s->pop = 1; } else { - tindent--; + dec_tindent(); taddnl(); taddstr("}"); stack = 1; -- cgit 1.4.1