diff options
Diffstat (limited to 'generic/tclUtil.c')
-rw-r--r-- | generic/tclUtil.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 4321833..10cddf2 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUtil.c,v 1.42 2003/08/27 21:31:05 dgp Exp $ + * RCS: @(#) $Id: tclUtil.c,v 1.43 2003/09/04 16:44:12 dgp Exp $ */ #include "tclInt.h" @@ -29,9 +29,9 @@ char *tclNativeExecutableName = NULL; /* * The following values are used in the flags returned by Tcl_ScanElement - * and used by Tcl_ConvertElement. The value TCL_DONT_USE_BRACES is also - * defined in tcl.h; make sure its value doesn't overlap with any of the - * values below. + * and used by Tcl_ConvertElement. The values TCL_DONT_USE_BRACES and + * TCL_DONT_QUOTE_HASH are defined in tcl.h; make sure neither value + * overlaps with any of the values below. * * TCL_DONT_USE_BRACES - 1 means the string mustn't be enclosed in * braces (e.g. it contains unmatched braces, @@ -43,6 +43,12 @@ char *tclNativeExecutableName = NULL; * enclosing the entire argument in braces. * BRACES_UNMATCHED - 1 means that braces aren't properly matched * in the argument. + * TCL_DONT_QUOTE_HASH - 1 means the caller insists that a leading + * hash character ('#') should *not* be quoted. + * This is appropriate when the caller can + * guarantee the element is not the first element + * of a list, so [eval] cannot mis-parse the + * element as a comment. */ #define USE_BRACES 2 @@ -733,6 +739,9 @@ Tcl_ConvertCountedElement(src, length, dst, flags) return 2; } lastChar = src + length; + if ((*src == '#') && !(flags & TCL_DONT_QUOTE_HASH)) { + flags |= USE_BRACES; + } if ((flags & USE_BRACES) && !(flags & TCL_DONT_USE_BRACES)) { *p = '{'; p++; @@ -755,6 +764,17 @@ Tcl_ConvertCountedElement(src, length, dst, flags) p += 2; src++; flags |= BRACES_UNMATCHED; + } else if ((*src == '#') && !(flags & TCL_DONT_QUOTE_HASH)) { + /* + * Leading '#' could be seen by [eval] as the start of + * a comment, if on the first element of a list, so + * quote it. + */ + + p[0] = '\\'; + p[1] = '#'; + p += 2; + src++; } for (; src != lastChar; src++) { switch (*src) { @@ -877,7 +897,8 @@ Tcl_Merge(argc, argv) result = (char *) ckalloc((unsigned) numChars); dst = result; for (i = 0; i < argc; i++) { - numChars = Tcl_ConvertElement(argv[i], dst, flagPtr[i]); + numChars = Tcl_ConvertElement(argv[i], dst, + flagPtr[i] | (i==0 ? 0 : TCL_DONT_QUOTE_HASH) ); dst += numChars; *dst = ' '; dst++; @@ -1556,6 +1577,12 @@ Tcl_DStringAppendElement(dsPtr, string) *dst = ' '; dst++; dsPtr->length++; + /* + * If we need a space to separate this element from preceding + * stuff, then this element will not lead a list, and need not + * have it's leading '#' quoted. + */ + flags |= TCL_DONT_QUOTE_HASH; } dsPtr->length += Tcl_ConvertCountedElement(string, strSize, dst, flags); return dsPtr->string; |