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>