------------------------------------------------------------
revno: 114069
committer: Dmitry Antipov <dmantipov@yandex.ru>
branch nick: trunk
timestamp: Thu 2013-08-29 20:36:54 +0400
message:
  * 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:
=== modified file 'src/ChangeLog'
--- src/ChangeLog	2013-08-29 15:32:04 +0000
+++ src/ChangeLog	2013-08-29 16:36:54 +0000
@@ -1,3 +1,11 @@
+2013-08-29  Dmitry Antipov  <dmantipov@yandex.ru>
+
+	* 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  <eliz@gnu.org>
 
 	* w32.c (term_winsock): Call release_listen_threads before calling

=== modified file 'src/buffer.h'
--- src/buffer.h	2013-08-27 18:47:55 +0000
+++ src/buffer.h	2013-08-29 16:36:54 +0000
@@ -249,6 +249,7 @@
 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);
 
 

=== modified file 'src/editfns.c'
--- src/editfns.c	2013-08-27 18:47:55 +0000
+++ src/editfns.c	2013-08-29 16:36:54 +0000
@@ -233,26 +233,12 @@
 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;
 }
 

=== modified file 'src/intervals.c'
--- src/intervals.c	2013-06-30 15:14:45 +0000
+++ src/intervals.c	2013-08-29 16:36:54 +0000
@@ -1821,6 +1821,18 @@
   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,

=== modified file 'src/process.c'
--- src/process.c	2013-08-27 19:36:28 +0000
+++ src/process.c	2013-08-29 16:36:54 +0000
@@ -5178,15 +5178,10 @@
 
       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;

=== modified file 'src/window.c'
--- src/window.c	2013-08-27 03:52:21 +0000
+++ src/window.c	2013-08-29 16:36:54 +0000
@@ -549,15 +549,7 @@
      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,
