summaryrefslogtreecommitdiff
path: root/tools/build/src/engine/modules/set.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/build/src/engine/modules/set.c')
-rw-r--r--tools/build/src/engine/modules/set.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/tools/build/src/engine/modules/set.c b/tools/build/src/engine/modules/set.c
new file mode 100644
index 0000000000..77a314d57d
--- /dev/null
+++ b/tools/build/src/engine/modules/set.c
@@ -0,0 +1,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);
+ }
+
+}