Annotation of rpl/modules/sets/complement.rplc, revision 1.1
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);
! 66: (*result).objet = allocate(size(set_t));
! 67:
! 68: (*((set_t *) (*result).objet)).size = k;
! 69: (*((set_t *) (*result).objet)).values = vector;
! 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>