rem: Ns_Sema *semaPtr;
add: Ns_Sema *semaPtr _nsmayalias;
context: NsTclSemaObjCmd(ClientData data, Tcl_Interp *interp, int objc,		Tcl_Obj **objv){    Ns_Sema *semaPtr;    int      cnt;    static CONST char *opts[] = {	"create", "destroy", "release", "wait", NULL    };    enum {	SCreateIdx, SDestroyIdx, SReleaseIdx, SWaitIdx    } opt;    if (!GetArgs(interp, objc, objv, opts, 's', SCreateIdx,		  (int *) &opt, (void **) &semaPtr)) {	return TCL_ERROR;    }    switch (opt) {    case SCreateIdx:        if (objc < 3) {            cnt = 0;        } else if (Tcl_GetIntFromObj(interp, objv[2], &cnt) != TCL_OK) {            return TCL_ERROR;        }	Ns_SemaInit(semaPtr, cnt);	break;    case SReleaseIdx:        if (objc < 4) {            cnt = 1;        } else if (Tcl_GetIntFromObj(interp, objv[3], &cnt) != TCL_OK) {            return TCL_ERROR;        }	Ns_SemaPost(semaPtr, cnt);	break;    case SWaitIdx:	Ns_SemaWait(semaPtr);	break;    case SDestroyIdx:	Ns_SemaDestroy(semaPtr);        ns_free(semaPtr);	break;    }    return TCL_OK;}