Jacek Caban : mshtml: Use new end point representation in IHTMLTxtRange:: expand("word") implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 29 15:42:43 CST 2014


Module: wine
Branch: master
Commit: 4ef4ebaac73782b3bd1f2e8ee2f2908859e15b86
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ef4ebaac73782b3bd1f2e8ee2f2908859e15b86

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Dec 29 15:50:03 2014 +0100

mshtml: Use new end point representation in IHTMLTxtRange::expand("word") implementation.

---

 dlls/mshtml/txtrange.c | 133 ++++++++++++++++++++++++++++---------------------
 1 file changed, 75 insertions(+), 58 deletions(-)

diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/txtrange.c
index 8a3ca9a..85d77b2 100644
--- a/dlls/mshtml/txtrange.c
+++ b/dlls/mshtml/txtrange.c
@@ -333,6 +333,13 @@ static void set_start_point(HTMLTxtRange *This, const rangepoint_t *start)
         ERR("failed: %08x\n", nsres);
 }
 
+static void set_end_point(HTMLTxtRange *This, const rangepoint_t *end)
+{
+    nsresult nsres = nsIDOMRange_SetEnd(This->nsrange, end->node, end->off);
+    if(NS_FAILED(nsres))
+        ERR("failed: %08x\n", nsres);
+}
+
 static BOOL is_elem_tag(nsIDOMNode *node, LPCWSTR istag)
 {
     nsIDOMElement *elem;
@@ -956,6 +963,60 @@ static LONG move_by_chars(rangepoint_t *iter, LONG cnt)
     return ret;
 }
 
+static LONG find_prev_space(rangepoint_t *iter, BOOL first_space)
+{
+    rangepoint_t prev;
+    WCHAR c;
+
+    init_rangepoint(&prev, iter->node, iter->off);
+    c = move_prev_char(&prev);
+    if(!c || (first_space && isspaceW(c)))
+        return FALSE;
+
+    do {
+        free_rangepoint(iter);
+        init_rangepoint(iter, prev.node, prev.off);
+        c = move_prev_char(&prev);
+    }while(c && !isspaceW(c));
+
+    free_rangepoint(&prev);
+    return TRUE;
+}
+
+static BOOL find_word_end(rangepoint_t *iter, BOOL is_collapsed)
+{
+    rangepoint_t prev_iter;
+    WCHAR c;
+    BOOL ret = FALSE;
+
+    if(!is_collapsed) {
+        init_rangepoint(&prev_iter, iter->node, iter->off);
+        c = move_prev_char(&prev_iter);
+        free_rangepoint(&prev_iter);
+        if(isspaceW(c))
+            return FALSE;
+    }
+
+    do {
+        init_rangepoint(&prev_iter, iter->node, iter->off);
+        c = move_next_char(iter);
+        if(c == '\n') {
+            free_rangepoint(iter);
+            *iter = prev_iter;
+            return ret;
+        }
+        if(!c) {
+            if(!ret)
+                ret = !rangepoint_cmp(iter, &prev_iter);
+        }else {
+            ret = TRUE;
+        }
+        free_rangepoint(&prev_iter);
+    }while(c && !isspaceW(c));
+
+    return ret;
+}
+
 static WCHAR get_pos_char(const dompos_t *pos)
 {
     switch(pos->type) {
@@ -1273,7 +1334,7 @@ static LONG move_prev_chars(HTMLTxtRange *This, LONG cnt, const dompos_t *pos, B
     return ret;
 }
 
-static LONG find_prev_space(HTMLTxtRange *This, const dompos_t *pos, BOOL first_space, dompos_t *ret)
+static LONG dompos_find_prev_space(HTMLTxtRange *This, const dompos_t *pos, BOOL first_space, dompos_t *ret)
 {
     dompos_t iter, tmp;
     WCHAR c;
@@ -1298,45 +1359,6 @@ static LONG find_prev_space(HTMLTxtRange *This, const dompos_t *pos, BOOL first_
     return TRUE;
 }
 
-static int find_word_end(const dompos_t *pos, dompos_t *ret)
-{
-    dompos_t iter, tmp;
-    int cnt = 1;
-    WCHAR c;
-    c = get_pos_char(pos);
-    if(isspaceW(c)) {
-        *ret = *pos;
-        dompos_addref(ret);
-        return 0;
-    }
-
-    c = next_char(pos, &iter);
-    if(!c) {
-        *ret = iter;
-        return 0;
-    }
-    if(c == '\n') {
-        *ret = *pos;
-        dompos_addref(ret);
-        return 0;
-    }
-
-    while(c && !isspaceW(c)) {
-        tmp = iter;
-        c = next_char(&tmp, &iter);
-        if(c == '\n') {
-            dompos_release(&iter);
-            iter = tmp;
-        }else {
-            cnt++;
-            dompos_release(&tmp);
-        }
-    }
-
-    *ret = iter;
-    return cnt;
-}
-
 static LONG move_next_words(LONG cnt, const dompos_t *pos, dompos_t *new_pos)
 {
     dompos_t iter, tmp;
@@ -1374,7 +1396,7 @@ static LONG move_prev_words(HTMLTxtRange *This, LONG cnt, const dompos_t *pos, d
     dompos_addref(&iter);
 
     while(ret < cnt) {
-        if(!find_prev_space(This, &iter, FALSE, &tmp))
+        if(!dompos_find_prev_space(This, &iter, FALSE, &tmp))
             break;
 
         dompos_release(&iter);
@@ -1712,31 +1734,26 @@ static HRESULT WINAPI HTMLTxtRange_expand(IHTMLTxtRange *iface, BSTR Unit, VARIA
 
     switch(unit) {
     case RU_WORD: {
-        dompos_t end_pos, start_pos, new_start_pos, new_end_pos;
-        cpp_bool collapsed;
+        rangepoint_t end, start;
+        cpp_bool is_collapsed;
 
-        nsIDOMRange_GetCollapsed(This->nsrange, &collapsed);
+        get_start_point(This, &start);
+        get_end_point(This, &end);
 
-        get_cur_pos(This, TRUE, &start_pos);
-        get_cur_pos(This, FALSE, &end_pos);
+        nsIDOMRange_GetCollapsed(This->nsrange, &is_collapsed);
 
-        if(find_word_end(&end_pos, &new_end_pos) || collapsed) {
-            set_range_pos(This, FALSE, &new_end_pos);
+        if(find_word_end(&end, is_collapsed)) {
+            set_end_point(This, &end);
             *Success = VARIANT_TRUE;
         }
 
-        if(start_pos.type && (get_pos_char(&end_pos) || !dompos_cmp(&new_end_pos, &end_pos))) {
-            if(find_prev_space(This, &start_pos, TRUE, &new_start_pos)) {
-                set_range_pos(This, TRUE, &new_start_pos);
-                *Success = VARIANT_TRUE;
-            }
-            dompos_release(&new_start_pos);
+        if(find_prev_space(&start, TRUE)) {
+            set_start_point(This, &start);
+            *Success = VARIANT_TRUE;
         }
 
-        dompos_release(&new_end_pos);
-        dompos_release(&end_pos);
-        dompos_release(&start_pos);
-
+        free_rangepoint(&end);
+        free_rangepoint(&start);
         break;
     }
 




More information about the wine-cvs mailing list