Annotation of rpl/modules/sets/union.rplc, revision 1.5

1.1       bertrand    1: #include "src/rplexternals.h"
                      2: #include "sets.h"
                      3: 
                      4: declareExternalFunction(union)
1.3       bertrand    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("Union");
                     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 *) (*object1).objet)).size
                     30:                + (*((set_t *) (*object2).objet)).size) * 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 *) (*object1).objet)).values[i] lt
                     39:                    (*((set_t *) (*object2).objet)).values[j]) then
                     40:                vector[k] = (*((set_t *) (*object1).objet)).values[i];
                     41:                postIncr(i);
                     42:            elseIf ((*((set_t *) (*object2).objet)).values[j] lt
                     43:                    (*((set_t *) (*object1).objet)).values[i]) then
                     44:                vector[k] = (*((set_t *) (*object2).objet)).values[j];
                     45:                postIncr(j);
                     46:            orElse
                     47:                vector[k] = (*((set_t *) (*object2).objet)).values[j];
                     48:                postIncr(i);
                     49:                postIncr(j);
                     50:            endIf
                     51: 
                     52:            postIncr(k);
                     53:        endWhile
                     54: 
                     55:        repeatWhile(i lt (*((set_t *) (*object1).objet)).size)
                     56:            vector[k] = (*((set_t *) (*object1).objet)).values[i];
                     57:            postIncr(i);
                     58:            postIncr(k);
                     59:        endWhile
                     60: 
                     61:        repeatWhile(j lt (*((set_t *) (*object2).objet)).size)
                     62:            vector[k] = (*((set_t *) (*object2).objet)).values[j];
                     63:            postIncr(j);
                     64:            postIncr(k);
                     65:        endWhile
                     66: 
                     67:        vector = reallocate(vector, k * size(integer8));
                     68: 
                     69:        createExternalObject(result, ISET);
1.5     ! bertrand   70:        objectOf(result) = allocate(size(set_t));
1.3       bertrand   71: 
1.5     ! bertrand   72:        objectContainer(set_t, result)->size = k;
        !            73:        objectContainer(set_t, result)->values = vector;
1.3       bertrand   74: 
                     75:        freeObject(object1);
                     76:        freeObject(object2);
                     77: 
                     78:        pushOnStack(result);
                     79:    END
                     80: endExternalFunction
                     81: 
1.2       bertrand   82: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>