diff --git a/generic/threadSvListCmd.c b/generic/threadSvListCmd.c index 3720b4b..d7b43e1 100644 --- a/generic/threadSvListCmd.c +++ b/generic/threadSvListCmd.c @@ -78,7 +78,7 @@ static Tcl_Mutex initMutex; static Tcl_Obj* SvLsetFlat(Tcl_Interp *interp, Tcl_Obj *listPtr, Tcl_Size indexCount, - Tcl_Obj **indexArray, Tcl_Obj *valuePtr); + Tcl_Obj **indexArray, Tcl_Obj *valuePtr); /* @@ -103,28 +103,28 @@ Sv_RegisterListCommands(void) static int initialized = 0; if (initialized == 0) { - Tcl_MutexLock(&initMutex); - if (initialized == 0) { - /* Create list with 1 empty element. */ - Tcl_Obj *listobj = Tcl_NewObj(); - listobj = Tcl_NewListObj(1, &listobj); - Sv_RegisterObjType(listobj->typePtr, DupListObjShared); - Tcl_DecrRefCount(listobj); - - Sv_RegisterCommand("lpop", SvLpopObjCmd, NULL, 0); - Sv_RegisterCommand("lpush", SvLpushObjCmd, NULL, 0); - Sv_RegisterCommand("lappend", SvLappendObjCmd, NULL, 0); - Sv_RegisterCommand("lreplace", SvLreplaceObjCmd, NULL, 0); - Sv_RegisterCommand("linsert", SvLinsertObjCmd, NULL, 0); - Sv_RegisterCommand("llength", SvLlengthObjCmd, NULL, 0); - Sv_RegisterCommand("lindex", SvLindexObjCmd, NULL, 0); - Sv_RegisterCommand("lrange", SvLrangeObjCmd, NULL, 0); - Sv_RegisterCommand("lsearch", SvLsearchObjCmd, NULL, 0); - Sv_RegisterCommand("lset", SvLsetObjCmd, NULL, 0); - - initialized = 1; - } - Tcl_MutexUnlock(&initMutex); + Tcl_MutexLock(&initMutex); + if (initialized == 0) { + /* Create list with 1 empty element. */ + Tcl_Obj *listobj = Tcl_NewObj(); + listobj = Tcl_NewListObj(1, &listobj); + Sv_RegisterObjType(listobj->typePtr, DupListObjShared); + Tcl_DecrRefCount(listobj); + + Sv_RegisterCommand("lpop", SvLpopObjCmd, NULL, 0); + Sv_RegisterCommand("lpush", SvLpushObjCmd, NULL, 0); + Sv_RegisterCommand("lappend", SvLappendObjCmd, NULL, 0); + Sv_RegisterCommand("lreplace", SvLreplaceObjCmd, NULL, 0); + Sv_RegisterCommand("linsert", SvLinsertObjCmd, NULL, 0); + Sv_RegisterCommand("llength", SvLlengthObjCmd, NULL, 0); + Sv_RegisterCommand("lindex", SvLindexObjCmd, NULL, 0); + Sv_RegisterCommand("lrange", SvLrangeObjCmd, NULL, 0); + Sv_RegisterCommand("lsearch", SvLsearchObjCmd, NULL, 0); + Sv_RegisterCommand("lset", SvLsetObjCmd, NULL, 0); + + initialized = 1; + } + Tcl_MutexUnlock(&initMutex); } } @@ -165,43 +165,42 @@ SvLpopObjCmd ( ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, 0); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc > 1 + off) { - Tcl_WrongNumArgs(interp, off, objv, "?index?"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "?index?"); + goto cmd_err; } if (objc == 1 + off) { - iarg = off; + iarg = off; } ret = Tcl_ListObjLength(interp, svObj->tclObj, &llen); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } if (iarg) { - ret = Tcl_GetIntForIndex(interp, objv[iarg], llen-1, &index); - if (ret != TCL_OK) { - goto cmd_err; - } + ret = Tcl_GetIntForIndex(interp, objv[iarg], llen-1, &index); + if (ret != TCL_OK) { + goto cmd_err; + } } if ((index < 0) || (index >= llen)) { - goto cmd_ok; /* Ignore out-of bounds, like Tcl does */ + /* Ignore out-of bounds, like Tcl does */ + return Sv_PutContainer(interp, svObj, SV_UNCHANGED); } ret = Tcl_ListObjIndex(interp, svObj->tclObj, index, &elPtr); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } Tcl_IncrRefCount(elPtr); ret = Tcl_ListObjReplace(interp, svObj->tclObj, index, 1, 0, NULL); if (ret != TCL_OK) { - Tcl_DecrRefCount(elPtr); - goto cmd_err; + Tcl_DecrRefCount(elPtr); + goto cmd_err; } Tcl_SetObjResult(interp, elPtr); Tcl_DecrRefCount(elPtr); - - cmd_ok: return Sv_PutContainer(interp, svObj, SV_CHANGED); cmd_err: @@ -246,33 +245,33 @@ SvLpushObjCmd ( flg = FLAGS_CREATEARRAY | FLAGS_CREATEVAR; ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, flg); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc < 1 + off) { - Tcl_WrongNumArgs(interp, off, objv, "element ?index?"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "element ?index?"); + goto cmd_err; } ret = Tcl_ListObjLength(interp, svObj->tclObj, &llen); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } if (objc == 2 + off) { - ret = Tcl_GetIntForIndex(interp, objv[off+1], llen, &index); - if (ret != TCL_OK) { - goto cmd_err; - } - if (index < 0) { - index = 0; - } else if (index > llen) { - index = llen; - } + ret = Tcl_GetIntForIndex(interp, objv[off+1], llen, &index); + if (ret != TCL_OK) { + goto cmd_err; + } + if (index < 0) { + index = 0; + } else if (index > llen) { + index = llen; + } } args[0] = Sv_DuplicateObj(objv[off]); ret = Tcl_ListObjReplace(interp, svObj->tclObj, index, 0, 1, args); if (ret != TCL_OK) { - Tcl_DecrRefCount(args[0]); - goto cmd_err; + Tcl_DecrRefCount(args[0]); + goto cmd_err; } return Sv_PutContainer(interp, svObj, SV_CHANGED); @@ -319,19 +318,19 @@ SvLappendObjCmd( flg = FLAGS_CREATEARRAY | FLAGS_CREATEVAR; ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, flg); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc < 1 + off) { - Tcl_WrongNumArgs(interp, off, objv, "value ?value ...?"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "value ?value ...?"); + goto cmd_err; } for (i = off; i < objc; i++) { - dup = Sv_DuplicateObj(objv[i]); - ret = Tcl_ListObjAppendElement(interp, svObj->tclObj, dup); - if (ret != TCL_OK) { - Tcl_DecrRefCount(dup); - goto cmd_err; - } + dup = Sv_DuplicateObj(objv[i]); + ret = Tcl_ListObjAppendElement(interp, svObj->tclObj, dup); + if (ret != TCL_OK) { + Tcl_DecrRefCount(dup); + goto cmd_err; + } } Tcl_SetObjResult(interp, Sv_DuplicateObj(svObj->tclObj)); @@ -380,58 +379,58 @@ SvLreplaceObjCmd( ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, 0); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc < 2 + off) { - Tcl_WrongNumArgs(interp, off, objv, "first last ?element ...?"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "first last ?element ...?"); + goto cmd_err; } ret = Tcl_ListObjLength(interp, svObj->tclObj, &llen); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } ret = Tcl_GetIntForIndex(interp, objv[off], llen-1, &first); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } ret = Tcl_GetIntForIndex(interp, objv[off+1], llen-1, &last); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } firstArg = Tcl_GetStringFromObj(objv[off], &argLen); if (first < 0) { - first = 0; + first = 0; } if (llen && first >= llen && strncmp(firstArg, "end", argLen)) { - Tcl_AppendResult(interp, "list doesn't have element ", firstArg, (void *)NULL); - goto cmd_err; + Tcl_AppendResult(interp, "list doesn't have element ", firstArg, (void *)NULL); + goto cmd_err; } if (last >= llen) { - last = llen - 1; + last = llen - 1; } if (first <= last) { - ndel = last - first + 1; + ndel = last - first + 1; } else { - ndel = 0; + ndel = 0; } nargs = objc - off - 2; if (nargs) { - args = (Tcl_Obj**)ckalloc(nargs * sizeof(Tcl_Obj*)); - for(i = off + 2, j = 0; i < objc; i++, j++) { - args[j] = Sv_DuplicateObj(objv[i]); - } + args = (Tcl_Obj**)ckalloc(nargs * sizeof(Tcl_Obj*)); + for(i = off + 2, j = 0; i < objc; i++, j++) { + args[j] = Sv_DuplicateObj(objv[i]); + } } ret = Tcl_ListObjReplace(interp, svObj->tclObj, first, ndel, nargs, args); if (args) { - if (ret != TCL_OK) { - for(i = off + 2, j = 0; i < objc; i++, j++) { - Tcl_DecrRefCount(args[j]); - } - } - ckfree((char *)args); + if (ret != TCL_OK) { + for(i = off + 2, j = 0; i < objc; i++, j++) { + Tcl_DecrRefCount(args[j]); + } + } + ckfree((char *)args); } return Sv_PutContainer(interp, svObj, SV_CHANGED); @@ -477,38 +476,38 @@ SvLrangeObjCmd( ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, 0); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc != 2 + off) { - Tcl_WrongNumArgs(interp, off, objv, "first last"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "first last"); + goto cmd_err; } ret = Tcl_ListObjGetElements(interp, svObj->tclObj, &llen, &elPtrs); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } ret = Tcl_GetIntForIndex(interp, objv[off], llen-1, &first); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } ret = Tcl_GetIntForIndex(interp, objv[off+1], llen-1, &last); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } if (first < 0) { - first = 0; + first = 0; } if (last >= llen) { - last = llen - 1; + last = llen - 1; } if (first > last) { - goto cmd_ok; + goto cmd_ok; } nargs = last - first + 1; args = (Tcl_Obj **)ckalloc(nargs * sizeof(Tcl_Obj *)); for (i = first, j = 0; i <= last; i++, j++) { - args[j] = Sv_DuplicateObj(elPtrs[i]); + args[j] = Sv_DuplicateObj(elPtrs[i]); } Tcl_ResetResult(interp); @@ -560,38 +559,38 @@ SvLinsertObjCmd( flg = FLAGS_CREATEARRAY | FLAGS_CREATEVAR; ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, flg); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc < 2 + off) { - Tcl_WrongNumArgs(interp, off, objv, "index element ?element ...?"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "index element ?element ...?"); + goto cmd_err; } ret = Tcl_ListObjLength(interp, svObj->tclObj, &llen); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } ret = Tcl_GetIntForIndex(interp, objv[off], llen, &index); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } if (index < 0) { - index = 0; + index = 0; } else if (index > llen) { - index = llen; + index = llen; } nargs = objc - off - 1; args = (Tcl_Obj **)ckalloc(nargs * sizeof(Tcl_Obj *)); for (i = off + 1, j = 0; i < objc; i++, j++) { - args[j] = Sv_DuplicateObj(objv[i]); + args[j] = Sv_DuplicateObj(objv[i]); } ret = Tcl_ListObjReplace(interp, svObj->tclObj, index, 0, nargs, args); if (ret != TCL_OK) { - for (i = off + 1, j = 0; i < objc; i++, j++) { - Tcl_DecrRefCount(args[j]); - } - ckfree((char *)args); - goto cmd_err; + for (i = off + 1, j = 0; i < objc; i++, j++) { + Tcl_DecrRefCount(args[j]); + } + ckfree((char *)args); + goto cmd_err; } ckfree((char *)args); @@ -638,15 +637,15 @@ SvLlengthObjCmd( ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, 0); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } ret = Tcl_ListObjLength(interp, svObj->tclObj, &llen); if (ret == TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewIntObj(llen)); + Tcl_SetObjResult(interp, Tcl_NewIntObj(llen)); } if (Sv_PutContainer(interp, svObj, SV_UNCHANGED) != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } return ret; @@ -695,59 +694,59 @@ SvLsearchObjCmd( ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, 0); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc == 2 + off) { - imode = off; - ipatt = off + 1; + imode = off; + ipatt = off + 1; } else if (objc == 1 + off) { - imode = 0; - ipatt = off; + imode = 0; + ipatt = off; } else { - Tcl_WrongNumArgs(interp, off, objv, "?mode? pattern"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "?mode? pattern"); + goto cmd_err; } if (imode) { - ret = Tcl_GetIndexFromObjStruct(interp, objv[imode], modes, sizeof(char *), "search mode", - 0, &mode); - if (ret != TCL_OK) { - goto cmd_err; - } + ret = Tcl_GetIndexFromObjStruct(interp, objv[imode], modes, sizeof(char *), "search mode", + 0, &mode); + if (ret != TCL_OK) { + goto cmd_err; + } } ret = Tcl_ListObjGetElements(interp, svObj->tclObj, &listc, &listv); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } index = TCL_INDEX_NONE; patBytes = Tcl_GetStringFromObj(objv[ipatt], &length); for (i = 0; i < listc; i++) { - match = 0; - switch (mode) { - case LS_GLOB: - match = Tcl_StringCaseMatch(Tcl_GetString(listv[i]), patBytes, 0); - break; - - case LS_EXACT: { - int len; - const char *bytes = Tcl_GetStringFromObj(listv[i], &len); - if (length == len) { - match = (memcmp(bytes, patBytes, length) == 0); - } - break; - } - case LS_REGEXP: - match = Tcl_RegExpMatchObj(interp, listv[i], objv[ipatt]); - if (match < 0) { - goto cmd_err; - } - break; - } - if (match) { - index = i; - break; - } + match = 0; + switch (mode) { + case LS_GLOB: + match = Tcl_StringCaseMatch(Tcl_GetString(listv[i]), patBytes, 0); + break; + + case LS_EXACT: { + int len; + const char *bytes = Tcl_GetStringFromObj(listv[i], &len); + if (length == len) { + match = (memcmp(bytes, patBytes, length) == 0); + } + break; + } + case LS_REGEXP: + match = Tcl_RegExpMatchObj(interp, listv[i], objv[ipatt]); + if (match < 0) { + goto cmd_err; + } + break; + } + if (match) { + index = i; + break; + } } Tcl_SetObjResult(interp, Tcl_NewIntObj(index)); @@ -795,22 +794,22 @@ SvLindexObjCmd( ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, 0); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc != 1 + off) { - Tcl_WrongNumArgs(interp, off, objv, "index"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "index"); + goto cmd_err; } ret = Tcl_ListObjGetElements(interp, svObj->tclObj, &llen, &elPtrs); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } ret = Tcl_GetIntForIndex(interp, objv[off], llen-1, &index); if (ret != TCL_OK) { - goto cmd_err; + goto cmd_err; } if ((index >= 0) && (index < llen)) { - Tcl_SetObjResult(interp, Sv_DuplicateObj(elPtrs[index])); + Tcl_SetObjResult(interp, Sv_DuplicateObj(elPtrs[index])); } return Sv_PutContainer(interp, svObj, SV_UNCHANGED); @@ -856,18 +855,18 @@ SvLsetObjCmd( ret = Sv_GetContainer(interp, objc, objv, &svObj, &off, 0); if (ret != TCL_OK) { - return TCL_ERROR; + return TCL_ERROR; } if (objc < 2 + off) { - Tcl_WrongNumArgs(interp, off, objv, "index ?index...? value"); - goto cmd_err; + Tcl_WrongNumArgs(interp, off, objv, "index ?index...? value"); + goto cmd_err; } lPtr = svObj->tclObj; argc = objc - off - 1; if (!SvLsetFlat(interp, lPtr, argc, (Tcl_Obj**)objv+off,objv[objc-1])) { - return TCL_ERROR; + return TCL_ERROR; } Tcl_SetObjResult(interp, Sv_DuplicateObj(lPtr)); @@ -962,14 +961,14 @@ SvLsetFlat( */ if (indexCount == 1 && - Tcl_ListObjGetElements(interp, indexArray[0], &indexCount, - &indexArray) != TCL_OK) { - /* - * Index arg designates something that is neither an index - * nor a well formed list. - */ + Tcl_ListObjGetElements(interp, indexArray[0], &indexCount, + &indexArray) != TCL_OK) { + /* + * Index arg designates something that is neither an index + * nor a well formed list. + */ - return NULL; + return NULL; } /* @@ -978,12 +977,12 @@ SvLsetFlat( */ if (indexCount == 0) { - return valuePtr; + return valuePtr; } /* Allocate if static array for pending invalidations is too small */ if (indexCount > (Tcl_Size) (sizeof(pendingInvalidates) / - sizeof(pendingInvalidates[0]))) { + sizeof(pendingInvalidates[0]))) { pendingInvalidatesPtr = (Tcl_Obj **)ckalloc(indexCount * sizeof(*pendingInvalidatesPtr)); } @@ -994,51 +993,51 @@ SvLsetFlat( for (i = 0; ; ++i) { - /* - * Take the sublist apart. - */ + /* + * Take the sublist apart. + */ - result = Tcl_ListObjGetElements(interp,listPtr,&elemCount,&elemPtrs); - if (result != TCL_OK) { - break; - } + result = Tcl_ListObjGetElements(interp,listPtr,&elemCount,&elemPtrs); + if (result != TCL_OK) { + break; + } - /* - * Determine the index of the requested element. - */ + /* + * Determine the index of the requested element. + */ - result = Tcl_GetIntForIndex(interp, indexArray[i], elemCount-1, &index); - if (result != TCL_OK) { - break; - } + result = Tcl_GetIntForIndex(interp, indexArray[i], elemCount-1, &index); + if (result != TCL_OK) { + break; + } - /* - * Check that the index is in range. - */ + /* + * Check that the index is in range. + */ - if ((index < 0) || (index >= elemCount)) { - Tcl_SetObjResult(interp, - Tcl_NewStringObj("list index out of range", TCL_INDEX_NONE)); - result = TCL_ERROR; - break; - } + if ((index < 0) || (index >= elemCount)) { + Tcl_SetObjResult(interp, + Tcl_NewStringObj("list index out of range", TCL_INDEX_NONE)); + result = TCL_ERROR; + break; + } - /* - * Remember list of Tcl_Objs that need invalidation of string reps. - */ - pendingInvalidatesPtr[numPendingInvalidates] = listPtr; - ++numPendingInvalidates; + /* + * Remember list of Tcl_Objs that need invalidation of string reps. + */ + pendingInvalidatesPtr[numPendingInvalidates] = listPtr; + ++numPendingInvalidates; - /* - * Break the loop after extracting the innermost sublist - */ + /* + * Break the loop after extracting the innermost sublist + */ - if (i + 1 >= indexCount) { - result = TCL_OK; - break; - } + if (i + 1 >= indexCount) { + result = TCL_OK; + break; + } - listPtr = elemPtrs[index]; + listPtr = elemPtrs[index]; } /* @@ -1047,19 +1046,19 @@ SvLsetFlat( */ if (result == TCL_OK) { - result = Tcl_ListObjGetElements(interp,listPtr,&elemCount,&elemPtrs); - if (result == TCL_OK) { - Tcl_DecrRefCount(elemPtrs[index]); - elemPtrs[index] = Sv_DuplicateObj(valuePtr); - Tcl_IncrRefCount(elemPtrs[index]); - } + result = Tcl_ListObjGetElements(interp,listPtr,&elemCount,&elemPtrs); + if (result == TCL_OK) { + Tcl_DecrRefCount(elemPtrs[index]); + elemPtrs[index] = Sv_DuplicateObj(valuePtr); + Tcl_IncrRefCount(elemPtrs[index]); + } } if (result == TCL_OK) { - /* - * Since modification was successful, we need to invalidate string - * representations of all ancestors of the modified sublist. - */ + /* + * Since modification was successful, we need to invalidate string + * representations of all ancestors of the modified sublist. + */ while (numPendingInvalidates > 0) { --numPendingInvalidates; Tcl_InvalidateStringRep(pendingInvalidatesPtr[numPendingInvalidates]);