diff options
author | Steve Bennett <steveb@workware.net.au> | 2020-09-07 11:21:38 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2020-09-23 10:39:25 +1000 |
commit | e935c91588afcace84e699585aa723d5c40286c9 (patch) | |
tree | 4dab8e431aaecf0ab104a8dd6192342d37ea65c8 /jim.c | |
parent | 18e79de7ea93b1a99fbd0ca96cb837623bb699fa (diff) | |
download | jimtcl-e935c91588afcace84e699585aa723d5c40286c9.zip jimtcl-e935c91588afcace84e699585aa723d5c40286c9.tar.gz jimtcl-e935c91588afcace84e699585aa723d5c40286c9.tar.bz2 |
dict: add support for getwithdefault/getdef
TIP 342 (https://core.tcl-lang.org/tips/doc/trunk/tip/342.md)
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r-- | jim.c | 29 |
1 files changed, 26 insertions, 3 deletions
@@ -14595,18 +14595,19 @@ static int JimDictWith(Jim_Interp *interp, Jim_Obj *dictVarName, Jim_Obj *const static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *objPtr; + int rc; int types = JIM_DICTMATCH_KEYS; int option; static const char * const options[] = { "create", "get", "set", "unset", "exists", "keys", "size", "info", "merge", "with", "append", "lappend", "incr", "remove", "values", "for", - "replace", "update", NULL + "replace", "update", "getwithdefault", NULL }; enum { OPT_CREATE, OPT_GET, OPT_SET, OPT_UNSET, OPT_EXISTS, OPT_KEYS, OPT_SIZE, OPT_INFO, OPT_MERGE, OPT_WITH, OPT_APPEND, OPT_LAPPEND, OPT_INCR, OPT_REMOVE, OPT_VALUES, OPT_FOR, - OPT_REPLACE, OPT_UPDATE, + OPT_REPLACE, OPT_UPDATE, OPT_GETDEF, }; if (argc < 2) { @@ -14615,7 +14616,11 @@ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg } if (Jim_GetEnum(interp, argv[1], options, &option, "subcommand", JIM_ERRMSG) != JIM_OK) { - return Jim_CheckShowCommands(interp, argv[1], options); + /* Handle getdef as an alias for getwithdefault */ + if (Jim_CompareStringImmediate(interp, argv[1], "getdef") == 0) { + return Jim_CheckShowCommands(interp, argv[1], options); + } + option = OPT_GETDEF; } switch (option) { @@ -14631,6 +14636,24 @@ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg Jim_SetResult(interp, objPtr); return JIM_OK; + case OPT_GETDEF: + if (argc < 5) { + Jim_WrongNumArgs(interp, 2, argv, "dictionary ?key ...? key default"); + return JIM_ERR; + } + rc = Jim_DictKeysVector(interp, argv[2], argv + 3, argc - 4, &objPtr, JIM_ERRMSG); + if (rc == -1) { + /* Not a valid dictionary */ + return JIM_ERR; + } + if (rc == JIM_ERR) { + Jim_SetResult(interp, argv[argc - 1]); + } + else { + Jim_SetResult(interp, objPtr); + } + return JIM_OK; + case OPT_SET: if (argc < 5) { Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...? value"); |