Index: TODO =================================================================== diff -u -r596677fb3ed1e15dc62a04789781347fb3dbc369 -r5039877970c5ab19bc80586e0d49bfd715873e98 --- TODO (.../TODO) (revision 596677fb3ed1e15dc62a04789781347fb3dbc369) +++ TODO (.../TODO) (revision 5039877970c5ab19bc80586e0d49bfd715873e98) @@ -2443,6 +2443,11 @@ (updated regression test, docs, ...) +- Fixed cases of -flag=$value for type switch outside the context of + "nsf::procs -ad" +- extended regression test + + TODO: - fix misleading error message: @@ -2454,7 +2459,6 @@ - serializer: check, why catch is needed for object-level alias (search for ns_cache_flush) -- check cases of -flag=$value outside the context of nsf::procs - document value added replacements of Tcl functions Index: generic/nsf.c =================================================================== diff -u -re3a84e351aaf79c02a63cc0741dde7b9bd550849 -r5039877970c5ab19bc80586e0d49bfd715873e98 --- generic/nsf.c (.../nsf.c) (revision e3a84e351aaf79c02a63cc0741dde7b9bd550849) +++ generic/nsf.c (.../nsf.c) (revision 5039877970c5ab19bc80586e0d49bfd715873e98) @@ -12841,7 +12841,8 @@ } } } else { - const char *valueString = ObjStr(objPtr); + CONST char *valueString = ObjStr(objPtr); + if (pPtr->flags & NSF_ARG_ALLOW_EMPTY && *valueString == '\0') { result = ConvertToString(interp, objPtr, pPtr, clientData, outObjPtr); } else { @@ -12870,10 +12871,15 @@ if (pcPtr->objv[i]) { /* we got an actual value, which was already checked by objv parser */ - /*fprintf(stderr, "setting passed value for %s to '%s'\n", pPtr->name, ObjStr(pcPtr->objv[i]));*/ - if (pPtr->converter == ConvertToSwitch) { + + /*fprintf(stderr, "ArgumentDefaults setting passed value for %s to '%s'\n", + pPtr->name, ObjStr(pcPtr->objv[i]));*/ + + if ((pcPtr->flags[i] & NSF_PC_MUST_INVERT) /*converter == ConvertToSwitch*/) { int bool; Tcl_GetBooleanFromObj(interp, pPtr->defaultValue, &bool); + /*fprintf(stderr, "+++ ArgumentDefaults inverts value for %s %.6x to %d\n", + pPtr->name, pcPtr->flags[i], !bool);*/ pcPtr->objv[i] = Tcl_NewBooleanObj(!bool); /* * incr refcount, otherwise the Tcl_Obj might be shared @@ -13090,6 +13096,7 @@ /*fprintf(stderr, "... flag '%s' o=%d p=%d, objc=%d nrArgs %d\n", argument, o, p, objc, nppPtr->nrArgs);*/ + if (nppPtr->flags & NSF_ARG_REQUIRED) nrReq++; else nrOpt++; /* @@ -13105,6 +13112,11 @@ INCR_REF_COUNT(valueObj); pcPtr->flags[j] |= NSF_PC_MUST_DECR; } else { + if (nppPtr->converter == ConvertToSwitch) { + /*fprintf(stderr,"set MUST_INVERT for '%s' flags %.6x\n", + nppPtr->name, nppPtr->flags);*/ + pcPtr->flags[j] |= NSF_PC_MUST_INVERT; + } valueObj = NsfGlobalObjs[NSF_ONE]; } } else { @@ -13137,6 +13149,7 @@ &pcPtr->flags[j], &pcPtr->clientData[j], &pcPtr->objv[j]) != TCL_OK) { return TCL_ERROR; } + /* * Provide warnings for double-settings. */ Index: generic/nsfInt.h =================================================================== diff -u -rab7eced3e5db60b75f0ca9a832a98837d26815dd -r5039877970c5ab19bc80586e0d49bfd715873e98 --- generic/nsfInt.h (.../nsfInt.h) (revision ab7eced3e5db60b75f0ca9a832a98837d26815dd) +++ generic/nsfInt.h (.../nsfInt.h) (revision 5039877970c5ab19bc80586e0d49bfd715873e98) @@ -424,6 +424,7 @@ /* flags for ParseContext */ #define NSF_PC_MUST_DECR 0x0001 #define NSF_PC_IS_DEFAULT 0x0002 +#define NSF_PC_MUST_INVERT 0x0010 #define NSF_PC_STATUS_MUST_DECR 0x0001 #define NSF_PC_STATUS_FREE_OBJV 0x0002 Index: tests/parameters.test =================================================================== diff -u -re3a84e351aaf79c02a63cc0741dde7b9bd550849 -r5039877970c5ab19bc80586e0d49bfd715873e98 --- tests/parameters.test (.../parameters.test) (revision e3a84e351aaf79c02a63cc0741dde7b9bd550849) +++ tests/parameters.test (.../parameters.test) (revision 5039877970c5ab19bc80586e0d49bfd715873e98) @@ -1441,7 +1441,7 @@ # test inner namespace and handling of switches # nsf::proc ::nsf::mix {-per-object:switch -x:boolean} { - return [namespace current]-${per-object}-[info exists x] + return [namespace current]-${per-object}-[expr {[info exists x] ? $x : "NULL"}] } # @@ -1469,8 +1469,12 @@ } Test parameter count 1 - ? {::nsf::mix} "::nsf-0-0" - ? {::nsf::mix -per-object} "::nsf-1-0" + ? {::nsf::mix} "::nsf-0-NULL" + ? {::nsf::mix -per-object} "::nsf-1-NULL" + ? {::nsf::mix -x true} "::nsf-0-true" + ? {::nsf::mix -x false} "::nsf-0-false" + ? {::nsf::mix -per-object=1} "::nsf-1-NULL" + ? {::nsf::mix -per-object=0} "::nsf-0-NULL" ? {ad_returnredirect /url} "::-allow_complete_url_p html_p message target_url x-0-0" ? {ad_returnredirect -html /url} "::-allow_complete_url_p html_p message target_url x-1-0" ? {ad_returnredirect -html=0 /url} "::-allow_complete_url_p html_p message target_url x-0-0"