Attachment "lsort-indices-diff.txt" to
ticket [1017483fff]
added by
nobody
2004-08-27 17:01:20.
*** tcl8.4.6/generic/tclCmdIL.c Thu Jul 17 13:29:19 2003
--- tclCmdIL.c Thu Aug 26 23:14:15 2004
***************
*** 31,36 ****
--- 31,37 ----
typedef struct SortElement {
Tcl_Obj *objPtr; /* Object being sorted. */
int count; /* number of same elements in list */
+ int index; /* serial number for -indices */
struct SortElement *nextPtr; /* Next element in the list, or
* NULL for end of list. */
} SortElement;
***************
*** 3255,3261 ****
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument values. */
{
! int i, index, unique;
Tcl_Obj *resultPtr;
int length;
Tcl_Obj *cmdPtr, **listObjPtrs;
--- 3256,3262 ----
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument values. */
{
! int i, index, unique, ordering;
Tcl_Obj *resultPtr;
int length;
Tcl_Obj *cmdPtr, **listObjPtrs;
***************
*** 3266,3272 ****
* comparison function */
static CONST char *switches[] = {
"-ascii", "-command", "-decreasing", "-dictionary", "-increasing",
! "-index", "-integer", "-real", "-unique", (char *) NULL
};
resultPtr = Tcl_GetObjResult(interp);
--- 3267,3273 ----
* comparison function */
static CONST char *switches[] = {
"-ascii", "-command", "-decreasing", "-dictionary", "-increasing",
! "-index", "-integer", "-real", "-unique", "-indices", (char *) NULL
};
resultPtr = Tcl_GetObjResult(interp);
***************
*** 3286,3291 ****
--- 3287,3293 ----
sortInfo.resultCode = TCL_OK;
cmdPtr = NULL;
unique = 0;
+ ordering = 0;
for (i = 1; i < objc-1; i++) {
if (Tcl_GetIndexFromObj(interp, objv[i], switches, "option", 0, &index)
!= TCL_OK) {
***************
*** 3337,3342 ****
--- 3339,3347 ----
case 8: /* -unique */
unique = 1;
break;
+ case 9: /* -indices */
+ ordering = 1;
+ break;
}
}
if (sortInfo.sortMode == SORTMODE_COMMAND) {
***************
*** 3370,3375 ****
--- 3375,3381 ----
for (i=0; i < length; i++){
elementArray[i].objPtr = listObjPtrs[i];
elementArray[i].count = 0;
+ elementArray[i].index = i;
elementArray[i].nextPtr = &elementArray[i+1];
}
elementArray[length-1].nextPtr = NULL;
***************
*** 3385,3398 ****
if (unique) {
for (; elementPtr != NULL; elementPtr = elementPtr->nextPtr){
if (elementPtr->count == 0) {
! Tcl_ListObjAppendElement(interp, resultPtr,
elementPtr->objPtr);
}
}
} else {
for (; elementPtr != NULL; elementPtr = elementPtr->nextPtr){
! Tcl_ListObjAppendElement(interp, resultPtr,
elementPtr->objPtr);
}
}
}
--- 3391,3414 ----
if (unique) {
for (; elementPtr != NULL; elementPtr = elementPtr->nextPtr){
if (elementPtr->count == 0) {
! if (ordering) {
! Tcl_ListObjAppendElement(interp, resultPtr,
! Tcl_NewIntObj(elementPtr->index));
! } else {
! Tcl_ListObjAppendElement(interp, resultPtr,
elementPtr->objPtr);
+ }
}
}
} else {
for (; elementPtr != NULL; elementPtr = elementPtr->nextPtr){
! if (ordering) {
! Tcl_ListObjAppendElement(interp, resultPtr,
! Tcl_NewIntObj(elementPtr->index));
! } else {
! Tcl_ListObjAppendElement(interp, resultPtr,
elementPtr->objPtr);
+ }
}
}
}