Compare commits
21
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9215c2610c | ||
|
|
b44ffcf5e2 | ||
|
|
ff436137df | ||
|
|
24d7fa6401 | ||
|
|
65007a4d02 | ||
|
|
59ebc49f0f | ||
|
|
d7b5cde35f | ||
|
|
ba9e81068e | ||
|
|
a7b6d60948 | ||
|
|
a92e1c508f | ||
|
|
0fc6533fcb | ||
|
|
1ffeaf24ef | ||
|
|
729fcd5f09 | ||
|
|
b8bf04f5ec | ||
|
|
f31af075d0 | ||
|
|
f74bde3e62 | ||
|
|
98c6b22c10 | ||
|
|
be0c5786a0 | ||
|
|
fd61a8e89e | ||
|
|
ac4fb39a73 | ||
|
|
22719c6596 |
+1
-1
@@ -257,7 +257,7 @@ The \fBincr\fR command first gets an integer from \fIx\fR's value
|
||||
by calling \fBTcl_GetIntFromObj\fR.
|
||||
This procedure checks whether the value is already an integer value.
|
||||
Since it is not, it converts the value
|
||||
by setting the value's \fIinternalRep.longValue\fR member
|
||||
by setting the value's internal representation
|
||||
to the integer \fB123\fR
|
||||
and setting the value's \fItypePtr\fR
|
||||
to point to the integer Tcl_ObjType structure.
|
||||
|
||||
+2
-2
@@ -54,9 +54,9 @@ is called, Tcl will take care of memory management.
|
||||
.PP
|
||||
The second triplet stores the snapshot of only the interpreter
|
||||
result (not its complete state) in memory allocated by the caller.
|
||||
These routines are passed a pointer to a \fBTcl_SavedResult\fR structure
|
||||
These routines are passed a pointer to \fBTcl_SavedResult\fR
|
||||
that is used to store enough information to restore the interpreter result.
|
||||
This structure can be allocated on the stack of the calling
|
||||
\fBTcl_SavedResult\fR can be allocated on the stack of the calling
|
||||
procedure. These routines do not save the state of any error
|
||||
information in the interpreter (e.g. the \fB\-errorcode\fR or
|
||||
\fB\-errorinfo\fR return options, when an error is in progress).
|
||||
|
||||
@@ -469,7 +469,6 @@ declare 128 {
|
||||
declare 129 {
|
||||
int Tcl_Eval(Tcl_Interp *interp, const char *script)
|
||||
}
|
||||
# This is obsolete, use Tcl_FSEvalFile
|
||||
declare 130 {
|
||||
int Tcl_EvalFile(Tcl_Interp *interp, const char *fileName)
|
||||
}
|
||||
|
||||
+20
-3
@@ -309,7 +309,7 @@ Tcl_RegexpObjCmd(
|
||||
eflags = 0;
|
||||
} else if (offset > stringLength) {
|
||||
eflags = TCL_REG_NOTBOL;
|
||||
} else if (Tcl_GetUniChar(objPtr, offset-1) == (Tcl_UniChar)'\n') {
|
||||
} else if (Tcl_GetUniChar(objPtr, offset-1) == '\n') {
|
||||
eflags = 0;
|
||||
} else {
|
||||
eflags = TCL_REG_NOTBOL;
|
||||
@@ -1080,13 +1080,22 @@ Tcl_SplitObjCmd(
|
||||
Tcl_InitHashTable(&charReuseTable, TCL_ONE_WORD_KEYS);
|
||||
|
||||
for ( ; stringPtr < end; stringPtr += len) {
|
||||
int fullchar;
|
||||
len = TclUtfToUniChar(stringPtr, &ch);
|
||||
fullchar = ch;
|
||||
|
||||
#if TCL_UTF_MAX == 4
|
||||
if (!len) {
|
||||
len += TclUtfToUniChar(stringPtr, &ch);
|
||||
fullchar = (((fullchar & 0x3ff) << 10) | (ch & 0x3ff)) + 0x10000;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Assume Tcl_UniChar is an integral type...
|
||||
*/
|
||||
|
||||
hPtr = Tcl_CreateHashEntry(&charReuseTable, INT2PTR((int) ch),
|
||||
hPtr = Tcl_CreateHashEntry(&charReuseTable, INT2PTR(fullchar),
|
||||
&isNew);
|
||||
if (isNew) {
|
||||
TclNewStringObj(objPtr, stringPtr, len);
|
||||
@@ -1783,8 +1792,16 @@ StringIsCmd(
|
||||
}
|
||||
end = string1 + length1;
|
||||
for (; string1 < end; string1 += length2, failat++) {
|
||||
int fullchar;
|
||||
length2 = TclUtfToUniChar(string1, &ch);
|
||||
if (!chcomp(ch)) {
|
||||
fullchar = ch;
|
||||
#if TCL_UTF_MAX == 4
|
||||
if (!length2) {
|
||||
length2 = TclUtfToUniChar(string1, &ch);
|
||||
fullchar = (((fullchar & 0x3ff) << 10) | (ch & 0x3ff)) + 0x10000;
|
||||
}
|
||||
#endif
|
||||
if (!chcomp(fullchar)) {
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -487,15 +487,14 @@ static void
|
||||
UpdateStringOfDict(
|
||||
Tcl_Obj *dictPtr)
|
||||
{
|
||||
#define LOCAL_SIZE 20
|
||||
int localFlags[LOCAL_SIZE], *flagPtr = NULL;
|
||||
#define LOCAL_SIZE 64
|
||||
char localFlags[LOCAL_SIZE], *flagPtr = NULL;
|
||||
Dict *dict = DICT(dictPtr);
|
||||
ChainEntry *cPtr;
|
||||
Tcl_Obj *keyPtr, *valuePtr;
|
||||
int i, length, bytesNeeded = 0;
|
||||
const char *elem;
|
||||
char *dst;
|
||||
const int maxFlags = UINT_MAX / sizeof(int);
|
||||
|
||||
/*
|
||||
* This field is the most useful one in the whole hash structure, and it
|
||||
@@ -517,10 +516,8 @@ UpdateStringOfDict(
|
||||
|
||||
if (numElems <= LOCAL_SIZE) {
|
||||
flagPtr = localFlags;
|
||||
} else if (numElems > maxFlags) {
|
||||
Tcl_Panic("max size for a Tcl value (%d bytes) exceeded", INT_MAX);
|
||||
} else {
|
||||
flagPtr = ckalloc(numElems * sizeof(int));
|
||||
flagPtr = ckalloc(numElems);
|
||||
}
|
||||
for (i=0,cPtr=dict->entryChainHead; i<numElems; i+=2,cPtr=cPtr->nextPtr) {
|
||||
/*
|
||||
|
||||
+8
-5
@@ -1014,12 +1014,18 @@ static void
|
||||
RebuildTable(
|
||||
register Tcl_HashTable *tablePtr) /* Table to enlarge. */
|
||||
{
|
||||
int oldSize, count, index;
|
||||
Tcl_HashEntry **oldBuckets;
|
||||
int count, index, oldSize = tablePtr->numBuckets;
|
||||
Tcl_HashEntry **oldBuckets = tablePtr->buckets;
|
||||
register Tcl_HashEntry **oldChainPtr, **newChainPtr;
|
||||
register Tcl_HashEntry *hPtr;
|
||||
const Tcl_HashKeyType *typePtr;
|
||||
|
||||
/* Avoid outgrowing capability of the memory allocators */
|
||||
if (oldSize > (int)(UINT_MAX / (4 * sizeof(Tcl_HashEntry *)))) {
|
||||
tablePtr->rebuildSize = INT_MAX;
|
||||
return;
|
||||
}
|
||||
|
||||
if (tablePtr->keyType == TCL_STRING_KEYS) {
|
||||
typePtr = &tclStringHashKeyType;
|
||||
} else if (tablePtr->keyType == TCL_ONE_WORD_KEYS) {
|
||||
@@ -1031,9 +1037,6 @@ RebuildTable(
|
||||
typePtr = &tclArrayHashKeyType;
|
||||
}
|
||||
|
||||
oldSize = tablePtr->numBuckets;
|
||||
oldBuckets = tablePtr->buckets;
|
||||
|
||||
/*
|
||||
* Allocate and initialize the new bucket array, and set up hashing
|
||||
* constants for new array size.
|
||||
|
||||
@@ -412,7 +412,6 @@ Tcl_GetCwd(
|
||||
return Tcl_DStringValue(cwdPtr);
|
||||
}
|
||||
|
||||
/* Obsolete */
|
||||
int
|
||||
Tcl_EvalFile(
|
||||
Tcl_Interp *interp, /* Interpreter in which to process file. */
|
||||
|
||||
@@ -878,7 +878,8 @@ Tcl_WrongNumArgs(
|
||||
* NULL. */
|
||||
{
|
||||
Tcl_Obj *objPtr;
|
||||
int i, len, elemLen, flags;
|
||||
int i, len, elemLen;
|
||||
char flags;
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
const char *elementStr;
|
||||
|
||||
|
||||
+1
-1
@@ -3106,7 +3106,7 @@ MODULE_SCOPE int TclReToGlob(Tcl_Interp *interp, const char *reStr,
|
||||
int reStrLen, Tcl_DString *dsPtr, int *flagsPtr,
|
||||
int *quantifiersFoundPtr);
|
||||
MODULE_SCOPE int TclScanElement(const char *string, int length,
|
||||
int *flagPtr);
|
||||
char *flagPtr);
|
||||
MODULE_SCOPE void TclSetBgErrorHandler(Tcl_Interp *interp,
|
||||
Tcl_Obj *cmdPrefix);
|
||||
MODULE_SCOPE void TclSetBignumIntRep(Tcl_Obj *objPtr,
|
||||
|
||||
@@ -559,6 +559,8 @@ extern const TclIntPlatStubs *tclIntPlatStubsPtr;
|
||||
# define TclWinGetServByName getservbyname
|
||||
# define TclWinGetSockOpt getsockopt
|
||||
# define TclWinSetSockOpt setsockopt
|
||||
# undef TclWinGetPlatformId
|
||||
# define TclWinGetPlatformId() (2) /* VER_PLATFORM_WIN32_NT */
|
||||
#else
|
||||
# undef TclpGetPid
|
||||
# define TclpGetPid(pid) ((unsigned long) (pid))
|
||||
|
||||
@@ -1957,8 +1957,8 @@ static void
|
||||
UpdateStringOfList(
|
||||
Tcl_Obj *listPtr) /* List object with string rep to update. */
|
||||
{
|
||||
# define LOCAL_SIZE 20
|
||||
int localFlags[LOCAL_SIZE], *flagPtr = NULL;
|
||||
# define LOCAL_SIZE 64
|
||||
char localFlags[LOCAL_SIZE], *flagPtr = NULL;
|
||||
List *listRepPtr = ListRepPtr(listPtr);
|
||||
int numElems = listRepPtr->elemCount;
|
||||
int i, length, bytesNeeded = 0;
|
||||
@@ -1995,7 +1995,7 @@ UpdateStringOfList(
|
||||
* We know numElems <= LIST_MAX, so this is safe.
|
||||
*/
|
||||
|
||||
flagPtr = ckalloc(numElems * sizeof(int));
|
||||
flagPtr = ckalloc(numElems);
|
||||
}
|
||||
elemPtrs = &listRepPtr->elements;
|
||||
for (i = 0; i < numElems; i++) {
|
||||
|
||||
+4
-1
@@ -537,7 +537,8 @@ KillFoundation(
|
||||
* AllocObject --
|
||||
*
|
||||
* Allocate an object of basic type. Does not splice the object into its
|
||||
* class's instance list.
|
||||
* class's instance list. The caller must set the classPtr on the object,
|
||||
* either to a class or to NULL.
|
||||
*
|
||||
* ----------------------------------------------------------------------
|
||||
*/
|
||||
@@ -1672,6 +1673,8 @@ Tcl_NewObjectInstance(
|
||||
AllocClass(interp, oPtr);
|
||||
oPtr->selfCls = classPtr;
|
||||
TclOOAddToSubclasses(oPtr->classPtr, fPtr->objectCls);
|
||||
} else {
|
||||
oPtr->classPtr = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+60
-37
@@ -352,7 +352,7 @@ PkgRequireCore(
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Package *pkgPtr;
|
||||
PkgAvail *availPtr, *bestPtr, *bestStablePtr;
|
||||
char *availVersion, *bestVersion;
|
||||
char *availVersion, *bestVersion, *bestStableVersion;
|
||||
/* Internal rep. of versions */
|
||||
int availStable, code, satisfies, pass;
|
||||
char *script, *pkgVersionI;
|
||||
@@ -400,6 +400,7 @@ PkgRequireCore(
|
||||
bestPtr = NULL;
|
||||
bestStablePtr = NULL;
|
||||
bestVersion = NULL;
|
||||
bestStableVersion = NULL;
|
||||
|
||||
for (availPtr = pkgPtr->availPtr; availPtr != NULL;
|
||||
availPtr = availPtr->nextPtr) {
|
||||
@@ -413,33 +414,9 @@ PkgRequireCore(
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bestPtr != NULL) {
|
||||
int res = CompareVersions(availVersion, bestVersion, NULL);
|
||||
|
||||
/*
|
||||
* Note: Use internal reps!
|
||||
*/
|
||||
|
||||
if (res <= 0) {
|
||||
/*
|
||||
* The version of the package sought is not as good as the
|
||||
* currently selected version. Ignore it.
|
||||
*/
|
||||
|
||||
ckfree(availVersion);
|
||||
availVersion = NULL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We have found a version which is better than our max.
|
||||
*/
|
||||
|
||||
|
||||
/* Check satisfaction of requirements before considering the current version further. */
|
||||
if (reqc > 0) {
|
||||
/* Check satisfaction of requirements. */
|
||||
|
||||
satisfies = SomeRequirementSatisfied(availVersion, reqc, reqv);
|
||||
if (!satisfies) {
|
||||
ckfree(availVersion);
|
||||
@@ -447,26 +424,72 @@ PkgRequireCore(
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (bestPtr != NULL) {
|
||||
int res = CompareVersions(availVersion, bestVersion, NULL);
|
||||
|
||||
bestPtr = availPtr;
|
||||
/*
|
||||
* Note: Used internal reps in the comparison!
|
||||
*/
|
||||
|
||||
if (bestVersion != NULL) {
|
||||
ckfree(bestVersion);
|
||||
if (res > 0) {
|
||||
/*
|
||||
* The version of the package sought is better than the
|
||||
* currently selected version.
|
||||
*/
|
||||
goto newbest;
|
||||
}
|
||||
} else {
|
||||
newbest:
|
||||
/* We have found a version which is better than our max. */
|
||||
|
||||
bestPtr = availPtr;
|
||||
CheckVersionAndConvert(interp, bestPtr->version, &bestVersion, NULL);
|
||||
}
|
||||
bestVersion = availVersion;
|
||||
|
||||
/*
|
||||
* If this new best version is stable then it also has to be
|
||||
* better than the max stable version found so far.
|
||||
*/
|
||||
if (!availStable) {
|
||||
ckfree(availVersion);
|
||||
availVersion = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (availStable) {
|
||||
if (bestStablePtr != NULL) {
|
||||
int res = CompareVersions(availVersion, bestStableVersion, NULL);
|
||||
|
||||
/*
|
||||
* Note: Used internal reps in the comparison!
|
||||
*/
|
||||
|
||||
if (res > 0) {
|
||||
/*
|
||||
* This stable version of the package sought is better
|
||||
* than the currently selected stable version.
|
||||
*/
|
||||
goto newstable;
|
||||
}
|
||||
} else {
|
||||
newstable:
|
||||
/* We have found a stable version which is better than our max stable. */
|
||||
bestStablePtr = availPtr;
|
||||
CheckVersionAndConvert(interp, bestStablePtr->version, &bestStableVersion, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
ckfree(availVersion);
|
||||
availVersion = NULL;
|
||||
} /* end for */
|
||||
|
||||
/*
|
||||
* Clean up memorized internal reps, if any.
|
||||
*/
|
||||
|
||||
if (bestVersion != NULL) {
|
||||
ckfree(bestVersion);
|
||||
bestVersion = NULL;
|
||||
}
|
||||
|
||||
if (bestStableVersion != NULL) {
|
||||
ckfree(bestStableVersion);
|
||||
bestStableVersion = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+10
-2
@@ -885,9 +885,17 @@ Tcl_ScanObjCmd(
|
||||
* Scan a single Unicode character.
|
||||
*/
|
||||
|
||||
string += TclUtfToUniChar(string, &sch);
|
||||
offset = TclUtfToUniChar(string, &sch);
|
||||
i = (int)sch;
|
||||
#if TCL_UTF_MAX == 4
|
||||
if (!offset) {
|
||||
offset = Tcl_UtfToUniChar(string, &sch);
|
||||
i = (((i<<10) & 0x0FFC00) + 0x10000) + (sch & 0x3FF);
|
||||
}
|
||||
#endif
|
||||
string += offset;
|
||||
if (!(flags & SCAN_SUPPRESS)) {
|
||||
objPtr = Tcl_NewIntObj((int)sch);
|
||||
objPtr = Tcl_NewIntObj(i);
|
||||
Tcl_IncrRefCount(objPtr);
|
||||
CLANG_ASSERT(objs);
|
||||
objs[objIndex++] = objPtr;
|
||||
|
||||
@@ -2720,7 +2720,6 @@ TclStringObjReverse(
|
||||
* Tcl_SetObjLength into growing the unicode rep buffer.
|
||||
*/
|
||||
|
||||
ch = 0;
|
||||
objPtr = Tcl_NewUnicodeObj(&ch, 1);
|
||||
Tcl_SetObjLength(objPtr, stringPtr->numChars);
|
||||
to = Tcl_GetUnicode(objPtr);
|
||||
@@ -2823,7 +2822,7 @@ ExtendUnicodeRepWithString(
|
||||
{
|
||||
String *stringPtr = GET_STRING(objPtr);
|
||||
int needed, numOrigChars = 0;
|
||||
Tcl_UniChar *dst;
|
||||
Tcl_UniChar *dst, unichar = 0;
|
||||
|
||||
if (stringPtr->hasUnicode) {
|
||||
numOrigChars = stringPtr->numChars;
|
||||
@@ -2846,7 +2845,8 @@ ExtendUnicodeRepWithString(
|
||||
numAppendChars = 0;
|
||||
}
|
||||
for (dst=stringPtr->unicode + numOrigChars; numAppendChars-- > 0; dst++) {
|
||||
bytes += TclUtfToUniChar(bytes, dst);
|
||||
bytes += TclUtfToUniChar(bytes, &unichar);
|
||||
*dst = unichar;
|
||||
}
|
||||
*dst = 0;
|
||||
}
|
||||
|
||||
@@ -118,8 +118,6 @@ TclpIsAtty(int fd)
|
||||
static int
|
||||
TclWinGetPlatformId()
|
||||
{
|
||||
/* Don't bother to determine the real platform on cygwin,
|
||||
* because VER_PLATFORM_WIN32_NT is the only supported platform */
|
||||
return 2; /* VER_PLATFORM_WIN32_NT */;
|
||||
}
|
||||
|
||||
|
||||
+6
-21
@@ -974,7 +974,7 @@ Tcl_ScanCountedElement(
|
||||
int *flagPtr) /* Where to store information to guide
|
||||
* Tcl_ConvertElement. */
|
||||
{
|
||||
int flags = CONVERT_ANY;
|
||||
char flags = CONVERT_ANY;
|
||||
int numBytes = TclScanElement(src, length, &flags);
|
||||
|
||||
*flagPtr = flags;
|
||||
@@ -1015,7 +1015,7 @@ int
|
||||
TclScanElement(
|
||||
const char *src, /* String to convert to Tcl list element. */
|
||||
int length, /* Number of bytes in src, or -1. */
|
||||
int *flagPtr) /* Where to store information to guide
|
||||
char *flagPtr) /* Where to store information to guide
|
||||
* Tcl_ConvertElement. */
|
||||
{
|
||||
const char *p = src;
|
||||
@@ -1547,11 +1547,10 @@ Tcl_Merge(
|
||||
int argc, /* How many strings to merge. */
|
||||
const char *const *argv) /* Array of string values. */
|
||||
{
|
||||
#define LOCAL_SIZE 20
|
||||
int localFlags[LOCAL_SIZE], *flagPtr = NULL;
|
||||
#define LOCAL_SIZE 64
|
||||
char localFlags[LOCAL_SIZE], *flagPtr = NULL;
|
||||
int i, bytesNeeded = 0;
|
||||
char *result, *dst;
|
||||
const int maxFlags = UINT_MAX / sizeof(int);
|
||||
|
||||
/*
|
||||
* Handle empty list case first, so logic of the general case can be
|
||||
@@ -1570,22 +1569,8 @@ Tcl_Merge(
|
||||
|
||||
if (argc <= LOCAL_SIZE) {
|
||||
flagPtr = localFlags;
|
||||
} else if (argc > maxFlags) {
|
||||
/*
|
||||
* We cannot allocate a large enough flag array to format this list in
|
||||
* one pass. We could imagine converting this routine to a multi-pass
|
||||
* implementation, but for sizeof(int) == 4, the limit is a max of
|
||||
* 2^30 list elements and since each element is at least one byte
|
||||
* formatted, and requires one byte space between it and the next one,
|
||||
* that a minimum space requirement of 2^31 bytes, which is already
|
||||
* INT_MAX. If we tried to format a list of > maxFlags elements, we're
|
||||
* just going to overflow the size limits on the formatted string
|
||||
* anyway, so just issue that same panic early.
|
||||
*/
|
||||
|
||||
Tcl_Panic("max size for a Tcl value (%d bytes) exceeded", INT_MAX);
|
||||
} else {
|
||||
flagPtr = ckalloc(argc * sizeof(int));
|
||||
flagPtr = ckalloc(argc);
|
||||
}
|
||||
for (i = 0; i < argc; i++) {
|
||||
flagPtr[i] = ( i ? TCL_DONT_QUOTE_HASH : 0 );
|
||||
@@ -2717,7 +2702,7 @@ Tcl_DStringAppendElement(
|
||||
{
|
||||
char *dst = dsPtr->string + dsPtr->length;
|
||||
int needSpace = TclNeedSpace(dsPtr->string, dst);
|
||||
int flags = needSpace ? TCL_DONT_QUOTE_HASH : 0;
|
||||
char flags = needSpace ? TCL_DONT_QUOTE_HASH : 0;
|
||||
int newSize = dsPtr->length + needSpace
|
||||
+ TclScanElement(element, -1, &flags);
|
||||
|
||||
|
||||
@@ -599,6 +599,16 @@ test package-3.52 {Tcl_PkgRequire procedure, picking best stable version} -setup
|
||||
package require t
|
||||
return $x
|
||||
} -result {1.3}
|
||||
test pkg-3.53 {Tcl_PkgRequire procedure, picking best stable version} {
|
||||
package forget t
|
||||
foreach i {1.2b1 1.1} {
|
||||
package ifneeded t $i "set x $i; package provide t $i"
|
||||
}
|
||||
set x xxx
|
||||
package require t
|
||||
set x
|
||||
} {1.1}
|
||||
|
||||
|
||||
test package-4.1 {Tcl_PackageCmd procedure} -returnCodes error -body {
|
||||
package
|
||||
|
||||
@@ -70,6 +70,9 @@ test split-1.13 {basic split commands} {
|
||||
test split-1.14 {basic split commands} {
|
||||
split ",12,,,34,56," {,}
|
||||
} {{} 12 {} {} 34 56 {}}
|
||||
test split-1.15 {basic split commands} -body {
|
||||
split "a\U01f4a9b" {}
|
||||
} -result "a \U01f4a9 b"
|
||||
|
||||
test split-2.1 {split errors} {
|
||||
list [catch split msg] $msg $errorCode
|
||||
|
||||
+13
-13
@@ -1682,40 +1682,40 @@ test string-24.4 {string reverse command - unshared string} {
|
||||
string reverse $x$y
|
||||
} edcba
|
||||
test string-24.5 {string reverse command - shared unicode string} {
|
||||
set x abcde\udead
|
||||
set x abcde\ud0ad
|
||||
string reverse $x
|
||||
} \udeadedcba
|
||||
} \ud0adedcba
|
||||
test string-24.6 {string reverse command - unshared string} {
|
||||
set x abc
|
||||
set y de\udead
|
||||
set y de\ud0ad
|
||||
string reverse $x$y
|
||||
} \udeadedcba
|
||||
} \ud0adedcba
|
||||
test string-24.7 {string reverse command - simple case} {
|
||||
string reverse a
|
||||
} a
|
||||
test string-24.8 {string reverse command - simple case} {
|
||||
string reverse \udead
|
||||
} \udead
|
||||
string reverse \ud0ad
|
||||
} \ud0ad
|
||||
test string-24.9 {string reverse command - simple case} {
|
||||
string reverse {}
|
||||
} {}
|
||||
test string-24.10 {string reverse command - corner case} {
|
||||
set x \ubeef\udead
|
||||
set x \ubeef\ud0ad
|
||||
string reverse $x
|
||||
} \udead\ubeef
|
||||
} \ud0ad\ubeef
|
||||
test string-24.11 {string reverse command - corner case} {
|
||||
set x \ubeef
|
||||
set y \udead
|
||||
set y \ud0ad
|
||||
string reverse $x$y
|
||||
} \udead\ubeef
|
||||
} \ud0ad\ubeef
|
||||
test string-24.12 {string reverse command - corner case} {
|
||||
set x \ubeef
|
||||
set y \udead
|
||||
set y \ud0ad
|
||||
string is ascii [string reverse $x$y]
|
||||
} 0
|
||||
test string-24.13 {string reverse command - pure Unicode string} {
|
||||
string reverse [string range \ubeef\udead\ubeef\udead\ubeef\udead 1 5]
|
||||
} \udead\ubeef\udead\ubeef\udead
|
||||
string reverse [string range \ubeef\ud0ad\ubeef\ud0ad\ubeef\ud0ad 1 5]
|
||||
} \ud0ad\ubeef\ud0ad\ubeef\ud0ad
|
||||
test string-24.14 {string reverse command - pure bytearray} {
|
||||
binary scan [string reverse [binary format H* 010203]] H* x
|
||||
set x
|
||||
|
||||
+2
-2
@@ -68,10 +68,10 @@ test utf-2.7 {Tcl_UtfToUniChar: lead (3-byte) followed by 2 trail} testbytestrin
|
||||
} {1}
|
||||
test utf-2.8 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail} -constraints {fullutf testbytestring} -body {
|
||||
string length [testbytestring "\xF0\x90\x80\x80"]
|
||||
} -result {1}
|
||||
} -result {2}
|
||||
test utf-2.9 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail} -constraints {fullutf testbytestring} -body {
|
||||
string length [testbytestring "\xF4\x8F\xBF\xBF"]
|
||||
} -result {1}
|
||||
} -result {2}
|
||||
test utf-2.10 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail, underflow} testbytestring {
|
||||
string length [testbytestring "\xF0\x8F\xBF\xBF"]
|
||||
} {4}
|
||||
|
||||
+8
-16
@@ -23,7 +23,6 @@
|
||||
*/
|
||||
|
||||
static HINSTANCE hInstance; /* HINSTANCE of this DLL. */
|
||||
static int platformId; /* Running under NT, or 95/98? */
|
||||
|
||||
/*
|
||||
* VC++ 5.x has no 'cpuid' assembler instruction, so we must emulate it
|
||||
@@ -186,18 +185,14 @@ TclWinInit(
|
||||
hInstance = hInst;
|
||||
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
||||
GetVersionExW(&os);
|
||||
platformId = os.dwPlatformId;
|
||||
|
||||
/*
|
||||
* We no longer support Win32s or Win9x, so just in case someone manages
|
||||
* to get a runtime there, make sure they know that.
|
||||
* We no longer support Win32s or Win9x or Windows CE, so just in case
|
||||
* someone manages to get a runtime there, make sure they know that.
|
||||
*/
|
||||
|
||||
if (platformId == VER_PLATFORM_WIN32s) {
|
||||
Tcl_Panic("Win32s is not a supported platform");
|
||||
}
|
||||
if (platformId == VER_PLATFORM_WIN32_WINDOWS) {
|
||||
Tcl_Panic("Windows 9x is not a supported platform");
|
||||
if (os.dwPlatformId != VER_PLATFORM_WIN32_NT) {
|
||||
Tcl_Panic("Windows NT is the only supported platform");
|
||||
}
|
||||
|
||||
TclWinResetInterfaces();
|
||||
@@ -212,22 +207,19 @@ TclWinInit(
|
||||
* conditional code.
|
||||
*
|
||||
* Results:
|
||||
* The return value is one of:
|
||||
* VER_PLATFORM_WIN32s Win32s on Windows 3.1 (not supported)
|
||||
* VER_PLATFORM_WIN32_WINDOWS Win32 on Windows 95, 98, ME (not supported)
|
||||
* VER_PLATFORM_WIN32_NT Win32 on Windows NT, 2000, XP
|
||||
* VER_PLATFORM_WIN32_CE Win32 on Windows CE
|
||||
* The return value is:
|
||||
* VER_PLATFORM_WIN32_NT Win32 on Windows NT, 2000, XP, 7, 8, 8.1, 10
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#undef TclWinGetPlatformId
|
||||
int
|
||||
TclWinGetPlatformId(void)
|
||||
{
|
||||
return platformId;
|
||||
return VER_PLATFORM_WIN32_NT;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ static const unsigned char errorTable[] = {
|
||||
ENOEXEC, /* ERROR_BAD_FORMAT 11 */
|
||||
EACCES, /* ERROR_INVALID_ACCESS 12 */
|
||||
EINVAL, /* ERROR_INVALID_DATA 13 */
|
||||
EFAULT, /* ERROR_OUT_OF_MEMORY 14 */
|
||||
ENOMEM, /* ERROR_OUT_OF_MEMORY 14 */
|
||||
ENOENT, /* ERROR_INVALID_DRIVE 15 */
|
||||
EACCES, /* ERROR_CURRENT_DIRECTORY 16 */
|
||||
EXDEV, /* ERROR_NOT_SAME_DEVICE 17 */
|
||||
|
||||
+2
-10
@@ -84,15 +84,10 @@ TclWinProcs tclWinProcs;
|
||||
|
||||
/*
|
||||
* The following arrays contain the human readable strings for the Windows
|
||||
* platform and processor values.
|
||||
* processor values.
|
||||
*/
|
||||
|
||||
|
||||
#define NUMPLATFORMS 4
|
||||
static const char *const platforms[NUMPLATFORMS] = {
|
||||
"Win32s", "Windows 95", "Windows NT", "Windows CE"
|
||||
};
|
||||
|
||||
#define NUMPROCESSORS 11
|
||||
static const char *const processors[NUMPROCESSORS] = {
|
||||
"intel", "mips", "alpha", "ppc", "shx", "arm", "ia64", "alpha64", "msil",
|
||||
@@ -568,10 +563,7 @@ TclpSetVariables(
|
||||
|
||||
Tcl_SetVar2(interp, "tcl_platform", "platform", "windows",
|
||||
TCL_GLOBAL_ONLY);
|
||||
if (osInfo.dwPlatformId < NUMPLATFORMS) {
|
||||
Tcl_SetVar2(interp, "tcl_platform", "os",
|
||||
platforms[osInfo.dwPlatformId], TCL_GLOBAL_ONLY);
|
||||
}
|
||||
Tcl_SetVar2(interp, "tcl_platform", "os", "Windows NT", TCL_GLOBAL_ONLY);
|
||||
wsprintfA(buffer, "%d.%d", osInfo.dwMajorVersion, osInfo.dwMinorVersion);
|
||||
Tcl_SetVar2(interp, "tcl_platform", "osVersion", buffer, TCL_GLOBAL_ONLY);
|
||||
if (sys.oemId.wProcessorArchitecture < NUMPROCESSORS) {
|
||||
|
||||
@@ -40,19 +40,6 @@ typedef struct TclWinProcs {
|
||||
|
||||
MODULE_SCOPE TclWinProcs tclWinProcs;
|
||||
|
||||
/*
|
||||
* Some versions of Borland C have a define for the OSVERSIONINFO for
|
||||
* Win32s and for NT, but not for Windows 95.
|
||||
* Define VER_PLATFORM_WIN32_CE for those without newer headers.
|
||||
*/
|
||||
|
||||
#ifndef VER_PLATFORM_WIN32_WINDOWS
|
||||
#define VER_PLATFORM_WIN32_WINDOWS 1
|
||||
#endif
|
||||
#ifndef VER_PLATFORM_WIN32_CE
|
||||
#define VER_PLATFORM_WIN32_CE 3
|
||||
#endif
|
||||
|
||||
#ifdef _WIN64
|
||||
# define TCL_I_MODIFIER "I"
|
||||
#else
|
||||
|
||||
+14
-31
@@ -1095,40 +1095,23 @@ TclpCreateProcess(
|
||||
* detached processes. The GUI window will still pop up to the foreground.
|
||||
*/
|
||||
|
||||
if (TclWinGetPlatformId() == VER_PLATFORM_WIN32_NT) {
|
||||
if (HasConsole()) {
|
||||
if (HasConsole()) {
|
||||
createFlags = 0;
|
||||
} else if (applType == APPL_DOS) {
|
||||
/*
|
||||
* Under NT, 16-bit DOS applications will not run unless they can
|
||||
* be attached to a console. If we are running without a console,
|
||||
* run the 16-bit program as an normal process inside of a hidden
|
||||
* console application, and then run that hidden console as a
|
||||
* detached process.
|
||||
*/
|
||||
} else if (applType == APPL_DOS) {
|
||||
/*
|
||||
* Under NT, 16-bit DOS applications will not run unless they can
|
||||
* be attached to a console. If we are running without a console,
|
||||
* run the 16-bit program as an normal process inside of a hidden
|
||||
* console application, and then run that hidden console as a
|
||||
* detached process.
|
||||
*/
|
||||
|
||||
startInfo.wShowWindow = SW_HIDE;
|
||||
startInfo.dwFlags |= STARTF_USESHOWWINDOW;
|
||||
createFlags = CREATE_NEW_CONSOLE;
|
||||
TclDStringAppendLiteral(&cmdLine, "cmd.exe /c");
|
||||
} else {
|
||||
createFlags = DETACHED_PROCESS;
|
||||
}
|
||||
startInfo.wShowWindow = SW_HIDE;
|
||||
startInfo.dwFlags |= STARTF_USESHOWWINDOW;
|
||||
createFlags = CREATE_NEW_CONSOLE;
|
||||
TclDStringAppendLiteral(&cmdLine, "cmd.exe /c");
|
||||
} else {
|
||||
if (HasConsole()) {
|
||||
createFlags = 0;
|
||||
} else {
|
||||
createFlags = DETACHED_PROCESS;
|
||||
}
|
||||
|
||||
if (applType == APPL_DOS) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"DOS application process not supported on this platform",
|
||||
-1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "EXEC", "DOS_APP",
|
||||
NULL);
|
||||
goto end;
|
||||
}
|
||||
createFlags = DETACHED_PROCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user