rem: Parse(NULL, &ds, argv[1]);
add: (*parserProc)(&ds, argv[1]);
context: NsTclAdpEvalCmd(ClientData dummy, Tcl_Interp *interp, int argc,		char **argv){    AdpData          *adPtr;    Frame             frame;    Ns_DString        ds;    int               code;    Tcl_HashEntry    *hPtr;    Ns_AdpParserProc *parserProc;    char	     *cmd;        if (argc < 2) {badargs:	Tcl_AppendResult(interp, "wrong # args: should be \"",	    argv[0], " ?-parser parser? page ?arg ...?\"", NULL);	return TCL_ERROR;    }    cmd = argv[0];    parserProc = defParserProc;    if (argc > 2 && STREQ(argv[1], "-parser")) {	if (argc < 4) {	    goto badargs;	}	hPtr = Tcl_FindHashEntry(&parsersTable, argv[2]);	if (hPtr == NULL) {	    Tcl_AppendResult(interp, "no such parser: ", argv[2], NULL);	    return TCL_ERROR;	}	parserProc = (Ns_AdpParserProc *) Tcl_GetHashValue(hPtr);	argv += 2;	argc -= 2;    }    /*     * Increment the inline eval level to ensure flushing is disabled,     * push a frame, execute the code, and then move any result to the     * interp from the output buffer.     */         Ns_DStringInit(&ds);    adPtr = NsAdpGetData();    ++adPtr->evalLevel;    PushFrame(&frame, NULL, argc-1, argv+1);    Parse(NULL, &ds, argv[1]);    code = NsAdpEval(interp, cmd, ds.string);    if (adPtr->output.length > frame.length) {	Tcl_SetResult(interp, adPtr->output.string + frame.length,		      TCL_VOLATILE);	Ns_DStringTrunc(&adPtr->output, frame.length);    }    PopFrame(&frame);    --adPtr->evalLevel;    Ns_DStringFree(&ds);    return code;}