* Bug #11065 fixed - The second output argument of unique function contained a wrong... 38/12238/3
Adeline CARNIS [Tue, 6 Aug 2013 12:37:33 +0000 (14:37 +0200)]
Change-Id: I1aa42678ade775796fea36e3d3d2c55c28f4280b

scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/macros/unique.sci
scilab/modules/elementary_functions/src/c/qsort-char.c
scilab/modules/elementary_functions/src/c/qsort-double.c
scilab/modules/elementary_functions/src/c/qsort-int.c
scilab/modules/elementary_functions/src/c/qsort-short.c
scilab/modules/elementary_functions/src/c/qsort-string.c
scilab/modules/elementary_functions/src/c/qsort.c
scilab/modules/elementary_functions/src/c/qsort.h
scilab/modules/elementary_functions/tests/nonreg_tests/bug_11065.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_11065.tst [new file with mode: 0644]

index 112b35d..d1f3098 100644 (file)
@@ -469,6 +469,8 @@ Bug Fixes
 
 * Bug #10995 fixed - Typo fixed in grand help page for Gamma law argument.
 
+* Bug #11065 fixed - The second output argument of unique function contained a wrong result.
+
 * Bug #11139 fixed - conj was not defined for sparse matrices (+ unit test added).
 
 * Bug #11308 fixed - Calling sequences in dsearch help page were wrong.
index 0078117..a1456b0 100644 (file)
@@ -29,7 +29,6 @@ function [x,k]=unique(x,orient)
         if argn(1) == 2 then
             [x,k] = gsort(x,"lr","d");
             keq = find(and(x(2:$,:) == x(1:$-1,:),"c"))
-            if keq<>[] then keq = keq+1;end
             x(keq,:) = [];
             k(keq,:) = [];
             k = k($:-1:1,:);
@@ -42,7 +41,6 @@ function [x,k]=unique(x,orient)
         if argn(1) == 2 then
             [x,k] = gsort(x,"lc","d");
             keq = find(and(x(:,2:$) == x(:,1:$-1),"r"))
-            if keq<>[] then keq = keq+1;end
             x(:,keq) = [];
             k(:,keq) = [];
             k = k(:,$:-1:1);
index bad257b..c0830bb 100644 (file)
@@ -154,6 +154,7 @@ void ColSortchar(char *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(char), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCchar : compareDchar,
                  swapcodechar, swapcodeind);
     }
@@ -179,6 +180,7 @@ void RowSortchar(char *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(char), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCchar : compareDchar,
                  swapcodechar, swapcodeind);
     }
@@ -199,6 +201,7 @@ void GlobalSortchar(char *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(char), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCchar : compareDchar,
              swapcodechar, swapcodeind);
 }
@@ -224,6 +227,7 @@ void ColSortuchar(unsigned char *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(char), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCuchar : compareDuchar,
                  swapcodechar, swapcodeind);
     }
@@ -249,6 +253,7 @@ void RowSortuchar(unsigned char *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(char), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCuchar : compareDuchar,
                  swapcodechar, swapcodeind);
     }
@@ -269,6 +274,7 @@ void GlobalSortuchar(unsigned char *a, int *ind, int flag, int n, int p, char di
     }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(char), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCuchar : compareDuchar,
              swapcodechar, swapcodeind);
 }
@@ -394,6 +400,7 @@ void LexiRowchar(char *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(char), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCchar : LexiRowcompareDchar,
              LexiRowswapcodechar, swapcodeind);
 }
@@ -412,6 +419,7 @@ void LexiRowuchar(unsigned char *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(char), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCuchar : LexiRowcompareDuchar,
              LexiRowswapcodechar, swapcodeind);
 }
@@ -532,6 +540,7 @@ void LexiColchar(char *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(char), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCchar : LexiColcompareDchar,
              LexiColswapcodechar,
              swapcodeind);
@@ -550,6 +559,7 @@ void LexiColuchar(unsigned char *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(char), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCuchar : LexiColcompareDuchar,
              LexiColswapcodechar,
              swapcodeind);
