File:
[local] /
rpl /
modules /
sets /
complement.rplc
Revision
1.2:
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(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: objectOf(result) = allocate(size(set_t));
67:
68: objectContainer(set_t, result)->size = k;
69: objectContainer(set_t, result)->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>