File:  [local] / rpl / modules / sets / ltos.rplc
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Mon Jul 31 08:59:37 2017 UTC (6 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, rpl-4_1_33, rpl-4_1_32, rpl-4_1_31, rpl-4_1_30, rpl-4_1_29, rpl-4_1_28, rpl-4_1_27, HEAD
Correction de L->S

    1: #include "src/rplexternals.h"
    2: #include "sets.h"
    3: 
    4: static int
    5: orderFunction(const void *a, const void *b)
    6: {
    7:     if ((*((integer8 *) a)) < (*((integer8 *) b)))
    8:     {
    9:         return(-1);
   10:     }
   11:     if ((*((integer8 *) a)) > (*((integer8 *) b)))
   12:     {
   13:         return(1);
   14:     }
   15: 
   16:     return(0);
   17: }
   18: 
   19: 
   20: declareExternalFunction(ltos)
   21:     declareDaisyChain(current);
   22:     declareObject(object);
   23:     declareObject(subObject);
   24:     declareObject(result);
   25: 
   26:     integer8    currentValue;
   27:     integer8    i;
   28:     integer8    j;
   29:     integer8    target(vector);
   30:     integer8    sizeOfList;
   31: 
   32:     HEADER
   33:         declareHelpString("List to set");
   34:         numberOfArguments(1);
   35:     FUNCTION
   36:         pullFromStack(object, list);
   37:         returnOnError(freeObject(object));
   38: 
   39:         listLength(object, sizeOfList);
   40:         getDaisyChainFromList(object, current);
   41:         vector = allocate(sizeOfList * size(integer8));
   42: 
   43:         i = 0;
   44: 
   45:         repeatWhile(not nullified(current))
   46:             subObject = fetchElementFromDaisyChain(current);
   47:             getInteger(subObject, vector[i]);
   48:             returnOnError(freeObject(object); deallocate(vector));
   49:             postIncr(i);
   50:             current = nextElementOfDaisyChain(current);
   51:         endWhile
   52: 
   53:         freeObject(object);
   54: 
   55:         if (sizeOfList gt 0) then
   56:             qsort(vector, sizeOfList, sizeof(integer8), orderFunction);
   57: 
   58:             currentValue = vector[0];
   59:             j = 1;
   60: 
   61:             loop(i = 1, i lt sizeOfList, postIncr(i))
   62:                 if (vector[i] ne currentValue) then
   63:                     vector[postIncr(j)] = vector[i];
   64:                     currentValue = vector[i];
   65:                 endIf
   66:             endLoop
   67: 
   68:             sizeOfList = j;
   69:             vector = reallocate(vector, sizeOfList * size(integer8));
   70:         endIf
   71: 
   72:         createExternalObject(result, ISET);
   73:         objectOf(result) = allocate(size(set_t));
   74:         objectContainer(set_t, result)->values = vector;
   75:         objectContainer(set_t, result)->size = sizeOfList;
   76: 
   77:         pushOnStack(result);
   78:     END
   79: endExternalFunction
   80: 
   81: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>