aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 12:02:01 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:43 +1000
commitb9835f11e31b7e021da6b0831eac659425735ba2 (patch)
tree763c7a5b169f7eac4a377a64e90dce180129d96b /jim.c
parent2538c043ffc502b9814e98a01043617340ef1d80 (diff)
downloadjimtcl-b9835f11e31b7e021da6b0831eac659425735ba2.zip
jimtcl-b9835f11e31b7e021da6b0831eac659425735ba2.tar.gz
jimtcl-b9835f11e31b7e021da6b0831eac659425735ba2.tar.bz2
New features
Add unset -nocomplain and tests Implement lrepeat
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c68
1 files changed, 57 insertions, 11 deletions
diff --git a/jim.c b/jim.c
index e4c3a91..fc7e8ab 100644
--- a/jim.c
+++ b/jim.c
@@ -3536,10 +3536,12 @@ int Jim_UnsetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags)
if (err == JIM_DICT_SUGAR)
if (JimDictSugarSet(interp, nameObjPtr, NULL) == JIM_OK)
return JIM_OK;
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't unset \"", nameObjPtr->bytes,
- "\": no such variable", NULL);
+ if (flags & JIM_ERRMSG) {
+ Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings(interp, Jim_GetResult(interp),
+ "can't unset \"", nameObjPtr->bytes,
+ "\": no such variable", NULL);
+ }
return JIM_ERR; /* var not found */
}
varPtr = nameObjPtr->internalRep.varValue.varPtr;
@@ -9319,19 +9321,34 @@ static int Jim_SetCoreCommand(Jim_Interp *interp, int argc,
return JIM_OK;
}
-/* [unset] */
+/* [unset]
+ *
+ * unset ?-nocomplain? ?--? ?varName ...?
+ */
static int Jim_UnsetCoreCommand(Jim_Interp *interp, int argc,
Jim_Obj *const *argv)
{
- int i;
+ int i = 1;
+ int complain = 1;
- if (argc < 2) {
- Jim_WrongNumArgs(interp, 1, argv, "varName ?varName ...?");
- return JIM_ERR;
+ while (i < argc) {
+ if (Jim_CompareStringImmediate(interp, argv[i], "--")) {
+ i++;
+ break;
+ }
+ if (Jim_CompareStringImmediate(interp, argv[i], "-nocomplain")) {
+ complain = 0;
+ i++;
+ continue;
+ }
+ break;
}
- for (i = 1; i < argc; i++) {
- if (Jim_UnsetVariable(interp, argv[i], JIM_ERRMSG) != JIM_OK)
+
+ while (i < argc) {
+ if (Jim_UnsetVariable(interp, argv[i], complain ? JIM_ERRMSG : JIM_NONE) != JIM_OK && complain) {
return JIM_ERR;
+ }
+ i++;
}
return JIM_OK;
}
@@ -11807,6 +11824,33 @@ static int Jim_LrangeCoreCommand(Jim_Interp *interp, int argc,
return JIM_OK;
}
+/* [lrepeat] */
+static int Jim_LrepeatCoreCommand(Jim_Interp *interp, int argc,
+ Jim_Obj *const *argv)
+{
+ Jim_Obj *objPtr;
+ long count;
+
+ if (argc < 3 || Jim_GetLong(interp, argv[1], &count) != JIM_OK || count <= 0) {
+ Jim_WrongNumArgs(interp, 1, argv, "positiveCount value ?value ...?");
+ return JIM_ERR;
+ }
+
+ argc -= 2;
+ argv += 2;
+
+ objPtr = Jim_NewListObj(interp, argv, argc);
+ while (--count) {
+ int i;
+ for (i = 0; i < argc; i++) {
+ ListAppendElement(objPtr, argv[i]);
+ }
+ }
+
+ Jim_SetResult(interp, objPtr);
+ return JIM_OK;
+}
+
/* [env] */
static int Jim_EnvCoreCommand(Jim_Interp *interp, int argc,
Jim_Obj *const *argv)
@@ -12034,6 +12078,7 @@ static const struct {
{"scan", Jim_ScanCoreCommand},
{"error", Jim_ErrorCoreCommand},
{"lrange", Jim_LrangeCoreCommand},
+ {"lrepeat", Jim_LrepeatCoreCommand},
{"env", Jim_EnvCoreCommand},
{"source", Jim_SourceCoreCommand},
{"lreverse", Jim_LreverseCoreCommand},
@@ -12123,6 +12168,7 @@ int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
int i, count = 0;
*indexPtr = -1;
+
for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; entryPtr++, i++) {
if (Jim_CompareStringImmediate(interp, objPtr, *entryPtr)) {
*indexPtr = i;