Skip to content

Commit

Permalink
Merge 8.7 (2023-05-03)
Browse files Browse the repository at this point in the history
  • Loading branch information
jan.nijtmans committed Sep 25, 2023
2 parents 78ba8d7 + 7b68852 commit e935e2e
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 24 deletions.
6 changes: 5 additions & 1 deletion generic/tcl.h
Original file line number Diff line number Diff line change
Expand Up @@ -2180,7 +2180,11 @@ typedef struct Tcl_EncodingType {
#define TCL_ENCODING_CHAR_LIMIT 0x10
/* Internal use bits, do not define bits in this space. See above comment */
#define TCL_ENCODING_INTERNAL_USE_MASK 0xFF00
/* Reserve top byte for profile values (disjoint, not a mask) */
/*
* Reserve top byte for profile values (disjoint, not a mask). In case of
* changes, ensure ENCODING_PROFILE_* macros in tclInt.h are modified if
* necessary.
*/
#define TCL_ENCODING_PROFILE_STRICT TCL_ENCODING_STOPONERROR
#define TCL_ENCODING_PROFILE_TCL8 0x01000000
#define TCL_ENCODING_PROFILE_REPLACE 0x02000000
Expand Down
2 changes: 1 addition & 1 deletion generic/tclCmdAH.c
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ EncodingConvertfromObjCmd(
* Convert the string into a byte array in 'ds'.
*/
#if !defined(TCL_NO_DEPRECATED) && (TCL_MAJOR_VERSION < 9)
if (CHANNEL_PROFILE_GET(flags) != TCL_ENCODING_PROFILE_REPLACE
if (ENCODING_PROFILE_GET(flags) != TCL_ENCODING_PROFILE_REPLACE
&& !(flags & TCL_ENCODING_STOPONERROR)) {
/* Permits high bits to be non-0 in byte array (Tcl 8 style) */
bytesPtr = (char *) Tcl_GetByteArrayFromObj(data, &length);
Expand Down
7 changes: 3 additions & 4 deletions generic/tclEncoding.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
*/

#include "tclInt.h"
#include "tclIO.h"

typedef size_t (LengthProc)(const char *src);

Expand Down Expand Up @@ -200,11 +199,11 @@ static struct TclEncodingProfiles {
{"tcl8", TCL_ENCODING_PROFILE_TCL8},
};
#define PROFILE_STRICT(flags_) \
((CHANNEL_PROFILE_GET(flags_) == CHANNEL_PROFILE_STRICT) \
((ENCODING_PROFILE_GET(flags_) == (TCL_ENCODING_PROFILE_STRICT & ENCODING_PROFILE_MASK)) \
&& ((flags) && TCL_ENCODING_STOPONERROR))

#define PROFILE_REPLACE(flags_) \
(CHANNEL_PROFILE_GET(flags_) == TCL_ENCODING_PROFILE_REPLACE)
(ENCODING_PROFILE_GET(flags_) == TCL_ENCODING_PROFILE_REPLACE)

#define UNICODE_REPLACE_CHAR ((Tcl_UniChar)0xFFFD)
#define SURROGATE(c_) (((c_) & ~0x7FF) == 0xD800)
Expand Down Expand Up @@ -2526,7 +2525,7 @@ UtfToUtfProc(
flags |= PTR2INT(clientData);
dstEnd = dst + dstLen - ((flags & ENCODING_UTF) ? TCL_UTF_MAX : 6);

profile = CHANNEL_PROFILE_GET(flags);
profile = ENCODING_PROFILE_GET(flags);
for (numChars = 0; src < srcEnd && numChars <= charLimit; numChars++) {

if ((src > srcClose) && (!Tcl_UtfCharComplete(src, srcEnd - src))) {
Expand Down
20 changes: 10 additions & 10 deletions generic/tclIO.c
Original file line number Diff line number Diff line change
Expand Up @@ -1702,11 +1702,11 @@ Tcl_CreateChannel(
}
statePtr->inputEncodingState = NULL;
statePtr->inputEncodingFlags = TCL_ENCODING_START;
CHANNEL_PROFILE_SET(statePtr->inputEncodingFlags,
ENCODING_PROFILE_SET(statePtr->inputEncodingFlags,
TCL_ENCODING_PROFILE_TCL8);
statePtr->outputEncodingState = NULL;
statePtr->outputEncodingFlags = TCL_ENCODING_START;
CHANNEL_PROFILE_SET(statePtr->outputEncodingFlags,
ENCODING_PROFILE_SET(statePtr->outputEncodingFlags,
TCL_ENCODING_PROFILE_TCL8);

/*
Expand Down Expand Up @@ -8067,7 +8067,7 @@ Tcl_GetChannelOption(
Tcl_DStringAppendElement(dsPtr, "-profile");
}
/* Note currently input and output profiles are same */
profile = CHANNEL_PROFILE_GET(statePtr->inputEncodingFlags);
profile = ENCODING_PROFILE_GET(statePtr->inputEncodingFlags);
profileName = TclEncodingProfileIdToName(interp, profile);
if (profileName == NULL) {
return TCL_ERROR;
Expand Down Expand Up @@ -8273,12 +8273,12 @@ Tcl_SetChannelOption(
Tcl_FreeEncoding(statePtr->encoding);
statePtr->encoding = encoding;
statePtr->inputEncodingState = NULL;
profile = CHANNEL_PROFILE_GET(statePtr->inputEncodingFlags);
profile = ENCODING_PROFILE_GET(statePtr->inputEncodingFlags);
statePtr->inputEncodingFlags = TCL_ENCODING_START;
CHANNEL_PROFILE_SET(statePtr->inputEncodingFlags, profile);
ENCODING_PROFILE_SET(statePtr->inputEncodingFlags, profile);
statePtr->outputEncodingState = NULL;
statePtr->outputEncodingFlags = TCL_ENCODING_START;
CHANNEL_PROFILE_SET(statePtr->outputEncodingFlags, profile); /* Same as input */
ENCODING_PROFILE_SET(statePtr->outputEncodingFlags, profile); /* Same as input */
ResetFlag(statePtr, CHANNEL_NEED_MORE_DATA|CHANNEL_ENCODING_ERROR);
UpdateInterest(chanPtr);
return TCL_OK;
Expand Down Expand Up @@ -8342,8 +8342,8 @@ Tcl_SetChannelOption(
if (TclEncodingProfileNameToId(interp, newValue, &profile) != TCL_OK) {
return TCL_ERROR;
}
CHANNEL_PROFILE_SET(statePtr->inputEncodingFlags, profile);
CHANNEL_PROFILE_SET(statePtr->outputEncodingFlags, profile);
ENCODING_PROFILE_SET(statePtr->inputEncodingFlags, profile);
ENCODING_PROFILE_SET(statePtr->outputEncodingFlags, profile);
ResetFlag(statePtr, CHANNEL_NEED_MORE_DATA|CHANNEL_ENCODING_ERROR);
return TCL_OK;
} else if (HaveOpt(1, "-translation")) {
Expand Down Expand Up @@ -9467,10 +9467,10 @@ TclCopyChannel(
*/

#define PROFILE_STRICT(flags_) \
((CHANNEL_PROFILE_GET(flags_) == CHANNEL_PROFILE_STRICT) \
((ENCODING_PROFILE_GET(flags_) == (TCL_ENCODING_PROFILE_STRICT & ENCODING_PROFILE_MASK)) \
&& ((flags_) && TCL_ENCODING_STOPONERROR))
#define PROFILE_REPLACE(flags_) \
(CHANNEL_PROFILE_GET(flags_) == TCL_ENCODING_PROFILE_REPLACE)
(ENCODING_PROFILE_GET(flags_) == TCL_ENCODING_PROFILE_REPLACE)

moveBytes = inStatePtr->inEofChar == '\0' /* No eofChar to stop input */
&& inStatePtr->inputTranslation == TCL_TRANSLATE_LF
Expand Down
8 changes: 0 additions & 8 deletions generic/tclIO.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,14 +286,6 @@ typedef struct ChannelState {
#define CHANNEL_CLOSEDWRITE (1<<21) /* Channel write side has been closed.
* No further Tcl-level write IO on
* the channel is allowed. */
#define CHANNEL_PROFILE_MASK 0xFF000000
#define CHANNEL_PROFILE_STRICT (TCL_ENCODING_PROFILE_STRICT & CHANNEL_PROFILE_MASK)
#define CHANNEL_PROFILE_GET(flags_) ((flags_) & CHANNEL_PROFILE_MASK)
#define CHANNEL_PROFILE_SET(flags_, profile_) \
do { \
(flags_) &= ~CHANNEL_PROFILE_MASK; \
(flags_) |= profile_; \
} while (0)

/*
* The length of time to wait between synthetic timer events. Must be zero or
Expand Down
15 changes: 15 additions & 0 deletions generic/tclInt.h
Original file line number Diff line number Diff line change
Expand Up @@ -2859,6 +2859,21 @@ typedef struct ProcessGlobalValue {
#define TCL_PARSE_NO_UNDERSCORE 128
/* Reject underscore digit separator */

/*
*----------------------------------------------------------------------
* Internal convenience macros for manipulating encoding flags. See
* TCL_ENCODING_PROFILE_* in tcl.h
*----------------------------------------------------------------------
*/

#define ENCODING_PROFILE_MASK 0xFF000000
#define ENCODING_PROFILE_GET(flags_) ((flags_) & ENCODING_PROFILE_MASK)
#define ENCODING_PROFILE_SET(flags_, profile_) \
do { \
(flags_) &= ~ENCODING_PROFILE_MASK; \
(flags_) |= (profile_) & ENCODING_PROFILE_MASK; \
} while (0)

/*
*----------------------------------------------------------------
* Variables shared among Tcl modules but not used by the outside world.
Expand Down

0 comments on commit e935e2e

Please sign in to comment.