From 2a9b1155df903825ded676fb74d952ba18958e3d Mon Sep 17 00:00:00 2001 From: Keith OHara Date: Sun, 27 Feb 2011 23:15:19 -0800 Subject: [PATCH] Fix segfault from orphaned lines code --- input/regression/markup-lines.ly | 64 +++++++++++++++++++------------- lily/paper-book.cc | 43 +++++++++++---------- 2 files changed, 59 insertions(+), 48 deletions(-) diff --git a/input/regression/markup-lines.ly b/input/regression/markup-lines.ly index 03500ebfd1..82606f037f 100644 --- a/input/regression/markup-lines.ly +++ b/input/regression/markup-lines.ly @@ -1,38 +1,50 @@ -\version "2.12.0" +\version "2.13.54" \header { + tagline = ##f texidoc = "Text that can spread over pages is entered with the -@code{\\markuplines} command." +@code{\\markuplines} command. Widowed and orphaned lines are avoided +at the begininng and end of a @code{\\markuplines} containing more +than one line." } -#(set-default-paper-size "a6") +#(set-default-paper-size "a7") #(define-markup-list-command (paragraph layout props args) (markup-list?) (interpret-markup-list layout props (make-justified-lines-markup-list (cons (make-hspace-markup 2) args)))) - -%% Candide, Voltaire -\markuplines \override-lines #'(baseline-skip . 2.5) { - \paragraph { - Il y avait en Westphalie, dans le château de M. le baron de - Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné - les mœurs les plus douces. Sa physionomie annonçait son âme. - Il avait le jugement assez droit, avec l'esprit le plus simple ; - c'est, je crois, pour cette raison qu'on le nommait Candide. Les - anciens domestiques de la maison soupçonnaient qu'il était fils - de la sœur de monsieur le baron et d'un bon et honnête - gentilhomme du voisinage, que cette demoiselle ne voulut jamais - épouser parce qu'il n'avait pu prouver que soixante et onze - quartiers, et que le reste de son arbre généalogique avait été - perdu par l'injure du temps. +\book { + \markuplines {} % Empty list is handled gracefully + %% Candide, Voltaire + \markuplines \override-lines #'(baseline-skip . 3.0) { + \paragraph { % The final two lines are placed on page 2. + Il y avait en Westphalie, dans le château de M. le baron de + Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné + les mœurs les plus douces. Sa physionomie annonçait son âme. + Il avait le jugement assez droit, avec l'esprit le plus simple ; + c'est, je crois, pour cette raison qu'on le nommait Candide. Les + anciens domestiques de la maison soupçonnaient qu'il était fils + de la sœur de monsieur le baron et d'un bon et honnête + gentilhomme du voisinage, que cette demoiselle ne voulut jamais + épouser parce qu'il n'avait pu prouver que soixante et onze + quartiers, et que le reste de son arbre généalogique avait été + perdu par l'injure du temps. (not orphaned) + } + } + \markuplines \override-lines #'(baseline-skip . 3.9) { + \paragraph { + Monsieur le baron était un des plus puissants seigneurs de la + Westphalie, car son château avait une porte et des fenêtres. Sa + grande salle même était ornée d'une tapisserie. Tous les chiens + de ses basses-cours composaient une meute dans le besoin ; ses + palefreniers étaient ses piqueurs; le vicaire du village était + son grand-aumônier. Ils l'appelaient tous monseigneur, et ils + riaient quand il faisait des contes. + } } - \paragraph { - Monsieur le baron était un des plus puissants seigneurs de la - Westphalie, car son château avait une porte et des fenêtres. Sa - grande salle même était ornée d'une tapisserie. Tous les chiens - de ses basses-cours composaient une meute dans le besoin ; ses - palefreniers étaient ses piqueurs; le vicaire du village était - son grand-aumônier. Ils l'appelaient tous monseigneur, et ils - riaient quand il faisait des contes. + \markuplines { + \paragraph { % A single-line paragraph may be orphaned + Madame la ... (may be orphaned) + } } } diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 7a13120c64..9907e56d95 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -516,31 +516,34 @@ Paper_book::get_system_specs () paper_->self_scm (), page_properties, scm_car (s)); - Prob *ps; - SCM list; - for (list = texts ; scm_is_pair (list) ; list = scm_cdr (list)) + Prob *first = 0; + Prob *last = 0; + for (SCM list = texts; scm_is_pair (list); list = scm_cdr (list)) { SCM t = scm_car (list); // TODO: init props - ps = make_paper_system (SCM_EOL); + Prob *ps = make_paper_system (SCM_EOL); ps->set_property ("page-break-permission", ly_symbol2scm ("allow")); ps->set_property ("page-turn-permission", ly_symbol2scm ("allow")); ps->set_property ("last-markup-line", SCM_BOOL_F); - ps->set_property ("first-markup-line", - list == texts? SCM_BOOL_T : SCM_BOOL_F); + ps->set_property ("first-markup-line", SCM_BOOL_F); paper_system_set_stencil (ps, *unsmob_stencil (t)); SCM footnotes = get_footnotes (unsmob_stencil (t)->expr ()); ps->set_property ("footnotes", footnotes); ps->set_property ("is-title", SCM_BOOL_T); - if (list != texts) - /* For each markup other than the first, place it as closely as - possible to the previous markup and don't allow stretching. */ - ps->set_property ("tight-spacing", SCM_BOOL_T); - + if (list == texts) + first = ps; + else + { + // last line so far, in a multi-line paragraph + last = ps; + //Place closely to previous line, no stretching. + ps->set_property ("tight-spacing", SCM_BOOL_T); + } system_specs = scm_cons (ps->self_scm (), system_specs); ps->unprotect (); @@ -552,17 +555,13 @@ Paper_book::get_system_specs () // FIXME: figure out penalty. //set_system_penalty (ps, scores_[i].header_); } - // We may want to place a check here, for whether the line is too short - if (list == texts) - { - // if there is only one line in the paragraph, - // do not try to avoid orphans - ps->set_property ("last-markup-line", SCM_BOOL_F); - ps->set_property ("first-markup-line", SCM_BOOL_F); - } - else - { - ps->set_property ("last-markup-line", SCM_BOOL_T); + /* Set properties to avoid widowed/orphaned lines. + Single-line markup_lists are excluded, but in future + we may want to add the case of a very short, single line. */ + if (first && last) + { + last->set_property ("last-markup-line", SCM_BOOL_T); + first->set_property ("first-markup-line", SCM_BOOL_T); } } else -- 2.39.2