#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; HEADER declareHelpString("List to set"); numberOfArguments(1); FUNCTION pullFromStack(object, list); returnOnError(freeObject(object)); listLength(object, sizeOfList); getDaisyChainFromList(object, current); vector = allocate(sizeOfList * size(integer8)); i = 0; repeatWhile(not nullified(current)) subObject = fetchElementFromDaisyChain(current); getInteger(subObject, vector[i]); returnOnError(freeObject(object); deallocate(vector)); postIncr(i); 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; pushOnStack(result); END endExternalFunction // vim: ts=4