index b14f3e0..b6cb966 100644 (file)
@@ -109,6 +109,7 @@ void ColSortdouble(double *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(double), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCdouble : compareDdouble,
                  swapcodedouble, swapcodeind);
     }
@@ -134,6 +135,7 @@ void RowSortdouble(double *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(double), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCdouble : compareDdouble,
                  swapcodedouble, swapcodeind);
     }
@@ -151,6 +153,7 @@ void GlobalSortdouble(double *a, int *ind, int flag, int n, int p, char dir)
         }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(double), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCdouble : compareDdouble,
              swapcodedouble, swapcodeind);
 }
@@ -175,11 +178,11 @@ static  int LexiRowcompareCdouble(double *i, double *j)
 
     for ( jc = 0 ; jc < lexicolsdouble ; jc++)
     {
-        if (*i > *j || (double *)C2F(isanan)((double *)i) == 1)
+        if (*i > *j || (double *)C2F(isanan)((double *)i) == (double *) 1)
         {
             return (1);
         }
-        if (*i < *j || (double *)C2F(isanan)((double *)j) == 1)
+        if (*i < *j || (double *)C2F(isanan)((double *)j) == (double *) 1)
         {
             return (-1);
         }
@@ -195,11 +198,11 @@ static  int LexiRowcompareDdouble(double *i, double*j)
 
     for ( jc = 0 ; jc < lexicolsdouble ; jc++)
     {
-        if (*i < *j || (double *)C2F(isanan)((double *)j) == 1)
+        if (*i < *j || (double *)C2F(isanan)((double *)j) == (double *) 1)
         {
             return (1);
         }
-        if (*i > *j || (double *)C2F(isanan)((double *)i) == 1)
+        if (*i > *j || (double *)C2F(isanan)((double *)i) == (double *) 1)
         {
             return (-1);
         }
@@ -243,6 +246,7 @@ void LexiRowdouble(double *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(double), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCdouble : LexiRowcompareDdouble,
              LexiRowswapcodedouble, swapcodeind);
 }
@@ -257,11 +261,11 @@ static  int LexiColcompareCdouble(double *i, double *j)
     int ic;
     for ( ic = 0 ; ic < lexirowsdouble ; ic++)
     {
-        if (*i > *j || (double *)C2F(isanan)((double *)i) == 1)
+        if (*i > *j || (double *)C2F(isanan)((double *)i) == (double *) 1)
         {
             return (1);
         }
-        if (*i < *j || (double *)C2F(isanan)((double *)j) == 1)
+        if (*i < *j || (double *)C2F(isanan)((double *)j) == (double *) 1)
         {
             return (-1);
         }
@@ -276,11 +280,11 @@ static  int LexiColcompareDdouble(double *i, double *j)
     int ic;
     for ( ic = 0 ; ic < lexirowsdouble ; ic++)
     {
-        if (*i < *j || (double *)C2F(isanan)((double *)j) == 1)
+        if (*i < *j || (double *)C2F(isanan)((double *)j) == (double *) 1)
         {
             return (1);
         }
-        if (*i > *j || (double *)C2F(isanan)((double *)i) == 1)
+        if (*i > *j || (double *)C2F(isanan)((double *)i) ==  (double *) 1)
         {
             return (-1);
         }
@@ -323,6 +327,7 @@ void LexiColdouble(double *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(double), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCdouble : LexiColcompareDdouble,
              LexiColswapcodedouble,
              swapcodeind);
index 1eef00d..b786b4d 100644 (file)
@@ -136,6 +136,7 @@ void ColSortint(int *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(int), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCint : compareDint,
                  swapcodeint, swapcodeind);
     }
@@ -158,6 +159,7 @@ void ColSortuint(unsigned int *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(int), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCuint : compareDuint,
                  swapcodeint, swapcodeind);
     }
@@ -184,6 +186,7 @@ void RowSortint(int *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(int), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCint : compareDint,
                  swapcodeint, swapcodeind);
     }
@@ -206,6 +209,7 @@ void RowSortuint(unsigned int *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(int), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCuint : compareDuint,
                  swapcodeint, swapcodeind);
     }
