Tcl Source Code

Artifact [ca3967c919]
Login

Artifact ca3967c919f664695fcd8817536a64ad8d862165:

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);
+ 		}
  	    }
  	}
      }