Annotation of rpl/modules/sets/complement.rplc, revision 1.2

1.1       bertrand    1: #include "src/rplexternals.h"
                      2: #include "sets.h"
                      3: 
                      4: declareExternalFunction(complement)
                      5:    declareObject(object1);
                      6:    declareObject(object2);
                      7:    declareObject(result);
                      8: 
                      9:    integer8    i;
                     10:    integer8    j;
                     11:    integer8    k;
                     12:    integer8    target(vector);
                     13: 
                     14:    HEADER
                     15:        declareHelpString("Complement");
                     16:        numberOfArguments(2);
                     17:    FUNCTION
                     18:        pullFromStack(object1, external);
                     19:        returnOnError(freeObject(object1));
                     20:        pullFromStack(object2, external);
                     21:        returnOnError(freeObject(object1); freeObject(object2));
                     22: 
                     23:        if ((objectSubtype(object1) ne ISET) or
                     24:                (objectSubtype(object2) ne ISET)) then
                     25:            executionError("Type not allowed");
                     26:            returnOnError(freeObject(object1); freeObject(object2));
                     27:        endIf
                     28: 
                     29:        vector = allocate((*((set_t *) (*object2).objet)).size
                     30:                * size(integer8));
                     31: 
                     32:        i = 0;
                     33:        j = 0;
                     34:        k = 0;
                     35: 
                     36:        repeatWhile((i lt (*((set_t *) (*object1).objet)).size) and
                     37:                (j lt (*((set_t *) (*object2).objet)).size))
                     38:            if ((*((set_t *) (*object2).objet)).values[j] ne
                     39:                    (*((set_t *) (*object1).objet)).values[i]) then
                     40:                vector[k] = (*((set_t *) (*object2).objet)).values[j];
                     41:                postIncr(j);
                     42:                postIncr(k);
                     43:            orElse
                     44:                postIncr(i);
                     45:                postIncr(j);
                     46:            endIf
                     47:        endWhile
                     48: 
                     49:        repeatWhile(j lt (*((set_t *) (*object2).objet)).size)
                     50:            vector[k] = (*((set_t *) (*object2).objet)).values[j];
                     51:            postIncr(j);
                     52:            postIncr(k);
                     53:        endWhile
                     54: 
                     55:        if (i ne (*((set_t *) (*object1).objet)).size) then
                     56:            deallocate(vector);
                     57:            freeObject(object1);
                     58:            freeObject(object2);
                     59:            executionError("Cannot compute complement");
                     60:            returnOnError();
                     61:        endIf
                     62: 
                     63:        vector = reallocate(vector, k * size(integer8));
                     64: 
                     65:        createExternalObject(result, ISET);
1.2     ! bertrand   66:        objectOf(result) = allocate(size(set_t));
1.1       bertrand   67: 
1.2     ! bertrand   68:        objectContainer(set_t, result)->size = k;
        !            69:        objectContainer(set_t, result)->values = vector;
1.1       bertrand   70: 
                     71:        freeObject(object1);
                     72:        freeObject(object2);
                     73: 
                     74:        pushOnStack(result);
                     75:    END
                     76: endExternalFunction
                     77: 
                     78: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>