diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-01-26 23:26:13 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-01-26 23:26:13 (GMT) |
commit | 740cd597bdeb4e570412f8fa30a97e39bdf56e99 (patch) | |
tree | b43460f45b8ade62fc7bf65851efc1839e693600 /generic | |
parent | ebc5194e2d1e363c46561ea1303dfb409f58862f (diff) | |
download | tcl-740cd597bdeb4e570412f8fa30a97e39bdf56e99.zip tcl-740cd597bdeb4e570412f8fa30a97e39bdf56e99.tar.gz tcl-740cd597bdeb4e570412f8fa30a97e39bdf56e99.tar.bz2 |
alternative TIP 395 implementation:tip_395_with_alt_name
- more efficient, will not generate bignum
- uses "string is integer" in stead of "string is entier"
- original "string is integer" renamed to "string is int"
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclCmdMZ.c | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 1ef6fa8..38fb04a 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -1437,7 +1437,7 @@ StringIsCmd( static const char *const isClasses[] = { "alnum", "alpha", "ascii", "control", "boolean", "digit", "double", "false", - "graph", "integer", "list", "lower", + "graph", "int", "integer", "list", "lower", "print", "punct", "space", "true", "upper", "wideinteger", "wordchar", "xdigit", NULL @@ -1445,7 +1445,7 @@ StringIsCmd( enum isClasses { STR_IS_ALNUM, STR_IS_ALPHA, STR_IS_ASCII, STR_IS_CONTROL, STR_IS_BOOL, STR_IS_DIGIT, STR_IS_DOUBLE, STR_IS_FALSE, - STR_IS_GRAPH, STR_IS_INT, STR_IS_LIST, STR_IS_LOWER, + STR_IS_GRAPH, STR_IS_INT, STR_IS_INTEGER, STR_IS_LIST, STR_IS_LOWER, STR_IS_PRINT, STR_IS_PUNCT, STR_IS_SPACE, STR_IS_TRUE, STR_IS_UPPER, STR_IS_WIDE, STR_IS_WORD, STR_IS_XDIGIT }; @@ -1575,6 +1575,51 @@ StringIsCmd( break; } goto failedIntParse; + case STR_IS_INTEGER: + if ((objPtr->typePtr == &tclIntType) || +#ifndef NO_WIDE_TYPE + (objPtr->typePtr == &tclWideIntType) || +#endif + (objPtr->typePtr == &tclBignumType)) { + break; + } + string1 = TclGetStringFromObj(objPtr, &length1); + if (length1 == 0) { + if (strict) { + result = 0; + } + goto str_is_done; + } + end = string1 + length1; + if (TclParseNumber(NULL, objPtr, NULL, NULL, -1, + (const char **) &stop, TCL_PARSE_INTEGER_ONLY) == TCL_OK) { + if (stop == end) { + /* + * Entire string parses as an integer. + */ + + break; + } else { + /* + * Some prefix parsed as an integer, but not the whole string, + * so return failure index as the point where parsing stopped. + * Clear out the internal rep, since keeping it would leave + * *objPtr in an inconsistent state. + */ + + result = 0; + failat = stop - string1; + TclFreeIntRep(objPtr); + } + } else { + /* + * No prefix is a valid integer. Fail at beginning. + */ + + result = 0; + failat = 0; + } + break; case STR_IS_WIDE: if (TCL_OK == Tcl_GetWideIntFromObj(NULL, objPtr, &w)) { break; |