summaryrefslogtreecommitdiffstats
path: root/generic/tclCompCmdsSZ.c
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2014-01-13 08:06:43 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2014-01-13 08:06:43 (GMT)
commitaa2c40934df3fdefbb39338f7eef44e79c3c551e (patch)
treeb9160847863784dfe55e508ea2eab9da956df310 /generic/tclCompCmdsSZ.c
parentc3c6e803684022dcc788ddbfc4a59a6d0dfde102 (diff)
downloadtcl-aa2c40934df3fdefbb39338f7eef44e79c3c551e.zip
tcl-aa2c40934df3fdefbb39338f7eef44e79c3c551e.tar.gz
tcl-aa2c40934df3fdefbb39338f7eef44e79c3c551e.tar.bz2
extend [string is] to booleans
Diffstat (limited to 'generic/tclCompCmdsSZ.c')
-rw-r--r--generic/tclCompCmdsSZ.c51
1 files changed, 47 insertions, 4 deletions
diff --git a/generic/tclCompCmdsSZ.c b/generic/tclCompCmdsSZ.c
index 1436a20..91bb94c 100644
--- a/generic/tclCompCmdsSZ.c
+++ b/generic/tclCompCmdsSZ.c
@@ -514,14 +514,57 @@ TclCompileStringIsCmd(
case STR_IS_UPPER:
case STR_IS_WORD:
case STR_IS_XDIGIT:
- /* Not yet implemented */
- return TCL_ERROR;
+ return TclCompileBasicMin0ArgCmd(interp, parsePtr, cmdPtr, envPtr);
case STR_IS_BOOL:
case STR_IS_FALSE:
case STR_IS_TRUE:
- /* Not yet implemented */
- return TCL_ERROR;
+ CompileWord(envPtr, tokenPtr, interp, parsePtr->numWords-1);
+ OP( TRY_CVT_TO_BOOLEAN);
+ switch (t) {
+ int over, over2;
+
+ case STR_IS_BOOL:
+ if (allowEmpty) {
+ JUMP1( JUMP_TRUE, over);
+ PUSH( "");
+ OP( STR_EQ);
+ JUMP1( JUMP, over2);
+ FIXJUMP1(over);
+ OP( POP);
+ PUSH( "1");
+ FIXJUMP1(over2);
+ } else {
+ OP4( REVERSE, 2);
+ OP( POP);
+ }
+ return TCL_OK;
+ case STR_IS_TRUE:
+ JUMP1( JUMP_TRUE, over);
+ if (allowEmpty) {
+ PUSH( "");
+ OP( STR_EQ);
+ } else {
+ OP( POP);
+ PUSH( "0");
+ }
+ FIXJUMP1( over);
+ OP( LNOT);
+ OP( LNOT);
+ return TCL_OK;
+ case STR_IS_FALSE:
+ JUMP1( JUMP_TRUE, over);
+ if (allowEmpty) {
+ PUSH( "");
+ OP( STR_NEQ);
+ } else {
+ OP( POP);
+ PUSH( "1");
+ }
+ FIXJUMP1( over);
+ OP( LNOT);
+ return TCL_OK;
+ }
case STR_IS_DOUBLE: {
int satisfied, isEmpty;