--- rpl/modules/sets/ltos.rplc 2017/07/30 21:59:02 1.1 +++ rpl/modules/sets/ltos.rplc 2017/07/31 08:59:37 1.2 @@ -1,13 +1,31 @@ #include "src/rplexternals.h" #include "sets.h" +static int +orderFunction(const void *a, const void *b) +{ + if ((*((integer8 *) a)) < (*((integer8 *) b))) + { + return(-1); + } + if ((*((integer8 *) a)) > (*((integer8 *) b))) + { + return(1); + } + + return(0); +} + + declareExternalFunction(ltos) declareDaisyChain(current); declareObject(object); declareObject(subObject); declareObject(result); + integer8 currentValue; integer8 i; + integer8 j; integer8 target(vector); integer8 sizeOfList; @@ -29,12 +47,30 @@ declareExternalFunction(ltos) getInteger(subObject, vector[i]); returnOnError(freeObject(object); deallocate(vector)); postIncr(i); - nextElementOfDaisyChain(current); + current = nextElementOfDaisyChain(current); endWhile freeObject(object); + if (sizeOfList gt 0) then + qsort(vector, sizeOfList, sizeof(integer8), orderFunction); + + currentValue = vector[0]; + j = 1; + + loop(i = 1, i lt sizeOfList, postIncr(i)) + if (vector[i] ne currentValue) then + vector[postIncr(j)] = vector[i]; + currentValue = vector[i]; + endIf + endLoop + + sizeOfList = j; + vector = reallocate(vector, sizeOfList * size(integer8)); + endIf + createExternalObject(result, ISET); + objectOf(result) = allocate(size(set_t)); objectContainer(set_t, result)->values = vector; objectContainer(set_t, result)->size = sizeOfList;