/* 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 "../timestamp.h" #include "../newstr.h" #include "../strings.h" #include "../lists.h" #include "../variable.h" #include "../compile.h" LIST* get_grist(char* f) { char* end = strchr(f, '>'); string s[1]; LIST* result; string_new(s); string_append_range(s, f, end+1); result = list_new(0, newstr(s->value)); string_free(s); return result; } /* rule create ( raw-properties * ) { raw-properties = [ sequence.unique [ sequence.insertion-sort $(raw-properties) ] ] ; local key = $(raw-properties:J=-:E=) ; if ! $(.ps.$(key)) { .ps.$(key) = [ new property-set $(raw-properties) ] ; } return $(.ps.$(key)) ; } */ LIST *property_set_create( PARSE *parse, FRAME *frame ) { LIST* properties = lol_get( frame->args, 0 ); LIST* sorted = 0; #if 0 LIST* order_sensitive = 0; #endif LIST* unique; LIST* tmp; LIST* val; string var[1]; #if 0 /* Sort all properties which are not order sensitive */ for(tmp = properties; tmp; tmp = tmp->next) { LIST* g = get_grist(tmp->string); LIST* att = call_rule("feature.attributes", frame, g, 0); if (list_in(att, "order-sensitive")) { order_sensitive = list_new( order_sensitive, tmp->string); } else { sorted = list_new( sorted, tmp->string); } list_free(att); } sorted = list_sort(sorted); sorted = list_append(sorted, order_sensitive); unique = list_unique(sorted); #endif sorted = list_sort(properties); unique = list_unique(sorted); string_new(var); string_append(var, ".ps."); for(tmp = unique; tmp; tmp = tmp->next) { string_append(var, tmp->string); string_push_back(var, '-'); } val = var_get(var->value); if (val == 0) { val = call_rule("new", frame, list_append(list_new(0, "property-set"), unique), 0); var_set(newstr(var->value), list_copy(0, val), VAR_SET); } else { val = list_copy(0, val); } string_free(var); /* The 'unique' variable is freed in 'call_rule'. */ list_free(sorted); return val; } void init_property_set() { { char* args[] = { "raw-properties", "*", 0 }; declare_native_rule("property-set", "create", args, property_set_create, 1); } }