diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Src/text.c | 42 |
2 files changed, 30 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog index 66acb4cf5..5a52cff90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ 2007-04-23 Peter Stephenson <pws@csr.com> - * Christoph Bauer: 23309ish: define _INCLUDE__STDC_A1_SOURCE + * 23308: Src/text.c: stop tindent becoming negative, which + causes infinite use of memory; add debug test to see where + it would become negative. + + * Christoph Bauer: 23310ish: define _INCLUDE__STDC_A1_SOURCE for HP/UX. 2007-04-21 Clint Adams <clint@zsh.org> diff --git a/Src/text.c b/Src/text.c index 181fea083..03ce59cf7 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; |