@@ -227,6 +231,7 @@ void GlobalSortint(int *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(int), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCint : compareDint,
              swapcodeint, swapcodeind);
 }
@@ -244,6 +249,7 @@ void GlobalSortuint(unsigned int *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(int), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCuint : compareDuint,
              swapcodeint, swapcodeind);
 }
@@ -375,6 +381,7 @@ void LexiRowint(int *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(int), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCint : LexiRowcompareDint,
              LexiRowswapcodeint, swapcodeind);
 }
@@ -392,6 +399,7 @@ void LexiRowuint(unsigned int *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(int), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCuint : LexiRowcompareDuint,
              LexiRowswapcodeint, swapcodeind);
 }
@@ -513,6 +521,7 @@ void LexiColint(int *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(int), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCint : LexiColcompareDint,
              LexiColswapcodeint,
              swapcodeind);
@@ -531,6 +540,7 @@ void LexiColuint(unsigned int *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(int), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCuint : LexiColcompareDuint,
              LexiColswapcodeint,
              swapcodeind);
index 9cbe44b..f3b374f 100644 (file)
@@ -154,6 +154,7 @@ void ColSortshort(short *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(short), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCshort : compareDshort,
                  swapcodeshort, swapcodeind);
     }
@@ -179,6 +180,7 @@ void RowSortshort(short *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(short), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCshort : compareDshort,
                  swapcodeshort, swapcodeind);
     }
@@ -199,6 +201,7 @@ void GlobalSortshort(short *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(short), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCshort : compareDshort,
              swapcodeshort, swapcodeind);
 }
@@ -224,6 +227,7 @@ void ColSortushort(unsigned short *a, int *ind, int flag, int n, int p, char dir
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(short), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCushort : compareDushort,
                  swapcodeshort, swapcodeind);
     }
@@ -249,6 +253,7 @@ void RowSortushort(unsigned short *a, int *ind, int flag, int n, int p, char dir
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(short), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCushort : compareDushort,
                  swapcodeshort, swapcodeind);
     }
@@ -269,6 +274,7 @@ void GlobalSortushort(unsigned short *a, int *ind, int flag, int n, int p, char
     }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(short), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCushort : compareDushort,
              swapcodeshort, swapcodeind);
 }
@@ -394,6 +400,7 @@ void LexiRowshort(short *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(short), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCshort : LexiRowcompareDshort,
              LexiRowswapcodeshort, swapcodeind);
 }
@@ -412,6 +419,7 @@ void LexiRowushort(unsigned short *a, int *ind, int flag, int n, int p, char dir
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(short), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCushort : LexiRowcompareDushort,
              LexiRowswapcodeshort, swapcodeind);
 }
@@ -532,6 +540,7 @@ void LexiColshort(short *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(short), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCshort : LexiColcompareDshort,
              LexiColswapcodeshort,
              swapcodeind);
@@ -550,6 +559,7 @@ void LexiColushort(unsigned short *a, int *ind, int flag, int n, int p, char dir
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(short), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCushort : LexiColcompareDushort,
              LexiColswapcodeshort,
              swapcodeind);
index 49fa507..4d4666e 100644 (file)
@@ -94,6 +94,7 @@ void ColSortstring(char * *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + n * j), (char *) (ind + n * j), flag, n,
                  sizeof(char *), sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCstring : compareDstring,
                  swapcodestring, swapcodeind);
     }
@@ -119,6 +120,7 @@ void RowSortstring(char * *a, int *ind, int flag, int n, int p, char dir)
     {
         sciqsort((char *) (a + i), (char *) (ind + i), flag, p,
                  n * sizeof(char *), n * sizeof(int),
+                 (dir == 'i') ? 1 : 0,
                  (dir == 'i' ) ? compareCstring : compareDstring,
                  swapcodestring, swapcodeind);
     }
@@ -139,6 +141,7 @@ void GlobalSortstring(char * *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n * p,
              sizeof(char *), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? compareCstring : compareDstring,
              swapcodestring, swapcodeind);
 }
@@ -223,6 +226,7 @@ void LexiRowstring(char * *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, n,
              sizeof(char *), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiRowcompareCstring : LexiRowcompareDstring,
              LexiRowswapcodestring, swapcodeind);
 }
