summaryrefslogtreecommitdiff
path: root/tools/build/v2/engine/modules/set.c
blob: 77a314d57df377d179a55ceb3ba9e26f1971de70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* Copyright Vladimir Prus 2003. Distributed under the Boost */
/* Software License, Version 1.0. (See accompanying */
/* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */

#include "../native.h"
#include "../object.h"

/*
    local result = ;
    local element ;
    for element in $(B)
    {
        if ! ( $(element) in $(A) )
        {
            result += $(element) ;
        }
    }
    return $(result) ;
*/
LIST *set_difference( FRAME *frame, int flags )
{

    LIST* b = lol_get( frame->args, 0 );    
    LIST* a = lol_get( frame->args, 1 );    

    LIST* result = L0;
    LISTITER iter = list_begin( b ), end = list_end( b );
    for( ; iter != end; iter = list_next( iter ) )
    {
        if (!list_in(a, list_item(iter)))
            result = list_push_back(result, object_copy(list_item(iter)));
    }
    return result;
}

void init_set()
{
    {
        const char* args[] = { "B", "*", ":", "A", "*", 0 };
        declare_native_rule("set", "difference", args, set_difference, 1);
    }

}