1: #include "src/rplexternals.h"
2: #include "sets.h"
3:
4: declareExternalFunction(union)
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:
92: HEADER
93: declareHelpString("Union");
94: numberOfArguments(2);
95: FUNCTION
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);
142: END
143: endExternalFunction
144:
145: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>