From f1a2099d6710378ef1c02a617016f30f7d1d75f4 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 4 Jan 2007 20:26:08 +0100 Subject: [PATCH] Don't use SCM_UNSPECIFIED as a magic return value for callbacks. --- lily/beam-concave.cc | 2 +- lily/include/tie.hh | 8 ++++---- lily/melody-spanner.cc | 14 +++++++++----- lily/semi-tie-column.cc | 6 ++++-- lily/semi-tie.cc | 4 ++-- lily/tie-column.cc | 8 +++++--- lily/tie.cc | 39 +++++++++++++++++++++------------------ 7 files changed, 46 insertions(+), 35 deletions(-) diff --git a/lily/beam-concave.cc b/lily/beam-concave.cc index a37005c17c..2b88e0807a 100644 --- a/lily/beam-concave.cc +++ b/lily/beam-concave.cc @@ -106,7 +106,7 @@ Beam::calc_concaveness (SCM smob) } if (stems.size () <= 2) - return SCM_UNSPECIFIED; + return scm_from_int (0); vector close_positions; vector far_positions; diff --git a/lily/include/tie.hh b/lily/include/tie.hh index 35d3d9596c..b68d73d24b 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -25,10 +25,10 @@ public: static int get_column_rank (Grob *, Direction); static int get_position (Grob *); static Direction get_default_dir (Grob *); - static void set_control_points (Grob *, Grob *, - Tie_configuration const&, - Tie_details const&); - static void set_default_control_points (Grob *); + static SCM get_control_points (Grob *, Grob *, + Tie_configuration const&, + Tie_details const&); + static SCM get_default_control_points (Grob *); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); diff --git a/lily/melody-spanner.cc b/lily/melody-spanner.cc index d4901f2c9b..103a5c6427 100644 --- a/lily/melody-spanner.cc +++ b/lily/melody-spanner.cc @@ -27,7 +27,7 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) Grob *stem = unsmob_grob (smob); Grob *me = unsmob_grob (stem->get_object ("melody-spanner")); if (!me || !me->is_live ()) - return SCM_UNSPECIFIED; + return scm_from_int (DOWN); extract_grob_set (me, "stems", stems); @@ -41,6 +41,7 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) && !dirs[next_nonneutral]) next_nonneutral++; + SCM retval = SCM_EOL; while (last_nonneutral == VPOS || last_nonneutral < dirs.size () - 1) { Direction d1 = CENTER; @@ -61,8 +62,12 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) total = to_dir (me->get_property ("neutral-direction")); for (vsize i = last_nonneutral + 1; i < next_nonneutral; i++) - stems[i]->set_property ("neutral-direction", scm_from_int (total)); - + { + if (stems[i] == stem) + retval = scm_from_int (total); + else + stems[i]->set_property ("neutral-direction", scm_from_int (total)); + } last_nonneutral = next_nonneutral; while (last_nonneutral < dirs.size () @@ -76,8 +81,7 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) next_nonneutral++; } - me->suicide (); - return SCM_UNSPECIFIED; + return retval; } void diff --git a/lily/semi-tie-column.cc b/lily/semi-tie-column.cc index 7a02ac578b..7b3ff58f89 100644 --- a/lily/semi-tie-column.cc +++ b/lily/semi-tie-column.cc @@ -58,8 +58,10 @@ Semi_tie_column::calc_positioning_done (SCM smob) Ties_configuration base = problem.generate_optimal_chord_configuration (); for (vsize i = 0; i < lv_ties.size(); i++) { - Tie::set_control_points (lv_ties[i], problem.common_x_refpoint (), base[i], - problem.details_); + SCM cp = Tie::get_control_points (lv_ties[i], problem.common_x_refpoint (), base[i], + problem.details_); + + lv_ties[i]->set_property ("control-points", cp); set_grob_direction (lv_ties[i], base[i].dir_); } diff --git a/lily/semi-tie.cc b/lily/semi-tie.cc index 77b266e6c4..96d4a07219 100644 --- a/lily/semi-tie.cc +++ b/lily/semi-tie.cc @@ -43,8 +43,8 @@ Semi_tie::calc_control_points (SCM smob) programming_error ("lv tie without Semi_tie_column. Killing lv tie."); me->suicide (); } - - return SCM_UNSPECIFIED; + + return me->get_property_data ("control-points"); } int diff --git a/lily/tie-column.cc b/lily/tie-column.cc index 39c51fefc3..2121d318ce 100644 --- a/lily/tie-column.cc +++ b/lily/tie-column.cc @@ -100,9 +100,11 @@ Tie_column::calc_positioning_done (SCM smob) for (vsize i = 0; i < base.size(); i++) { - Tie::set_control_points (ties[i], problem.common_x_refpoint (), - base[i], - problem.details_); + SCM cp = Tie::get_control_points (ties[i], problem.common_x_refpoint (), + base[i], + problem.details_); + + ties[i]->set_property ("control-points", cp); set_grob_direction (ties[i], base[i].dir_); diff --git a/lily/tie.cc b/lily/tie.cc index 50519bc4f5..1e94638f39 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -152,16 +152,16 @@ Tie::calc_direction (SCM smob) { /* trigger positioning. */ (void) yparent->get_property ("positioning-done"); + + return me->get_property_data ("direction"); } else - set_grob_direction (me, Tie::get_default_dir (me)); - - return SCM_UNSPECIFIED; + return scm_from_int (Tie::get_default_dir (me)); } -void -Tie::set_default_control_points (Grob *me_grob) +SCM +Tie::get_default_control_points (Grob *me_grob) { Spanner *me = dynamic_cast (me_grob); Grob *common = me; @@ -174,17 +174,18 @@ Tie::set_default_control_points (Grob *me_grob) spec.has_manual_dir_ = true; spec.manual_dir_ = get_grob_direction (me); - if (me->is_live ()) - { - Tie_configuration conf - = problem.find_optimal_tie_configuration (spec); + if (!me->is_live ()) + return SCM_EOL; + + Tie_configuration conf + = problem.find_optimal_tie_configuration (spec); - set_control_points (me, problem.common_x_refpoint (), - conf, problem.details_); - } + return get_control_points (me, problem.common_x_refpoint (), + conf, problem.details_); } -void -Tie::set_control_points (Grob *me, + +SCM +Tie::get_control_points (Grob *me, Grob *common, Tie_configuration const &conf, Tie_details const &details @@ -200,9 +201,10 @@ Tie::set_control_points (Grob *me, programming_error ("Insane offset"); controls = scm_cons (ly_offset2scm (b.control_[i]), controls); } - me->set_property ("control-points", controls); + return controls; } + MAKE_SCHEME_CALLBACK(Tie, calc_control_points, 1); SCM Tie::calc_control_points (SCM smob) @@ -222,12 +224,13 @@ Tie::calc_control_points (SCM smob) (void) yparent->get_property ("positioning-done"); } - if (!scm_is_pair (me->get_property_data ("control-points"))) + SCM cp = me->get_property_data ("control-points"); + if (!scm_is_pair (cp)) { - set_default_control_points (me); + cp = get_default_control_points (me); } - return SCM_UNSPECIFIED; + return cp; } /* -- 2.39.2