version 1.1, 2017/06/29 12:32:57
|
version 1.3, 2017/07/03 11:47:05
|
Line 2
|
Line 2
|
#include "sets.h" |
#include "sets.h" |
|
|
declareExternalFunction(union) |
declareExternalFunction(union) |
|
declareObject(object1); |
|
declareObject(object2); |
|
declareObject(result); |
|
|
|
integer8 i; |
|
integer8 j; |
|
integer8 k; |
|
integer8 target(vector); |
|
|
|
HEADER |
|
declareHelpString("Union"); |
|
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 |
|
+ (*((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 *) (*object1).objet)).values[i] lt |
|
(*((set_t *) (*object2).objet)).values[j]) then |
|
vector[k] = (*((set_t *) (*object1).objet)).values[i]; |
|
postIncr(i); |
|
elseIf ((*((set_t *) (*object2).objet)).values[j] lt |
|
(*((set_t *) (*object1).objet)).values[i]) then |
|
vector[k] = (*((set_t *) (*object2).objet)).values[j]; |
|
postIncr(j); |
|
orElse |
|
vector[k] = (*((set_t *) (*object2).objet)).values[j]; |
|
postIncr(i); |
|
postIncr(j); |
|
endIf |
|
|
|
postIncr(k); |
|
endWhile |
|
|
|
repeatWhile(i lt (*((set_t *) (*object1).objet)).size) |
|
vector[k] = (*((set_t *) (*object1).objet)).values[i]; |
|
postIncr(i); |
|
postIncr(k); |
|
endWhile |
|
|
|
repeatWhile(j lt (*((set_t *) (*object2).objet)).size) |
|
vector[k] = (*((set_t *) (*object2).objet)).values[j]; |
|
postIncr(j); |
|
postIncr(k); |
|
endWhile |
|
|
|
vector = reallocate(vector, k * size(integer8)); |
|
|
|
createExternalObject(result, ISET); |
|
(*result).objet = allocate(size(set_t)); |
|
|
|
(*((set_t *) (*result).objet)).size = k; |
|
(*((set_t *) (*result).objet)).values = vector; |
|
|
|
freeObject(object1); |
|
freeObject(object2); |
|
|
|
pushOnStack(result); |
|
END |
|
endExternalFunction |
|
|
|
declareExternalFunction(intersection) |
|
declareObject(object1); |
|
declareObject(object2); |
|
declareObject(result); |
|
|
|
integer8 i; |
|
integer8 j; |
|
integer8 k; |
|
integer8 target(vector); |
|
|
HEADER |
HEADER |
declareHelpString("Union"); |
declareHelpString("Union"); |
numberOfArguments(2); |
numberOfArguments(2); |
FUNCTION |
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); |
|
(*result).objet = allocate(size(set_t)); |
|
|
|
(*((set_t *) (*result).objet)).size = k; |
|
(*((set_t *) (*result).objet)).values = vector; |
|
|
|
freeObject(object1); |
|
freeObject(object2); |
|
|
|
pushOnStack(result); |
END |
END |
endExternalFunction |
endExternalFunction |
|
|
|
// vim: ts=4 |