@@ -298,6 +302,7 @@ void LexiColstring(char * *a, int *ind, int flag, int n, int p, char dir)
     }
     sciqsort((char *) (a), (char *) (ind), flag, p,
              n * sizeof(char *), sizeof(int),
+             (dir == 'i') ? 1 : 0,
              (dir == 'i' ) ? LexiColcompareCstring : LexiColcompareDstring,
              LexiColswapcodestring, swapcodeind);
 }
index 422fd1f..f818448 100644 (file)
@@ -14,6 +14,7 @@
 #include "qsort-double.h"
 #include "qsort-string.h"
 #include "core_math.h"
+#include "stdio.h"
 /*--------------------------------------------------------------------------*/
 
 /*--------------------------------------------------------------------------*/
@@ -61,7 +62,7 @@
 * Software---Practice and Experience, 23(11):1249-1265
 */
 /*--------------------------------------------------------------------------*/
-void sciqsort(char *a, char *tab, int flag, int n, int es, int es1, int (*cmp)(), int (*swapcode)(), int (*lswapcodeind)())
+void sciqsort(char *a, char *tab, int flag, int n, int es, int es1, int flag2, int (*cmp)(), int (*swapcode)(), int (*lswapcodeind)())
 {
     char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
     char *taba, *tabb, *tabc, *tabd, *tabl, *tabm, *tabn;
@@ -79,14 +80,44 @@ loop:
                 swap(pl, pl - es);
             }
         }
+
+        if (flag2) // manages the functions which have the form: LexiRowcompareDdouble ...
+        {
+            for (pm = a + es, tabm = tab + es1 ; pm < (char *)a + n * es; pm += es, tabm += es1)
+            {
+                if (cmp(pm - es, pm, tabm - es1, tabm, flag) == 0)
+                {
+                    if ((int *) (tabm - es1)[0] > (int *) tabm[0])
+                    {
+                        swapind(tabm, tabm - es1);
+                    }
+                }
+            }
+        }
+        else // manages the functions which have the form: LexiRowcompareCdouble ...
+        {
+            for (pm = a + (n - 1) * es, tabm = tab + (n - 1) * es1 ; pm > (char *)a; pm -= es, tabm -= es1)
+            {
+                if (cmp(pm - es, pm, tabm - es1, tabm, flag) == 0)
+                {
+                    if ((int *) (tabm - es1)[0] < (int *) tabm[0])
+                    {
+                        swapind(tabm, tabm - es1);
+                    }
+                }
+            }
+        }
+
         return;
     }
+
     /*Determine the pivot */
     pm = a + (n / 2) * es;/* Small arrays, middle element */
     tabm = tab + (n / 2) * es1 ;
 
     pn = a + (n - 1) * es;
     tabn = tab + (n - 1) * es1;
+
     if (n > 7)
     {
         pl = a;
@@ -101,6 +132,7 @@ loop:
         }
         med3(pm, tabm, pl, pm, pn, tabl, tabm, tabn, cmp);
     }
+
     /* Put it at the first position */
     /* Partionning */
     if (cmp(pn, a, tabn, tab, flag))
