File:
[local] /
rpl /
modules /
sets /
union.rplc
Revision
1.5:
download - view:
text,
annotated -
select for diffs -
revision graph
Mon Jul 31 08:59:37 2017 UTC (7 years, 9 months ago) by
bertrand
Branches:
MAIN
CVS tags:
rpl-4_1_35,
rpl-4_1_34,
rpl-4_1_33,
rpl-4_1_32,
rpl-4_1_31,
rpl-4_1_30,
rpl-4_1_29,
rpl-4_1_28,
rpl-4_1_27,
HEAD
Correction de L->S
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: objectOf(result) = allocate(size(set_t));
71:
72: objectContainer(set_t, result)->size = k;
73: objectContainer(set_t, result)->values = vector;
74:
75: freeObject(object1);
76: freeObject(object2);
77:
78: pushOnStack(result);
79: END
80: endExternalFunction
81:
82: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>