diff src/editfns.c @ 21200:ea520c42a342

(Fchar_after, Fchar_before): Properly check arg type and whether in range, for all cases. (Fsave_excursion): Doc fix.
author Richard M. Stallman <rms@gnu.org>
date Tue, 17 Mar 1998 07:25:54 +0000
parents 90bdbe2754c8
children ef954087e7b9
line wrap: on
line diff
--- a/src/editfns.c	Tue Mar 17 06:49:26 1998 +0000
+++ b/src/editfns.c	Tue Mar 17 07:25:54 1998 +0000
@@ -380,7 +380,12 @@
 Executes BODY just like `progn'.\n\
 The values of point, mark and the current buffer are restored\n\
 even in case of abnormal exit (throw or error).\n\
-The state of activation of the mark is also restored.")
+The state of activation of the mark is also restored.\n\
+\n\
+This construct does not save `deactivate-mark', and therefore\n\
+functions that change the buffer will still cause deactivation\n\
+of the mark at the end of the command.  To prevent that, bind\n\
+`deactivate-mark' with `let'.")
   (args)
      Lisp_Object args;
 {
@@ -555,20 +560,22 @@
   register Lisp_Object val;
 
   if (NILP (pos))
-    return make_number (FETCH_CHAR (PT_BYTE));
-
-  if (MARKERP (pos))
-    pos_byte = marker_byte_position (pos);
+    pos_byte = PT_BYTE;
+  else if (MARKERP (pos))
+    {
+      pos_byte = marker_byte_position (pos);
+      if (pos_byte < BEGV_BYTE || pos_byte >= ZV_BYTE)
+	return Qnil;
+    }
   else
     {
       CHECK_NUMBER_COERCE_MARKER (pos, 0);
+      if (pos < BEGV || pos >= ZV)
+	return Qnil;
       
       pos_byte = CHAR_TO_BYTE (XINT (pos));
     }
 
-  if (pos_byte < BEGV_BYTE || pos_byte >= ZV_BYTE)
-    return Qnil;
-
   return make_number (FETCH_CHAR (pos_byte));
 }
 
@@ -588,13 +595,19 @@
   if (NILP (pos))
     pos_byte = PT_BYTE;
   else if (MARKERP (pos))
-    pos_byte = marker_byte_position (pos);
-  else if (pos <= BEGV || pos > ZV)
-    return Qnil;
+    {
+      pos_byte = marker_byte_position (pos);
+
+      if (pos_byte <= BEGV_BYTE || pos_byte > ZV_BYTE)
+	return Qnil;
+    }
   else
     {
       CHECK_NUMBER_COERCE_MARKER (pos, 0);
 
+      if (pos <= BEGV || pos > ZV)
+	return Qnil;
+
       pos_byte = CHAR_TO_BYTE (XINT (pos));
     }