in src/generic/paramlist.c [375:483]
int paramGet(ParamList * paramList,
Tcl_Interp * interp,
int objc, Tcl_Obj * CONST objv[], int hasPrivate)
{
char *arg = NULL;
int opt = 0;
/* --------------------------------------------------------------------------
* sanity
* ----------------------------------------------------------------------- */
WebAssertData(interp, paramList, "paramList/paramGet", TCL_ERROR);
/* if there are no args -> continue with private parsing */
if (objc < 2) {
if (hasPrivate)
return TCL_CONTINUE;
else {
WebAssertObjc(1, 1, "args ...");
}
}
/* see if there is a subcommand */
arg = Tcl_GetString(objv[1]);
if (arg[0] == '-') {
if (Tcl_GetIndexFromObj(interp, objv[1],
paramsubcmd, "subcommand", 0,
&opt) == TCL_ERROR) {
if (hasPrivate) {
/* we ignore the error here cause we might have private commands */
Tcl_ResetResult(interp);
return TCL_CONTINUE;
}
else {
return TCL_ERROR;
}
}
/* it's one of our's */
switch (opt) {
case PARAM_COUNT:
WebAssertObjc(objc != 3, 2, "key");
return paramListCountValue(interp, paramList, objv[2]);
case PARAM_UNSET:
WebAssertObjc(objc > 3, 2, "?key?");
if (objc == 3)
return paramListDel(paramList, Tcl_GetString(objv[2]));
else
emptyParamList(paramList);
return TCL_OK;
case PARAM_SET:
WebAssertObjc(objc < 3, 2, "key ?value ...?");
if (objc != 3) {
int i = 3;
paramListDel(paramList, Tcl_GetString(objv[2]));
while (i < objc)
paramListAdd(paramList, Tcl_GetString(objv[2]),
objv[i++]);
}
/* return value, just like tcl */
return paramListGetValueToResult(interp, paramList, objv[2],
NULL);
case PARAM_LAPPEND:{
int i = 3;
WebAssertObjc(objc < 4, 2, "key value ?value ...?");
/* we append stuff */
while (i < objc)
paramListAdd(paramList, Tcl_GetString(objv[2]),
objv[i++]);
/* return list, just like tcl */
return paramListGetValueToResult(interp, paramList, objv[2],
NULL);
}
case PARAM_NAMES:{
Tcl_Obj *obj = paramListNamesAll(paramList);
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
Tcl_DecrRefCount(obj);
return TCL_ERROR;
}
if (obj) {
Tcl_SetObjResult(interp, obj);
Tcl_DecrRefCount(obj);
}
else {
Tcl_ResetResult(interp);
}
return TCL_OK;
}
default:
return TCL_ERROR; /* should never be reached. */
}
}
else {
/* no subcommand -> return value */
WebAssertObjc(objc > 3, 1, "key ?default?");
if (objc == 3) {
return paramListGetValueToResult(interp, paramList, objv[1],
objv[2]);
} else {
return paramListGetValueToResult(interp, paramList, objv[1],
NULL);
}
}
/* we never get here */
/* return TCL_ERROR; */
}