@@ -216,7 +248,7 @@ loop:
     if ((r = (int)(pb - pa)) > es )
         /* recall  sciqsort for the lower part */
     {
-        sciqsort(a, tab, flag, r / es, es, es1, cmp, swapcode, lswapcodeind);
+        sciqsort(a, tab, flag, r / es, es, es1, flag2, cmp, swapcode, lswapcodeind);
     }
     if ((r = (int)(pd - pc)) > es)
     {
index d8bbaa5..34241a3 100644 (file)
@@ -13,7 +13,7 @@
 #ifndef __QSORT_H__
 #define __QSORT_H__
 
-void sciqsort(char *a, char *tab, int flag, int n, int es, int es1, int (*cmp) (), int (*swapcode) (), int (*swapcodeind) ());
+void sciqsort(char *a, char *tab, int flag, int n, int es, int es1, int flag2, int (*cmp) (), int (*swapcode) (), int (*swapcodeind) ());
 int swapcodeint(char * parmi, char * parmj, int n, int incr);
 
 #define swapcodeind swapcodeint
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_11065.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_11065.dia.ref
new file mode 100644 (file)
index 0000000..e33b877
--- /dev/null
@@ -0,0 +1,42 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 11065 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11065
+//
+// <-- Short Description -->
+//    The second output argument of unique function contained the wrong position.
+// =============================================================================
+A=[1 2 3;4 5 6;4 5 6;7 8 9;8 9 10;4 5 6;9 10 11];
+B=[A;10 11 12];
+[x, k] = gsort(A, 'lr', 'i');
+expectedX = [1 2 3;4 5 6;4 5 6;4 5 6;7 8 9;8 9 10;9 10 11];
+expectedK = [1 2 3 6 4 5 7]';
+assert_checkequal(x, expectedX);
+assert_checkequal(k, expectedK);
+[x, k] = gsort(A, 'lr', 'd');
+expectedX = [9 10 11;8 9 10;7 8 9;4 5 6;4 5 6;4 5 6;1 2 3];
+expectedK = [7 5 4 6 3 2 1]';
+assert_checkequal(x, expectedX);
+assert_checkequal(k, expectedK);
+[x, k] = gsort(A, 'lr');
+expectedX = [9 10 11;8 9 10;7 8 9;4 5 6;4 5 6;4 5 6;1 2 3];
+expectedK = [7 5 4 6 3 2 1]';
+assert_checkequal(x, expectedX);
+assert_checkequal(k, expectedK);
+[Au,iu]=unique(A,'r');
+expectedA = [1 2 3;4 5 6;7 8 9;8 9 10;9 10 11];
+expectedI = [1 2 4 5 7]';
+assert_checkequal(Au, expectedA);
+assert_checkequal(iu, expectedI);
+[Bu,ku]=unique(B,'r');
+expectedB = [1 2 3;4 5 6;7 8 9;8 9 10;9 10 11;10 11 12];
+expectedK = [1 2 4 5 7 8]';
+assert_checkequal(Bu, expectedB);
+assert_checkequal(ku, expectedK);
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_11065.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_11065.tst
new file mode 100644 (file)
index 0000000..0652f48
--- /dev/null
@@ -0,0 +1,55 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 11065 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11065
+//
+// <-- Short Description -->
+//    The second output argument of unique function contained the wrong position.
+// =============================================================================
+
+A=[1 2 3;4 5 6;4 5 6;7 8 9;8 9 10;4 5 6;9 10 11];
+B=[A;10 11 12];
+
+[x, k] = gsort(A, 'lr', 'i');
+expectedX = [1 2 3;4 5 6;4 5 6;4 5 6;7 8 9;8 9 10;9 10 11];
+expectedK = [1 2 3 6 4 5 7]';
+
+assert_checkequal(x, expectedX);
+assert_checkequal(k, expectedK);
+
+[x, k] = gsort(A, 'lr', 'd');
+expectedX = [9 10 11;8 9 10;7 8 9;4 5 6;4 5 6;4 5 6;1 2 3];
+expectedK = [7 5 4 6 3 2 1]';
+
+assert_checkequal(x, expectedX);
+assert_checkequal(k, expectedK);
+
+[x, k] = gsort(A, 'lr');
+expectedX = [9 10 11;8 9 10;7 8 9;4 5 6;4 5 6;4 5 6;1 2 3];
+expectedK = [7 5 4 6 3 2 1]';
+
+assert_checkequal(x, expectedX);
+assert_checkequal(k, expectedK);
+
+[Au,iu]=unique(A,'r');
+expectedA = [1 2 3;4 5 6;7 8 9;8 9 10;9 10 11];
+expectedI = [1 2 4 5 7]';
+
+assert_checkequal(Au, expectedA);
+assert_checkequal(iu, expectedI);
+
+[Bu,ku]=unique(B,'r');
+expectedB = [1 2 3;4 5 6;7 8 9;8 9 10;9 10 11;10 11 12];
+expectedK = [1 2 4 5 7 8]';
+
+assert_checkequal(Bu, expectedB);
+assert_checkequal(ku, expectedK);