summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2024-06-19 10:32:39 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2024-06-19 10:32:39 (GMT)
commitc7e60575dde5c9b7ca92fb83bbf61319b17e506c (patch)
tree5e90c99c08a69c6b4b862eaa3b455014b4183147 /generic
parentba8a9c512f733da5f0db3055c0a24590c542b9ea (diff)
parent96dd069f9fc0b4e987db3a0ee7dde49edd93d3af (diff)
downloadtcl-c7e60575dde5c9b7ca92fb83bbf61319b17e506c.zip
tcl-c7e60575dde5c9b7ca92fb83bbf61319b17e506c.tar.gz
tcl-c7e60575dde5c9b7ca92fb83bbf61319b17e506c.tar.bz2
TIP #697: 32-bit truncation in format and scan (let's gain some time)
Diffstat (limited to 'generic')
-rwxr-xr-xgeneric/tclArithSeries.c2
-rw-r--r--generic/tclEnsemble.c4
-rw-r--r--generic/tclScan.c13
-rw-r--r--generic/tclStringObj.c34
4 files changed, 19 insertions, 34 deletions
diff --git a/generic/tclArithSeries.c b/generic/tclArithSeries.c
index 7618415..7fe0f3a 100755
--- a/generic/tclArithSeries.c
+++ b/generic/tclArithSeries.c
@@ -512,7 +512,7 @@ assignNumber(
void *clientData;
int tcl_number_type;
- if (Tcl_GetNumberFromObj(interp, numberObj, &clientData,
+ if (Tcl_GetNumberFromObj(interp, numberObj, &clientData,
&tcl_number_type) != TCL_OK) {
return TCL_ERROR;
}
diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c
index a9bcf0c..bdf486a 100644
--- a/generic/tclEnsemble.c
+++ b/generic/tclEnsemble.c
@@ -277,7 +277,7 @@ TclNamespaceEnsembleCmd(
*
* Note:
* Can't use SetEnsembleConfigOptions() here. Different (but overlapping)
- * options are supported.
+ * options are supported.
*
*----------------------------------------------------------------------
*/
@@ -886,7 +886,7 @@ Tcl_CreateEnsemble(
*/
static inline EnsembleConfig *
GetEnsembleFromCommand(
- Tcl_Interp *interp, /* Where to report an error. May be NULL. */
+ Tcl_Interp *interp, /* Where to report an error. May be NULL. */
Tcl_Command token) /* What to check for ensemble-ness. */
{
Command *cmdPtr = (Command *) token;
diff --git a/generic/tclScan.c b/generic/tclScan.c
index c143efa..48d2bcc 100644
--- a/generic/tclScan.c
+++ b/generic/tclScan.c
@@ -385,6 +385,10 @@ ValidateFormat(
}
format += TclUtfToUniChar(format, &ch);
break;
+ case 'L':
+ flags |= SCAN_BIG;
+ format += TclUtfToUniChar(format, &ch);
+ break;
case 'l':
if (*format == 'l') {
flags |= SCAN_BIG;
@@ -393,7 +397,6 @@ ValidateFormat(
break;
}
/* FALLTHRU */
- case 'L':
case 'j':
case 'q':
flags |= SCAN_LONGER;
@@ -601,7 +604,7 @@ Tcl_ScanObjCmd(
const char *format;
int numVars, nconversions, totalVars = -1;
int objIndex, offset, i, result, code;
- long value;
+ int value;
const char *string, *end, *baseString;
char op = 0;
int underflow = 0;
@@ -994,11 +997,11 @@ Tcl_ScanObjCmd(
}
}
} else {
- if (TclGetLongFromObj(NULL, objPtr, &value) != TCL_OK) {
+ if (TclGetIntFromObj(NULL, objPtr, &value) != TCL_OK) {
if (TclGetString(objPtr)[0] == '-') {
- value = LONG_MIN;
+ value = INT_MIN;
} else {
- value = LONG_MAX;
+ value = INT_MAX;
}
}
if ((flags & SCAN_UNSIGNED) && (value < 0)) {
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index 8b6b719..75b4fdd 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -1875,9 +1875,7 @@ Tcl_AppendFormatToObj(
int gotMinus = 0, gotHash = 0, gotZero = 0, gotSpace = 0, gotPlus = 0;
int gotPrecision, sawFlag, useShort = 0, useBig = 0;
Tcl_WideInt width, precision;
-#ifndef TCL_WIDE_INT_IS_LONG
int useWide = 0;
-#endif
int newXpg, allocSegment = 0;
Tcl_Size numChars, segmentLimit, segmentNumBytes;
Tcl_Obj *segment;
@@ -2082,18 +2080,14 @@ Tcl_AppendFormatToObj(
useBig = 1;
format += step;
step = TclUtfToUniChar(format, &ch);
-#ifndef TCL_WIDE_INT_IS_LONG
} else {
useWide = 1;
-#endif
}
} else if (ch == 'I') {
if ((format[1] == '6') && (format[2] == '4')) {
format += (step + 2);
step = TclUtfToUniChar(format, &ch);
-#ifndef TCL_WIDE_INT_IS_LONG
useWide = 1;
-#endif
} else if ((format[1] == '3') && (format[2] == '2')) {
format += (step + 2);
step = TclUtfToUniChar(format, &ch);
@@ -2104,17 +2098,13 @@ Tcl_AppendFormatToObj(
} else if ((ch == 'q') || (ch == 'j')) {
format += step;
step = TclUtfToUniChar(format, &ch);
-#ifndef TCL_WIDE_INT_IS_LONG
useWide = 1;
-#endif
} else if ((ch == 't') || (ch == 'z')) {
format += step;
step = TclUtfToUniChar(format, &ch);
-#ifndef TCL_WIDE_INT_IS_LONG
if (sizeof(void *) > sizeof(int)) {
useWide = 1;
}
-#endif
} else if (ch == 'L') {
format += step;
step = TclUtfToUniChar(format, &ch);
@@ -2180,17 +2170,15 @@ Tcl_AppendFormatToObj(
case 'b': {
short s = 0; /* Silence compiler warning; only defined and
* used when useShort is true. */
- long l;
+ int l;
Tcl_WideInt w;
mp_int big;
int isNegative = 0;
Tcl_Size toAppend;
-#ifndef TCL_WIDE_INT_IS_LONG
if ((ch == 'p') && (sizeof(void *) > sizeof(int))) {
useWide = 1;
}
-#endif
if (useBig) {
int cmpResult;
if (Tcl_GetBignumFromObj(interp, segment, &big) != TCL_OK) {
@@ -2211,7 +2199,6 @@ Tcl_AppendFormatToObj(
ch = 'd';
}
}
-#ifndef TCL_WIDE_INT_IS_LONG
} else if (useWide) {
if (TclGetWideBitsFromObj(interp, segment, &w) != TCL_OK) {
goto error;
@@ -2220,12 +2207,11 @@ Tcl_AppendFormatToObj(
if (w == (Tcl_WideInt) 0) {
gotHash = 0;
}
-#endif
- } else if (TclGetLongFromObj(NULL, segment, &l) != TCL_OK) {
+ } else if (TclGetIntFromObj(NULL, segment, &l) != TCL_OK) {
if (TclGetWideBitsFromObj(interp, segment, &w) != TCL_OK) {
goto error;
} else {
- l = (long) w;
+ l = (int) w;
}
if (useShort) {
s = (short) l;
@@ -2234,8 +2220,8 @@ Tcl_AppendFormatToObj(
gotHash = 0;
}
} else {
- isNegative = (l < (long) 0);
- if (l == (long) 0) {
+ isNegative = (l < (int) 0);
+ if (l == (int) 0) {
gotHash = 0;
}
}
@@ -2246,8 +2232,8 @@ Tcl_AppendFormatToObj(
gotHash = 0;
}
} else {
- isNegative = (l < (long) 0);
- if (l == (long) 0) {
+ isNegative = (l < (int) 0);
+ if (l == (int) 0) {
gotHash = 0;
}
}
@@ -2294,10 +2280,8 @@ Tcl_AppendFormatToObj(
if (useShort) {
TclNewIntObj(pure, s);
-#ifndef TCL_WIDE_INT_IS_LONG
} else if (useWide) {
TclNewIntObj(pure, w);
-#endif
} else if (useBig) {
pure = Tcl_NewBignumObj(&big);
} else {
@@ -2382,7 +2366,6 @@ Tcl_AppendFormatToObj(
numDigits++;
us /= base;
}
-#ifndef TCL_WIDE_INT_IS_LONG
} else if (useWide) {
Tcl_WideUInt uw = (Tcl_WideUInt) w;
@@ -2391,7 +2374,6 @@ Tcl_AppendFormatToObj(
numDigits++;
uw /= base;
}
-#endif
} else if (useBig && !mp_iszero(&big)) {
int leftover = (big.used * MP_DIGIT_BIT) % numBits;
mp_digit mask = (~(mp_digit)0) << (MP_DIGIT_BIT-leftover);
@@ -2408,7 +2390,7 @@ Tcl_AppendFormatToObj(
goto errorMsg;
}
} else if (!useBig) {
- unsigned long ul = (unsigned long) l;
+ unsigned ul = (unsigned) l;
bits = (Tcl_WideUInt) ul;
while (ul) {