From 0f50a90605daecbe4ab93c0b22352008d30fb8c2 Mon Sep 17 00:00:00 2001 From: buliabyak Date: Sun, 5 Feb 2006 21:30:12 +0000 Subject: [PATCH] fix recurstion gaffe, comment --- src/text-editing.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/text-editing.cpp b/src/text-editing.cpp index d5a53fc49..f0cb4bd9d 100644 --- a/src/text-editing.cpp +++ b/src/text-editing.cpp @@ -183,23 +183,36 @@ unsigned sp_text_get_length(SPObject const *item) } /** Recursively gets the length of all the SPStrings at or below the given -\a item. Also adds 1 for each line break encountered. */ +\a item, before and not including \a upto. Also adds 1 for each line break encountered. */ unsigned sp_text_get_length_upto(SPObject const *item, SPObject const *upto) { unsigned length = 0; - if (SP_IS_STRING(item)) return SP_STRING(item)->string.length(); - if (is_line_break_object(item)) length++; + if (SP_IS_STRING(item)) { + return SP_STRING(item)->string.length(); + } + if (is_line_break_object(item) && !SP_IS_TEXT(item)) { + if (item != SP_OBJECT_PARENT(item)->firstChild()) { + // add 1 for each newline + length++; + } + } for (SPObject const *child = item->firstChild() ; child ; child = SP_OBJECT_NEXT(child)) { - if (child == upto) + if (upto && child == upto) { + // hit upto, return immediately return length; - if (SP_IS_STRING(child)) length += SP_STRING(child)->string.length(); + } + if (SP_IS_STRING(child)) { + length += SP_STRING(child)->string.length(); + } else { - if (child->isAncestorOf(upto)) { - length += sp_text_get_length(child); + if (upto && child->isAncestorOf(upto)) { + // upto is below us, recurse and break loop + length += sp_text_get_length_upto(child, upto); return length; } else { - length += sp_text_get_length(child); + // recurse and go to the next sibling + length += sp_text_get_length_upto(child, upto); } } } -- 2.30.2