#include "src/rplexternals.h" #include "sets.h" declareExternalFunction(intersection) declareObject(object1); declareObject(object2); declareObject(result); integer8 i; integer8 j; integer8 k; integer8 target(vector); HEADER declareHelpString("Intersection"); numberOfArguments(2); FUNCTION pullFromStack(object1, external); returnOnError(freeObject(object1)); pullFromStack(object2, external); returnOnError(freeObject(object1); freeObject(object2)); if ((objectSubtype(object1) ne ISET) or (objectSubtype(object2) ne ISET)) then executionError("Type not allowed"); returnOnError(freeObject(object1); freeObject(object2)); endIf vector = allocate((*((set_t *) (*object1).objet)).size * size(integer8)); i = 0; j = 0; k = 0; repeatWhile((i lt (*((set_t *) (*object1).objet)).size) and (j lt (*((set_t *) (*object2).objet)).size)) if ((*((set_t *) (*object1).objet)).values[i] lt (*((set_t *) (*object2).objet)).values[j]) then postIncr(i); elseIf ((*((set_t *) (*object2).objet)).values[j] lt (*((set_t *) (*object1).objet)).values[i]) then postIncr(j); orElse vector[k] = (*((set_t *) (*object2).objet)).values[j]; postIncr(i); postIncr(j); postIncr(k); endIf endWhile vector = reallocate(vector, k * size(integer8)); createExternalObject(result, ISET); objectOf(result) = allocate(size(set_t)); objectContainer(set_t, result)->size = k; objectContainer(set_t, result)->values = vector; freeObject(object1); freeObject(object2); pushOnStack(result); END endExternalFunction // vim: ts=4