int paramGet()

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; */

}