From: Dmitry Antipov Date: Thu, 29 Aug 2013 16:36:54 +0000 (+0400) Subject: * intervals.c (set_point_from_marker): New function. X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~1686^2~54 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=032f74518a71a7fe0afd2e7d0eee11bfb7ae90d9;p=emacs.git * intervals.c (set_point_from_marker): New function. * editfns.c (Fgoto_char): * process.c (Finternal_default_process_filter): * window.c (select_window_1): Use it. * buffer.h (set_point_from_marker): Add prototype. --- diff --git a/src/ChangeLog b/src/ChangeLog index 0a24427f683..c605c5ec4d3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2013-08-29 Dmitry Antipov + + * intervals.c (set_point_from_marker): New function. + * editfns.c (Fgoto_char): + * process.c (Finternal_default_process_filter): + * window.c (select_window_1): Use it. + * buffer.h (set_point_from_marker): Add prototype. + 2013-08-29 Eli Zaretskii * w32.c (term_winsock): Call release_listen_threads before calling diff --git a/src/buffer.h b/src/buffer.h index bedb7890939..169a15c7d0f 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -249,6 +249,7 @@ extern void temp_set_point (struct buffer *, ptrdiff_t); extern void set_point_both (ptrdiff_t, ptrdiff_t); extern void temp_set_point_both (struct buffer *, ptrdiff_t, ptrdiff_t); +extern void set_point_from_marker (Lisp_Object); extern void enlarge_buffer_text (struct buffer *, ptrdiff_t); diff --git a/src/editfns.c b/src/editfns.c index 9e36655f3d3..84a5c8395fc 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -233,26 +233,12 @@ Beginning of buffer is position (point-min), end is (point-max). The return value is POSITION. */) (register Lisp_Object position) { - ptrdiff_t pos; - - if (MARKERP (position) - && current_buffer == XMARKER (position)->buffer) - { - pos = marker_position (position); - if (pos < BEGV) - SET_PT_BOTH (BEGV, BEGV_BYTE); - else if (pos > ZV) - SET_PT_BOTH (ZV, ZV_BYTE); - else - SET_PT_BOTH (pos, marker_byte_position (position)); - - return position; - } - - CHECK_NUMBER_COERCE_MARKER (position); - - pos = clip_to_bounds (BEGV, XINT (position), ZV); - SET_PT (pos); + if (MARKERP (position)) + set_point_from_marker (position); + else if (INTEGERP (position)) + SET_PT (clip_to_bounds (BEGV, XINT (position), ZV)); + else + wrong_type_argument (Qinteger_or_marker_p, position); return position; } diff --git a/src/intervals.c b/src/intervals.c index f2ddcd01507..671b2a3d527 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -1821,6 +1821,18 @@ set_point (ptrdiff_t charpos) set_point_both (charpos, buf_charpos_to_bytepos (current_buffer, charpos)); } +/* Set PT from MARKER's clipped position. */ + +void +set_point_from_marker (Lisp_Object marker) +{ + if (XMARKER (marker)->buffer != current_buffer) + error ("Marker points into wrong buffer"); + set_point_both + (clip_to_bounds (BEGV, marker_position (marker), ZV), + clip_to_bounds (BEGV_BYTE, marker_byte_position (marker), ZV_BYTE)); +} + /* If there's an invisible character at position POS + TEST_OFFS in the current buffer, and the invisible property has a `stickiness' such that inserting a character at position POS would inherit the property it, diff --git a/src/process.c b/src/process.c index b52622ec1b6..20f84990d6f 100644 --- a/src/process.c +++ b/src/process.c @@ -5178,15 +5178,10 @@ DEFUN ("internal-default-process-filter", Finternal_default_process_filter, bset_read_only (current_buffer, Qnil); - /* Insert new output into buffer - at the current end-of-output marker, - thus preserving logical ordering of input and output. */ + /* Insert new output into buffer at the current end-of-output + marker, thus preserving logical ordering of input and output. */ if (XMARKER (p->mark)->buffer) - SET_PT_BOTH (clip_to_bounds (BEGV, - marker_position (p->mark), ZV), - clip_to_bounds (BEGV_BYTE, - marker_byte_position (p->mark), - ZV_BYTE)); + set_point_from_marker (p->mark); else SET_PT_BOTH (ZV, ZV_BYTE); before = PT; diff --git a/src/window.c b/src/window.c index e40572bf13d..d60ee06077f 100644 --- a/src/window.c +++ b/src/window.c @@ -549,15 +549,7 @@ select_window_1 (Lisp_Object window, bool inhibit_point_swap) than one window. It also matters when redisplay_window has altered point after scrolling, because it makes the change only in the window. */ - { - register ptrdiff_t new_point = marker_position (XWINDOW (window)->pointm); - if (new_point < BEGV) - SET_PT (BEGV); - else if (new_point > ZV) - SET_PT (ZV); - else - SET_PT (new_point); - } + set_point_from_marker (XWINDOW (window)->pointm); } DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0,