summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2017-06-23 08:11:42 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2017-06-23 08:11:42 (GMT)
commit902b9607982940a968a0b7ee1b23e5de9a5b0fa3 (patch)
tree953fc45a5d3314b95abbbaa12ed0a5b6b65e852c /generic
parentab4e3e7729712e4c16038e99e657401788e364b5 (diff)
parentd63de1ca506474e5d7f80d7351545d75d46f1d25 (diff)
downloadtcl-902b9607982940a968a0b7ee1b23e5de9a5b0fa3.zip
tcl-902b9607982940a968a0b7ee1b23e5de9a5b0fa3.tar.gz
tcl-902b9607982940a968a0b7ee1b23e5de9a5b0fa3.tar.bz2
TIP #472 implementation: Add Support for 0d Radix Prefix to Integer Literals
Diffstat (limited to 'generic')
-rw-r--r--generic/tclLink.c4
-rw-r--r--generic/tclStrToD.c17
-rw-r--r--generic/tclStringObj.c4
3 files changed, 22 insertions, 3 deletions
diff --git a/generic/tclLink.c b/generic/tclLink.c
index a39dfcd..7366acc 100644
--- a/generic/tclLink.c
+++ b/generic/tclLink.c
@@ -692,7 +692,7 @@ SetInvalidRealFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr) {
/*
* This function checks for integer representations, which are valid
* when linking with C variables, but which are invalid in other
- * contexts in Tcl. Handled are "+", "-", "", "0x", "0b" and "0o"
+ * contexts in Tcl. Handled are "+", "-", "", "0x", "0b", "0d" and "0o"
* (upperand lowercase). See bug [39f6304c2e].
*/
int
@@ -701,7 +701,7 @@ GetInvalidIntFromObj(Tcl_Obj *objPtr, int *intPtr)
const char *str = TclGetString(objPtr);
if ((objPtr->length == 0) ||
- ((objPtr->length == 2) && (str[0] == '0') && strchr("xXbBoO", str[1]))) {
+ ((objPtr->length == 2) && (str[0] == '0') && strchr("xXbBoOdD", str[1]))) {
*intPtr = 0;
return TCL_OK;
} else if ((objPtr->length == 1) && strchr("+-", str[0])) {
diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c
index 57c24ac..a5d1f30 100644
--- a/generic/tclStrToD.c
+++ b/generic/tclStrToD.c
@@ -482,7 +482,7 @@ TclParseNumber(
{
enum State {
INITIAL, SIGNUM, ZERO, ZERO_X,
- ZERO_O, ZERO_B, BINARY,
+ ZERO_O, ZERO_B, ZERO_D, BINARY,
HEXADECIMAL, OCTAL, BAD_OCTAL, DECIMAL,
LEADING_RADIX_POINT, FRACTION,
EXPONENT_START, EXPONENT_SIGNUM, EXPONENT,
@@ -664,6 +664,10 @@ TclParseNumber(
state = ZERO_O;
break;
}
+ if (c == 'd' || c == 'D') {
+ state = ZERO_D;
+ break;
+ }
#ifdef TCL_NO_DEPRECATED
goto decimal;
#endif
@@ -880,6 +884,16 @@ TclParseNumber(
state = BINARY;
break;
+ case ZERO_D:
+ if (c == '0') {
+ numTrailZeros++;
+ } else if ( ! isdigit(UCHAR(c))) {
+ goto endgame;
+ }
+ state = DECIMAL;
+ flags |= TCL_PARSE_INTEGER_ONLY;
+ /* FALLTHROUGH */
+
case DECIMAL:
/*
* Scanned an optional + or - followed by a string of decimal
@@ -1176,6 +1190,7 @@ TclParseNumber(
case ZERO_X:
case ZERO_O:
case ZERO_B:
+ case ZERO_D:
case LEADING_RADIX_POINT:
case EXPONENT_START:
case EXPONENT_SIGNUM:
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index 41dad65..37da311 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -2039,6 +2039,10 @@ Tcl_AppendFormatToObj(
Tcl_AppendToObj(segment, "0b", 2);
segmentLimit -= 2;
break;
+ case 'd':
+ Tcl_AppendToObj(segment, "0d", 2);
+ segmentLimit -= 2;
+ break;
}
}