diff options
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclUtil.c | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 874e2a5..7ec224e 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -3225,25 +3225,49 @@ TclNeedSpace( /* * A space is needed unless either: * (a) we're at the start of the string, or - */ + * + * (NOTE: This check is now absorbed into the loop below.) + * if (end == start) { return 0; } + * + */ + /* * (b) we're at the start of a nested list-element, quoted with an open * curly brace; we can be nested arbitrarily deep, so long as the * first curly brace starts an element, so backtrack over open curly * braces that are trailing characters of the string; and - */ + * + * (NOTE: Every character our parser is looking for is a proper + * single-byte encoding of an ASCII value. It does not accept + * overlong encodings. Given that, there's no benefit using + * Tcl_UtfPrev. If it would find what we seek, so would byte-by-byte + * backward scan. Save routine call overhead and risk of wrong + * results should the behavior of Tcl_UtfPrev change in unexpected ways. + * Reconsider this if we ever start treating non-ASCII Unicode + * characters as meaningful list syntax, expanded Unicode spaces as + * element separators, for example.) + * end = Tcl_UtfPrev(end, start); while (*end == '{') { - if (end == start) { - return 0; - } - end = Tcl_UtfPrev(end, start); + if (end == start) { + return 0; + } + end = Tcl_UtfPrev(end, start); + } + + * + */ + + while ((--end >= start) && (*end == '{')) { + } + if (end < start) { + return 0; } /* @@ -3278,8 +3302,12 @@ TclNeedSpace( case '\r': case '\v': case '\f': - if ((end == start) || (end[-1] != '\\')) { - return 0; + { + int result = 0; + while ((--end >= start) && (*end == '\\')) { + result = !result; + } + return result; } } return 1; |