From: Richard M. Stallman Date: Tue, 17 Mar 1998 07:25:54 +0000 (+0000) Subject: (Fchar_after, Fchar_before): Properly check arg type X-Git-Tag: emacs-20.3~1874 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=85cac557cd0457eb6029bda3c2e90736ef04b24e;p=emacs.git (Fchar_after, Fchar_before): Properly check arg type and whether in range, for all cases. (Fsave_excursion): Doc fix. --- diff --git a/src/editfns.c b/src/editfns.c index 5ae0c28be6d..587e751efc7 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -380,7 +380,12 @@ DEFUN ("save-excursion", Fsave_excursion, Ssave_excursion, 0, UNEVALLED, 0, 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 @@ If `enable-multibyte-characters' is nil or POS is not at character boundary,\n\ 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 @@ is returned as a character.") 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)); }