#include "src/rplexternals.h" #include "sets.h" declareExternalFunction(complement) declareObject(object1); declareObject(object2); declareObject(result); integer8 i; integer8 j; integer8 k; integer8 target(vector); HEADER declareHelpString("Complement"); 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 *) (*object2).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 *) (*object2).objet)).values[j] ne (*((set_t *) (*object1).objet)).values[i]) then vector[k] = (*((set_t *) (*object2).objet)).values[j]; postIncr(j); postIncr(k); orElse postIncr(i); postIncr(j); endIf endWhile repeatWhile(j lt (*((set_t *) (*object2).objet)).size) vector[k] = (*((set_t *) (*object2).objet)).values[j]; postIncr(j); postIncr(k); endWhile if (i ne (*((set_t *) (*object1).objet)).size) then deallocate(vector); freeObject(object1); freeObject(object2); executionError("Cannot compute complement"); returnOnError(); endIf 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