#include "spanner.hh"
#include "warn.hh"
-/*
- copy ALIST leaving out SYMBOL. Copying stops at ALIST_END
-*/
-SCM
-evict_from_alist (SCM symbol,
- SCM alist,
- SCM alist_end)
-{
- SCM new_alist = SCM_EOL;
- SCM *tail = &new_alist;
-
- while (alist != alist_end)
- {
- if (ly_is_equal (scm_caar (alist), symbol))
- {
- alist = scm_cdr (alist);
- break;
- }
-
- *tail = scm_cons (scm_car (alist), SCM_EOL);
- tail = SCM_CDRLOC (*tail);
- alist = scm_cdr (alist);
- }
-
- *tail = alist;
- return new_alist;
-}
void
general_pushpop_property (Context *context,
return;
}
- SCM symbol = scm_car (grob_property_path);
SCM target_alist = scm_car (current_context_val);
+ SCM parent_alist = scm_cdr (current_context_val);
+
+ SCM symbol = scm_car (grob_property_path);
if (scm_is_pair (scm_cdr (grob_property_path)))
{
new_value = nested_property_alist (ly_assoc_get (symbol, target_alist,
}
if (scm_is_pair (target_alist)
- && scm_caar (target_alist) == symbol)
+ && scm_caar (target_alist) == symbol
+ && target_alist != parent_alist)
target_alist = scm_cdr (target_alist);
target_alist = scm_acons (symbol, new_value, target_alist);
}
}
-
+void
+execute_revert_property (Context *context,
+ SCM context_property,
+ SCM grob_property_path);
+
void
execute_general_pushpop_property (Context *context,
SCM context_property,
)
{
if (new_value != SCM_UNDEFINED)
- {
- execute_override_property (context, context_property,
- grob_property_path,
- new_value);
-
- return;
- }
+ execute_override_property (context, context_property,
+ grob_property_path,
+ new_value);
+ else
+ execute_revert_property (context, context_property,
+ grob_property_path);
+}
+void
+execute_revert_property (Context *context,
+ SCM context_property,
+ SCM grob_property_path)
+{
/*
revert.
- */
+ */
SCM current_context_val = SCM_EOL;
if (context->where_defined (context_property, ¤t_context_val) == context)
{
- SCM current_value = scm_car (current_context_val);
+ SCM current_alist = scm_car (current_context_val);
SCM daddy = scm_cdr (current_context_val);
if (!scm_is_pair (grob_property_path)
}
SCM symbol = scm_car (grob_property_path);
- SCM new_alist = evict_from_alist (symbol, current_value, daddy);
- if (new_alist == daddy)
- context->unset_property (context_property);
+ if (scm_is_pair (scm_cdr (grob_property_path)))
+ {
+ SCM current_sub_alist = ly_assoc_get (symbol, current_alist, SCM_EOL);
+ SCM new_val = nested_property_revert_alist (current_sub_alist, scm_cdr (grob_property_path));
+
+ if (scm_is_pair (current_alist)
+ && scm_caar (current_alist) == symbol
+ && current_alist != daddy)
+ current_alist = scm_cdr (current_alist);
+
+ current_alist = scm_acons (symbol, new_val, current_alist);
+ scm_set_car_x (current_context_val, current_alist);
+ }
else
- context->set_property (context_property, scm_cons (new_alist, daddy));
+ {
+ SCM new_alist = evict_from_alist (symbol, current_alist, daddy);
+
+ if (new_alist == daddy)
+ context->unset_property (context_property);
+ else
+ context->set_property (context_property, scm_cons (new_alist, daddy));
+ }
}
}
scm_list_4 (unpure, args, scm_from_int (start), scm_from_int (end)));
}
-
-/*
- PROP_PATH should be big-to-small ordering
- */
-SCM
-nested_property_alist (SCM alist, SCM prop_path, SCM value)
-{
- SCM new_value = SCM_BOOL_F;
- if (scm_is_pair (scm_cdr (prop_path)))
- {
- SCM sub_alist = ly_assoc_get (scm_car (prop_path), alist, SCM_EOL);
- new_value = nested_property_alist (sub_alist, scm_cdr (prop_path), value);
- }
- else
- {
- new_value = value;
- }
-
- return scm_acons (scm_car (prop_path), new_value, alist);
-}
-
-
-void
-set_nested_property (Grob *me, SCM big_to_small, SCM value)
-{
- SCM alist = me->get_property (scm_car (big_to_small));
-
- alist = nested_property_alist (alist, scm_cdr (big_to_small), value);
-
- me->set_property (scm_car (big_to_small),
- alist);
-}
-
--- /dev/null
+#include "context.hh"
+#include "grob.hh"
+
+SCM
+evict_from_alist (SCM symbol,
+ SCM alist,
+ SCM alist_end)
+{
+ SCM new_alist = SCM_EOL;
+ SCM *tail = &new_alist;
+
+ while (alist != alist_end)
+ {
+ if (ly_is_equal (scm_caar (alist), symbol))
+ {
+ alist = scm_cdr (alist);
+ break;
+ }
+
+ *tail = scm_cons (scm_car (alist), SCM_EOL);
+ tail = SCM_CDRLOC (*tail);
+ alist = scm_cdr (alist);
+ }
+
+ *tail = alist;
+ return new_alist;
+}
+
+/*
+ PROP_PATH should be big-to-small ordering
+ */
+SCM
+nested_property_alist (SCM alist, SCM prop_path, SCM value)
+{
+ SCM new_value = SCM_BOOL_F;
+ if (scm_is_pair (scm_cdr (prop_path)))
+ {
+ SCM sub_alist = ly_assoc_get (scm_car (prop_path), alist, SCM_EOL);
+ new_value = nested_property_alist (sub_alist, scm_cdr (prop_path), value);
+ }
+ else
+ {
+ new_value = value;
+ }
+
+ return scm_acons (scm_car (prop_path), new_value, alist);
+}
+
+SCM
+nested_property_revert_alist (SCM alist, SCM prop_path)
+{
+ SCM new_sub_alist = SCM_EOL;
+ SCM sym = scm_car (prop_path);
+ if (scm_is_pair (scm_cdr (prop_path)))
+ {
+ SCM sub_alist = ly_assoc_get (sym, alist, SCM_EOL);
+ new_sub_alist = nested_property_revert_alist (sub_alist, scm_cdr (prop_path));
+ }
+ else
+ {
+ new_sub_alist = evict_from_alist (sym, alist, SCM_EOL);
+ }
+
+ return scm_acons (sym, new_sub_alist, alist);
+}
+
+
+void
+set_nested_property (Grob *me, SCM big_to_small, SCM value)
+{
+ SCM alist = me->get_property (scm_car (big_to_small));
+
+ alist = nested_property_alist (alist, scm_cdr (big_to_small), value);
+
+ me->set_property (scm_car (big_to_small),
+ alist);
+}
+