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 (6 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>