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

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);
        !            70:        (*result).objet = allocate(size(set_t));
        !            71: 
        !            72:        (*((set_t *) (*result).objet)).size = k;
        !            73:        (*((set_t *) (*result).objet)).values = vector;
        !            74: 
        !            75:        freeObject(object1);
        !            76:        freeObject(object2);
        !            77: 
        !            78:        pushOnStack(result);
        !            79:    END
        !            80: endExternalFunction
        !            81: 
        !            82: declareExternalFunction(intersection)
        !            83:    declareObject(object1);
        !            84:    declareObject(object2);
        !            85:    declareObject(result);
        !            86: 
        !            87:    integer8    i;
        !            88:    integer8    j;
        !            89:    integer8    k;
        !            90:    integer8    target(vector);
        !            91: 
1.1       bertrand   92:    HEADER
                     93:        declareHelpString("Union");
                     94:        numberOfArguments(2);
                     95:    FUNCTION
1.3     ! bertrand   96:        pullFromStack(object1, external);
        !            97:        returnOnError(freeObject(object1));
        !            98:        pullFromStack(object2, external);
        !            99:        returnOnError(freeObject(object1); freeObject(object2));
        !           100: 
        !           101:        if ((objectSubtype(object1) ne ISET) or
        !           102:                (objectSubtype(object2) ne ISET)) then
        !           103:            executionError("Type not allowed");
        !           104:            returnOnError(freeObject(object1); freeObject(object2));
        !           105:        endIf
        !           106: 
        !           107:        vector = allocate((*((set_t *) (*object1).objet)).size
        !           108:                * size(integer8));
        !           109: 
        !           110:        i = 0;
        !           111:        j = 0;
        !           112:        k = 0;
        !           113: 
        !           114:        repeatWhile((i lt (*((set_t *) (*object1).objet)).size) and
        !           115:                (j lt (*((set_t *) (*object2).objet)).size))
        !           116:            if ((*((set_t *) (*object1).objet)).values[i] lt
        !           117:                    (*((set_t *) (*object2).objet)).values[j]) then
        !           118:                postIncr(i);
        !           119:            elseIf ((*((set_t *) (*object2).objet)).values[j] lt
        !           120:                    (*((set_t *) (*object1).objet)).values[i]) then
        !           121:                postIncr(j);
        !           122:            orElse
        !           123:                vector[k] = (*((set_t *) (*object2).objet)).values[j];
        !           124:                postIncr(i);
        !           125:                postIncr(j);
        !           126:                postIncr(k);
        !           127:            endIf
        !           128:        endWhile
        !           129: 
        !           130:        vector = reallocate(vector, k * size(integer8));
        !           131: 
        !           132:        createExternalObject(result, ISET);
        !           133:        (*result).objet = allocate(size(set_t));
        !           134: 
        !           135:        (*((set_t *) (*result).objet)).size = k;
        !           136:        (*((set_t *) (*result).objet)).values = vector;
        !           137: 
        !           138:        freeObject(object1);
        !           139:        freeObject(object2);
        !           140: 
        !           141:        pushOnStack(result);
1.1       bertrand  142:    END
                    143: endExternalFunction
                    144: 
1.2       bertrand  145: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>