Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Turn constants into an enum |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk | main |
Files: | files | file ages | folders |
SHA3-256: |
5611b610925a7a309fcc74588ece1956 |
User & Date: | dkf 2024-12-13 15:23:02.702 |
Context
2024-12-14
| ||
23:38 | Fix [63449c0514]: [namespace children] doesn't match non-glob patterns below the global namespace. ... check-in: b6ae5707d9 user: jan.nijtmans tags: trunk, main | |
2024-12-13
| ||
15:23 | Turn constants into an enum check-in: 5611b61092 user: dkf tags: trunk, main | |
13:54 | taming constants with enums in the zipfs code; it's still ugly but it's not so awful as it was (and ... check-in: 5a3380a837 user: dkf tags: trunk, main | |
Changes
Changes to generic/tclUtil.c.
︙ | ︙ | |||
53 54 55 56 57 58 59 | * are for internal use only. Make sure they do not overlap with the public * values above. * * The Tcl*Scan*Element() routines make a determination which of 4 modes of * conversion is most appropriate for Tcl*Convert*Element() to perform, and * sets two bits of the flags value to indicate the mode selected. * | < < < < < < < < < < < < < < < < < < < < < < < < < < < | | > > > > > | > | > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > | > | 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | * are for internal use only. Make sure they do not overlap with the public * values above. * * The Tcl*Scan*Element() routines make a determination which of 4 modes of * conversion is most appropriate for Tcl*Convert*Element() to perform, and * sets two bits of the flags value to indicate the mode selected. * * For more details, see the comments on the Tcl*Scan*Element and * Tcl*Convert*Element routines. */ enum ConvertFlags { CONVERT_NONE = 0, /* The element needs no quoting. Its literal * string is suitable as is. */ DONT_USE_BRACES = TCL_DONT_USE_BRACES, /* The caller is insisting that brace quoting * not be used when converting the list * element. */ CONVERT_BRACE = 2, /* The conversion should be enclosing the * literal string in braces. */ CONVERT_ESCAPE = 4, /* The conversion should be using backslashes * to escape any characters in the string that * require it. */ DONT_QUOTE_HASH = TCL_DONT_QUOTE_HASH, /* 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.*/ CONVERT_MASK = CONVERT_BRACE | CONVERT_ESCAPE, /* A mask value used to extract the conversion * mode from the flags argument. * * Also indicates a strange conversion mode * where all special characters are escaped * with backslashes *except for braces*. This * is a strange and unnecessary case, but it's * part of the historical way in which lists * have been formatted in Tcl. To experiment * with removing this case, define the value of * COMPAT to be 0. */ CONVERT_ANY = 16 /* The caller of TclScanElement() declares it * can make no promise about what public flags * will be passed to the matching call of * TclConvertElement(). As such, * TclScanElement() has to determine the worst * case destination buffer length over all * possibilities, and in other cases this means * an overestimate of the required size. * * Used only by callers of TclScanElement(). * The flag value produced by a call to * Tcl*Scan*Element() will never leave this * bit set. */ }; #ifndef COMPAT #define COMPAT 1 #endif /* * Prototypes for functions defined later in this file. */ static void ClearHash(Tcl_HashTable *tablePtr); static void FreeProcessGlobalValue(void *clientData); |
︙ | ︙ | |||
1061 1062 1063 1064 1065 1066 1067 | * the element #{a"b} like this: * {#{a"b}} * and not like this: * \#{a\"b} * This is inconsistent with [list x{a"b}], but we will not change that now. * Set that preference here so that we compute a tight size requirement. */ | | | 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 | * the element #{a"b} like this: * {#{a"b}} * and not like this: * \#{a\"b} * This is inconsistent with [list x{a"b}], but we will not change that now. * Set that preference here so that we compute a tight size requirement. */ if ((*src == '#') && !(*flagPtr & DONT_QUOTE_HASH)) { preferBrace = 1; } #endif if ((*p == '{') || (*p == '"')) { /* * Must escape or protect so leading character of value is not |
︙ | ︙ | |||
1200 1201 1202 1203 1204 1205 1206 | bytesNeeded += extra; /* * Make room to escape leading #, if needed. */ | | | | | | | | | 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 | bytesNeeded += extra; /* * Make room to escape leading #, if needed. */ if ((*src == '#') && !(*flagPtr & DONT_QUOTE_HASH)) { bytesNeeded++; } *flagPtr = CONVERT_ESCAPE; return bytesNeeded; } if (*flagPtr & CONVERT_ANY) { /* * The caller has not let us know what flags it will pass to * TclConvertElement() so compute the max size we might need for any * possible choice. Normally the formatting using escape sequences is * the longer one, and a minimum "extra" value of 2 makes sure we * don't request too small a buffer in those edge cases where that's * not true. */ if (extra < 2) { extra = 2; } *flagPtr &= ~CONVERT_ANY; *flagPtr |= DONT_USE_BRACES; } if (forbidNone) { /* * We must request some form of quoting of escaping... */ #if COMPAT if (preferEscape && !preferBrace) { /* * If we are quoting solely due to ] or internal " characters use * the CONVERT_MASK mode where we escape all special characters * except for braces. "extra" counted space needed to escape * braces too, so subtract "braceCount" to get our actual needs. */ bytesNeeded += (extra - braceCount); /* Make room to escape leading #, if needed. */ if ((*src == '#') && !(*flagPtr & DONT_QUOTE_HASH)) { bytesNeeded++; } /* * If the caller reports it will direct TclConvertElement() to * use full escapes on the element, add back the bytes needed to * escape the braces. */ if (*flagPtr & DONT_USE_BRACES) { bytesNeeded += braceCount; } *flagPtr = CONVERT_MASK; return bytesNeeded; } #endif /* COMPAT */ if (*flagPtr & DONT_USE_BRACES) { /* * If the caller reports it will direct TclConvertElement() to * use escapes, add the extra bytes needed to have room for them. */ bytesNeeded += extra; /* * Make room to escape leading #, if needed. */ if ((*src == '#') && !(*flagPtr & DONT_QUOTE_HASH)) { bytesNeeded++; } } else { /* * Add 2 bytes for room for the enclosing braces. */ bytesNeeded += 2; } *flagPtr = CONVERT_BRACE; return bytesNeeded; } /* * So far, no need to quote or escape anything. */ if ((*src == '#') && !(*flagPtr & DONT_QUOTE_HASH)) { /* * If we need to quote a leading #, make room to enclose in braces. */ bytesNeeded += 2; } *flagPtr = CONVERT_NONE; |
︙ | ︙ | |||
1394 1395 1396 1397 1398 1399 1400 | int conversion = flags & CONVERT_MASK; char *p = dst; /* * Let the caller demand we use escape sequences rather than braces. */ | | | | 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 | int conversion = flags & CONVERT_MASK; char *p = dst; /* * Let the caller demand we use escape sequences rather than braces. */ if ((flags & DONT_USE_BRACES) && (conversion & CONVERT_BRACE)) { conversion = CONVERT_ESCAPE; } /* * No matter what the caller demands, empty string must be braced! */ if ((src == NULL) || (length == 0) || (*src == '\0' && length == TCL_INDEX_NONE)) { p[0] = '{'; p[1] = '}'; return 2; } /* * Escape leading hash as needed and requested. */ if ((*src == '#') && !(flags & DONT_QUOTE_HASH)) { if (conversion == CONVERT_ESCAPE) { p[0] = '\\'; p[1] = '#'; p += 2; src++; length -= (length > 0); } else { |
︙ | ︙ | |||
1596 1597 1598 1599 1600 1601 1602 | if (argc <= LOCAL_SIZE) { flagPtr = localFlags; } else { flagPtr = (char *)Tcl_Alloc(argc); } for (i = 0; i < argc; i++) { | | | | 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 | if (argc <= LOCAL_SIZE) { flagPtr = localFlags; } else { flagPtr = (char *)Tcl_Alloc(argc); } for (i = 0; i < argc; i++) { flagPtr[i] = ( i ? DONT_QUOTE_HASH : 0 ); bytesNeeded += TclScanElement(argv[i], TCL_INDEX_NONE, &flagPtr[i]); } bytesNeeded += argc; /* * Pass two: copy into the result area. */ result = (char *)Tcl_Alloc(bytesNeeded); dst = result; for (i = 0; i < argc; i++) { flagPtr[i] |= ( i ? DONT_QUOTE_HASH : 0 ); dst += TclConvertElement(argv[i], TCL_INDEX_NONE, dst, flagPtr[i]); *dst = ' '; dst++; } dst[-1] = 0; if (flagPtr != localFlags) { |
︙ | ︙ | |||
2730 2731 2732 2733 2734 2735 2736 | while ((--dst >= dsPtr->string) && TclIsSpaceProcM(*dst)) { } /* Call again without whitespace to confound things. */ quoteHash = !TclNeedSpace(dsPtr->string, dst+1); } if (!quoteHash) { | | | | 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 | while ((--dst >= dsPtr->string) && TclIsSpaceProcM(*dst)) { } /* Call again without whitespace to confound things. */ quoteHash = !TclNeedSpace(dsPtr->string, dst+1); } if (!quoteHash) { flags |= DONT_QUOTE_HASH; } newSize = dsPtr->length + needSpace + TclScanElement(element, TCL_INDEX_NONE, &flags); if (!quoteHash) { flags |= DONT_QUOTE_HASH; } /* * Allocate a larger buffer for the string if the current one isn't large * enough. Allocate extra space in the new buffer so that there will be * room to grow before we have to allocate again. SPECIAL NOTE: must use * memcpy, not strcpy, to copy the string to a larger buffer, since there |
︙ | ︙ |