diff options
author | dgp <dgp@users.sourceforge.net> | 2012-03-07 20:54:01 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2012-03-07 20:54:01 (GMT) |
commit | ad6354810b16be87892d74dc8217eda11883d1d5 (patch) | |
tree | 7fdc0e94be0b9736465bd7a1d66db263e433ce7a /generic/tclUtil.c | |
parent | d5692e7ae359fe12bb7da7cb99acfd292903c29f (diff) | |
download | tcl-ad6354810b16be87892d74dc8217eda11883d1d5.zip tcl-ad6354810b16be87892d74dc8217eda11883d1d5.tar.gz tcl-ad6354810b16be87892d74dc8217eda11883d1d5.tar.bz2 |
Refactor TclScanElement() part of list parsing to take advantage of tables
constructed for the task of script parsing. Ought to speed generation of
string representation of lists, though the effect is likely only noticeable
on long lists made up primarily of simple elements (not needing quoting).
Diffstat (limited to 'generic/tclUtil.c')
-rw-r--r-- | generic/tclUtil.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 31c9fd3..6ce430b 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -13,6 +13,7 @@ */ #include "tclInt.h" +#include "tclParse.h" #include <math.h> /* @@ -972,15 +973,16 @@ TclScanElement( } while (length) { + if (CHAR_TYPE(*p) != TYPE_NORMAL) { switch (*p) { - case '{': + case '{': /* TYPE_BRACE */ #if COMPAT braceCount++; #endif extra++; /* Escape '{' => '\{' */ nestingLevel++; break; - case '}': + case '}': /* TYPE_BRACE */ #if COMPAT braceCount++; #endif @@ -991,8 +993,8 @@ TclScanElement( requireEscape = 1; } break; - case ']': - case '"': + case ']': /* TYPE_CLOSE_BRACK */ + case '"': /* TYPE_SPACE */ #if COMPAT forbidNone = 1; extra++; /* Escapes all just prepend a backslash */ @@ -1001,22 +1003,22 @@ TclScanElement( #else /* FLOW THROUGH */ #endif - case '[': - case '$': - case ';': - case ' ': - case '\f': - case '\n': - case '\r': - case '\t': - case '\v': + case '[': /* TYPE_SUBS */ + case '$': /* TYPE_SUBS */ + case ';': /* TYPE_COMMAND_END */ + case ' ': /* TYPE_SPACE */ + case '\f': /* TYPE_SPACE */ + case '\n': /* TYPE_COMMAND_END */ + case '\r': /* TYPE_SPACE */ + case '\t': /* TYPE_SPACE */ + case '\v': /* TYPE_SPACE */ forbidNone = 1; extra++; /* Escape sequences all one byte longer. */ #if COMPAT preferBrace = 1; #endif break; - case '\\': + case '\\': /* TYPE_SUBS */ extra++; /* Escape '\' => '\\' */ if ((length == 1) || ((length == -1) && (p[1] == '\0'))) { /* Final backslash. Cannot format with brace quoting. */ @@ -1041,13 +1043,14 @@ TclScanElement( preferBrace = 1; #endif break; - case '\0': + case '\0': /* TYPE_SUBS */ if (length == -1) { goto endOfString; } /* TODO: Panic on improper encoding? */ break; } + } length -= (length > 0); p++; } |